1.扩展类
2.重写方法
3.类型检查和转换
4.受保护字段和方法
5.超类的构造
6.重写字段
7.匿名子类
8.抽象类
9.抽象字段
10.构造顺序和提前定义
11.Scala继承层级
12.对象相等性
1.扩展类
使用extends关键字,语法和java类似,java中的final声明类,代表类不可以被继承,java中的final对应scala中的val。
2.重写方法
3.类型检查和转换
4.受保护字段和方法
与java不同的是,protected的成员对于类所属的包而言,是不可见的。
5.超类的构造
这里有错。
类有一个主构造器和任意数量的辅助构造器,而每个辅助构造器都必须以对先前定义的辅助构造器或主构造器的调用开始。
其实,上面的代码和之前介绍的辅助构造器效果一致,只是前者少些很多代码。
6.重写字段
7.匿名子类
8.抽象类
注意,id是个抽象方法,没有方法体
子类重写超类的抽象方法时,不需要使用override关键字。
9.抽象字段
抽象字段就是一个没有初始值的字段。
具体的子类必须提供具体的字段:
和方法一样,在子类中重写超类中的抽象字段时,不需要override关键字。
你可以随时用匿名类型来定制抽象字段
10.构造顺序和提前定义
出乎意料的是,子类的数组长度竟然为0,而不是2。解释以上原因:
1. Ant构造器在自己构造前调用父类构造器。
2.父类构造器将它的range字段设为10。
3.父类为了初始化env数组,要用到range字段。
4.range字段被子类重写,还未初始化,因为为0。
5.env被设为长度为0的数组。
7.子类构造器继续执行,将其range字段设为2。
虽然range字段看上去可能是10或2,但是env被设成了长度为0的数组。
解决方案:
再次测试:
env数组的长度为子类的长度2。
以上代码保证了,父类构造中使用的被子类重写的字段一定是子类重写字段的值。
11.Scala继承层级
Null 类型的唯一实例就是null值。你可以将任何null赋值给任何引用,但不能赋值给值类型的变量。
Nothing类型没有实例。
12.对象相等性
同理,需要重写equals方法: