一.抽象类:abstract
//定义一个动物类
//当我们在类前加上abstract,那么这个类就是抽象类
abstract class Aninal {
def characteristic():Unit=println("动物")
}
//定义一个鸡类,继承动物类
class Chicken extends Aninal{
//继承后重写需要加关键字override,如果父类中的方法没有实现,那么重写的时候不用加override
override def characteristic(): Unit =println("鸡是动物")
}
object Aninal{
def main(args:Array[String]):Unit={
//实例化一个鸡的对象
val chicken:Chicken=new Chicken
//调用characteristic函数
chicken.characteristic
}
}
//输出
鸡是动物
二.特征:Trait
//创建一个特征"叫",不实现
trait t1{
def yell():Unit
}
//创建一个特征"飞",实现
trait t2{
def fly():Unit={println("飞")}
}
//创建一个特征"跑",实现
trait t3{
def run():Unit={println("跑")}
}
//定义一个chicken类添加特征通过"with 特征名"
class chicken with t1 with t2 with t3{
//重写第一个特征
def yell():Unit=println("鸡会叫")
//重写第二个特征,因为在特征类中函数被实现,所以重写需要加override
override def fly():Unit=println("鸡会飞")
//第三个特征不重写
}
object Chicken{
def main(args:Array[String]):Unit={
//实例化一个鸡的对象
val chicken:Chicken=new Chicken
chicken.yell
chicken:fly
//即使没有重写也是可以使用特征中实现的函数
chicken:run
}
}
//输出
鸡会叫
鸡会飞
跑
面试题:当继承的类或特征有相同的函数,那么重写函数的时候如果使用原函数(super.函数),那么会跑到哪个类或特征中的函数呢?
解答:当需要调用到原函数时,会从继承顺序从后往前找