第六章介绍了Scala面向对象的基本概况,本章会比较类之间的两种基本关系:组合与继承,除此之外,还将讨论更多面向对象的细节。
-
组合
- 指一个类特有另一个的引用,借助被引用的类完任务。
-
继承
- 基础是超类/子类的关系。
-
抽象类
- 具有抽象成员的类本身必须被声明为抽象的,用关键字 abstract
- 只被声明但没有实现的方法称为抽象方法
-
定义无参数方法 无参数方法的风格即省略空括号
- 通常,只要方法中没有参数并且方法仅能通过读取所包含对象的属性去访问可变状态,就使用无参数方法
- 取值时,不写括号
- 改值时,写括号
-
扩展类
- 就是Java中的派生
- 继承表示超类的所有成员也是子类的成员
- 超类的私有成员不会被子类继承
- 超类中的成员若和子类中有相同的名称和参数则不会被子类继承
-
重写方法和字段
- 字段和方法术语相同的命名空间
- 字段可以重写无参数方法
- 支持统一访问原则
- Scala禁止在同一个类里用同样的名称定义字段和方法
- 命名空间
- Java有四个命名空间:字段、方法、类型、包
- Scala只有两个命名空间:值(字段、方法、包还有单例对象),类型(类和特质名)
-
定义参数化字段
~~~
class Cat {
val dangerous = false;
}
class Tiger {
override val dangerous : Boolean;
private var age : Int;
} extends Cat
~~~
~~~
等同于:
~~~
~~~
class Tiger(param1 : Boolean, param2 : Boolean) extends Cat {
override val dangerous = param1;
private var age = param2;
}
~~~
~~~
这样的写法称之为提前定义,也就是定义参数化字段
~~~
-
调用超类构造器
- 把要传递的参数或参数列表放在超类名之后的括号里即可
-
使用override修饰符
- 若子类成员重写了父类的具体成员则必须带有这个修饰符,若实现的是同名的抽象成员时,则这个修饰符是可选的
- 该规则给编译器提供了便利,可以帮助其避免某些难以捕捉的错误并使得对系统的改进更加安全
-
多态和动态绑定
- 父类的变量可以指向子类的对象,这种现象称之为多态
-
定义final成员
- 确保一个成员不被重写,需要给改成员添加修饰符 final 来实现
-
使用组合与继承
- 如果追求的是根本上的代码重用,通常采用组合而不是继承