1.1 封装

在Java中:属性私有化,只能通过被授权的方法才能对数据进行操作

  • Scala中的public属性,底层实际为private,并通过get方法 ( obj.field ) 和 set方法( obj.field=value )对其进行操作——在Scala中并不推荐将属性设为private,再给它设置public的set和get方法的做法 ```scala object Test07_Demo { def main(args: Array[String]): Unit = {
    1. var person = new Person()
    2. person.setName("zs")
    3. person.printDec()
    } }

class Person{ private var name:String = _

def setName(name:String): Unit ={ this.name = name }

def printDec(): Unit ={ println(s”name = $name , age = $age”) } }

  1. <a name="LATnj"></a>
  2. ###
  3. <a name="qrqU5"></a>
  4. ### 1. 访问权限
  5. - [x] 默认为public,同包下
  6. - [x] protected,除了自身就只有子类可以访问
  7. - [x] private,只能在类的内部或者伴生对象中可用
  8. - [x] private[包名]增加包访问权限,包名下的其他类也能使用
  9. <a name="Kj1e7"></a>
  10. ### 2.创建对象
  11. ```scala
  12. val | var 对象名 [:类型] = new 类型()
  1. 1. val : 引用对象地址不能再改变
  2. 1. var: 可以修改引用对象的地址
  3. 1. 自动推导变量类型不能多态,所以多态需要显示声明

3.构造器

主构造器:只能有一个 辅助构造器:可以有多个(重载)

  1. class Person2(var name:String,var age:Int){ //主构造器 public Person2( String name,int age ){.....}
  2. println("构造方法被调用")
  3. }
  4. class Person3{ //相当于是空参的构造器 public Person3(){ }
  5. var name:String = _
  6. var age:Int = _
  7. def this(age:Int){ //辅助构造器
  8. this() // 必须调用主构造器(注意:主构造器是唯一的,只有一个)
  9. this.age = age
  10. }
  11. def this(name:String){ //辅助构造器
  12. this()
  13. this.name = name
  14. }
  15. def this(name:String,age:Int){ //辅助构造器
  16. this(name) //可以直接调用上面声明的辅助构造器,因为上面的辅助构造器也有调用主构造器
  17. this.age = age
  18. }
  19. }
  20. object Test02_Demo {
  21. def main(args: Array[String]): Unit = {
  22. var p = new Person2("zs",18)
  23. var p2 = new Person3("zs")
  24. println(p2.name)
  25. }
  26. }

构造器参数:未修饰(局部变量:构造方法中的一个变量)、var(成员变量)、val(成员常量)
未修饰

  1. class Person3(name:String, age:Int){ //有参构造器
  2. var name:String = name
  3. var age:Int = age
  4. }
  1. var
  1. class Person3(var name:String,var age:Int){ //有参构造器 并且 声明成员变量
  2. var habbit:String = _
  3. def this(name:String, age:Int,habbit:String){ //辅助构造器
  4. this(name,age) // 必须调用主构造器(注意:主构造器是唯一的,只有一个)
  5. this.habbit = habbit
  6. }
  7. }

1.1 继承

子类继承父类的属性和方法,单继承

子类需要在主构造器中调用父类的主构造器

  1. class Person(var name:String){
  2. println("父类主构造器")
  3. }
  4. class Student(var name:String) extends Person(name){
  5. println("子类主构造器")
  6. }

指定调用父类方法( super[父类名] )

  1. trait Father1{
  2. def xixi(){
  3. }
  4. }
  5. trait Father2{
  6. def xixi(){
  7. }
  8. }
  9. class sun extends Father1 with Father2{
  10. def xixi(){
  11. super[Father2].xixi()
  12. }
  13. }

1.2 多态

编译看左边 (编译检查) ,运行看右边(动态绑定) Scala中的属性和方法都是 动态绑定

类型检查 :var isTrue : Boolean = obj.isInstanceOf[T]

向下转型 :var obj : T = obj.asInstanceOf[T]

  1. object Test04_Demo {
  2. def main(args: Array[String]): Unit = {
  3. var s:Student1 = new Student1()
  4. var t:Teacher1 = new Teacher1()
  5. var sp:Person9 = new Student1()
  6. var p:Person9 = new Person9()
  7. println("student is person4="+ s.isInstanceOf[Person9]) //true
  8. println("teacher is person4="+ t.isInstanceOf[Person9]) //true
  9. println("person4 is student="+ sp.isInstanceOf[Student1])//true
  10. println("person4 is student="+ p.isInstanceOf[Student1]) //fasle
  11. if(sp.isInstanceOf[Student1]){
  12. var ss = sp.asInstanceOf[Student1]
  13. println(ss.name)
  14. }
  15. }
  16. }
  17. class Person9{
  18. def say(): Unit ={
  19. println("hello")
  20. }
  21. }
  22. class Student1 extends Person9{
  23. var name:String = "zs"
  24. override def say(): Unit = {
  25. println("hello,student")
  26. }
  27. }
  28. class Teacher1 extends Person9{
  29. override def say(): Unit = {
  30. println("hello,teacher")
  31. }
  32. }