6.3. Scala 面向对象编程之继承
6.3.1. Scala 中继承 (extends) 的概念
Scala 中, 让子类继承父类, 与 Java 一样, 也是使用 extends 关键字;
继承就代表, 子类可继承父类的 field 和 method , 然后子类还可以在自己的内部实现父类没有的, 子类特有的 field 和 method, 使用继承可以有效复用代码;
子类可以覆盖父类的 field 和 method, 但是如果父类用 final 修饰, 或者 field 和 method 用 final 修饰, 则该类是无法被继承的, 或者 field 和 method 是无法被覆盖的.
private 修饰的 field 和 method 不可以被子类继承, 只能在类的内部使用;
field 必须要被定义成 val 的形式才能被继承, 并且还要使用 override 关键字. 因为 var 修饰的 field 是可变的, 在子类中可直接引用被赋值, 不需要被继承; 即 val 修饰的才允许被继承, var 修饰的只允许被引用. 继承就是改变, 覆盖的意思.(注意: 子类和父类中都要用 val 修饰)
Java 中的访问控制权限, 同样适用于 Scala
| 类内部 | 本包 | 子类 | 外部包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
举例说明:
- package cn.itcast.extends_demo
- class Person1 {
- val name="super"
- def getName=this.name
- }
- class Student1 extends Person1{
- // 继承加上关键字
- override
- val name="sub"
- // 子类可以定义自己的 field 和 method
- val score="A"
- def getScore=this.score
- }
6.3.2. Scala 中 override 和 super 关键字
Scala 中, 如果子类要覆盖父类中的一个非抽象方法, 必须要使用 override 关键字; 子类可以覆盖父类的 val 修饰的 field, 只要在子类中使用 override 关键字即可.
override 关键字可以帮助开发者尽早的发现代码中的错误, 比如, override 修饰的父类方法的方法名拼写错误.
此外, 在子类覆盖父类方法后, 如果在子类中要调用父类中被覆盖的方法, 则必须要使用 super 关键字, 显示的指出要调用的父类方法.
举例说明:
- package cn.itcast.extends_demo
- class Person2 {
- private val name = "leo"
- val age=50
- def getName = this.name
- }
- class Student2 extends Person2{
- private val score = "A"
- // 子类可以覆盖父类的 val field, 使用 override 关键字
- override
- val age=30
- def getScore = this.score
- // 覆盖父类非抽象方法, 必须要使用 override 关键字
- // 同时调用父类的方法, 使用 super 关键字
- override def getName = "your name is" + super.getName
- }
6.3.3. Scala 中 isInstanceOf 和 asInstanceOf
如果实例化了子类的对象, 但是将其赋予了父类类型的变量, 在后续的过程中, 又需要将父类类型的变量转换为子类类型的变量, 应该如何做?
- Class A extends class B
- B b=new A
首先, 需要使用 isInstanceOf 判断对象是否为指定类的对象, 如果是的话, 则可以使用 asInstanceOf 将对象转换为指定类型;
注意: p.isInstanceOf[XX] 判断 p 是否为 XX 对象的实例; p.asInstanceOf[XX] 把 p 转换成 XX 对象的实例
注意: 如果没有用 isInstanceOf 先判断对象是否为指定类的实例, 就直接用 asInstanceOf 转换, 则可能会抛出异常;
注意: 如果对象是 null, 则 isInstanceOf 一定返回 false, asInstanceOf 一定返回 null;
Scala 与 Java 类型检查和转换
Scala | Java |
obj.isInstanceOf[C] | obj instanceof C |
obj.asInstanceOf[C] | (C)obj |
classOf[C] | C.class |
举例说明:
- package cn.itcast.extends_demo
- class Person3 {}
- class Student3 extends Person3
- object Student3{
- def main (args: Array[String] ) {
- val p: Person3 = new Student3
- var s: Student3 = null
- // 如果对象是 null, 则 isInstanceOf 一定返回 false
- println (s.isInstanceOf[Student3])
- // 判断 p 是否为 Student3 对象的实例
- if (p.isInstanceOf[Student3] ) {
- // 把 p 转换成 Student3 对象的实例
- s = p.asInstanceOf[Student3]
- }
- println (s.isInstanceOf[Student3] )
- }
- }
来源: http://www.bubuko.com/infodetail-3157272.html