Scala中的继承与Java有着显著的不同。
抽象类abstract class
abstract class Car{//抽象类 val carBrand:String;//抽象字段,一个没有被初始化的字段 def info();//抽象方法 def greeting(){println("Welcome to my car")}//非抽象方法 }
Scala的抽象类同Java一样不能被实例化,但是可以被继承,可以包含非抽象方法。
定义抽象字段的时候,只要没给出初始化值,就表示为一个抽象字段,但是抽象字段必须要声明类型。
定义抽象方法的时候不需要使用abstract关键字,直接定义,不用写方法体。
class BMWCar extends Car{ override val carBrand: String = "BMW";//重写抽象字段,需使用override关键字 //重写抽象方法,不需要使用override关键字 def info(){println("The car is "+carBrand)} //重写非抽象方法的时候,需要使用override override def greeting(): Unit = {println("Welcome to my BMWCar")} }
我们在继承抽象类的时候使用extends来继承
重写抽象字段和非抽象方法的时候需要使用override关键字来声明。
重写抽象方法的时候不需要使用override关键字,但是写上编译器有也不会报错。
特质trait
Scala同Java相同并不支持多重继承,Java通过接口来达到多重继承效果,Scala则通过特质来实现。
Scala中的特质类似于Java中的接口,但是又不同于接口。
特质可以实现多继承机制,类似于接口。
但是特质又可以包含非抽象方法,相当于抽象类,接口则不能。
特质相当于实现了多继承机制的抽象类。
trait Car{//特质 val carBrand:String;//抽象字段,一个没有被初始化的字段 def info();//抽象方法,不使用abstract def greeting(){println("Welcome to my car")}//非抽象方法 }
我们注意到,我们使用特质的时候用关键字trait。
特质中可以包含非抽象方法。
trait CarId{//我们再次定义一个特质 var id : Int; def currentId(); } class BMWCar extends Car with CarId { //重写特质Car中的抽象字段 override val carBrand: String = "BMW"; //重写特质CarId中的抽象字段 override var id: Int = 10000; //重写特质Car中抽象方法 def info(){println("The car is "+carBrand)} //重写特质Car中非抽象方法的时候 override def greeting(): Unit = {println("Welcome to my BMWCar")} //重写特质CarId中的抽象方法 override def currentId() = println("My BWMCar id is "+id); }
在继承多个特质的时候我们使用extends来继承第一个特质,以后每多加一个特质都要使用with来添加。
特质的其他用法同抽象类相同。