概述:
1、在Scala语言中,采用特质trait来代替接口的概念,也就是说,多个类具有相同的特质时,就可以将这个特质独立出来,采用关键字trait声明。
2、Scala中的trait中即可以有抽象属性和方法,也可以有具体的属性和方法,一个类可以混入多个特质。这种感觉类似于Java中的抽象类。
3、Scala引入trait特征,第一可以替代Java的接口,第二个也是对单继承机制的一种补充。
语法:
trait 特质名 {
主体
}
trait StudentTrait{
// 声明属性
var name:String = _
// 声明方法
def study():Unit={
}
// 抽象属性
var age:Int
// 抽象方法
def learn():Unit
}
说明:
(1)类和特质的关系:使用继承的关系
(2)当一个类去继承特质时,第一个连接词是extends,后面是with
(3)如果一个类在同时继承特质和父类时,应当把父类写在extends后
(4)特质可以同时拥有抽象方法和具体方法
(5)一个类可以混入多个特质
(6)所有的Java接口都可以当做Scala特质使用
(7)动态混入:创建对象时混入trait,而无需使类混入该trait
特质冲突:
一个类混入多个特质,多个特质之间有相同的抽象方法,特质之间没有关系,直接对抽象方法实现一次即可。
一个类混入多个特质,多个特质之间有相同的非抽象方法,特质之间没有关系,在类中不处理,会导致特质冲突。
特质叠加:
顺序:
第一步,列出混入的第一个特质的继承关系,作为临时叠加顺序,第二步,列出混入的第二个特质的继承关系,并将该顺序叠加到临时顺序表前边,已经出现的不再重复,第三步,将子类放在临时叠加顺序的第一个,得到最终的叠加顺序。
super这时候不是去调用父类的方法,而是调用特质叠加顺序上 下一个节点的方法。