特质trait类似于Java中的接口,一个类可以同时继承多个trait,但是一次只能继承一个类。
trait和抽象类中,都可以定义没有赋值的字段,没有实现的方法,有实现的方法,在实现或继承的时候,必须给没有赋值的字段赋值,必须实现没有实现的方法,有实现的方法也可以重写。
继承class的关键字为extends,继承trait的关键字为with;当没有继承class,只继承trait时,用extends关键字。
package test
/**
* @author: whua
* @create: 2018/10/08 09:23
*/
object ClassDemo {
def main(args: Array[String]): Unit = {
val human = new Humam
println(human.name)
println(human.distance)
println(human.climb)
println(human.fight)
}
}
/**
* 特质
*/
trait Flyable {
// 声明一个没有赋值的字段
val distance: Int
//声明一个没有实现的方法
def fight: String
//声明一个实现的方法
def fly: Unit = {
println("I can fly")
}
}
abstract class Animal {
//声明一个没有赋值的字段
val name: String
//声明一个没有实现的方法
def run(): String
//声明一个有实现的方法
def climb: String = {
"I can climb"
}
}
class Humam extends Animal with Flyable {
override val name: String = "yingying"
//重写抽象类中没有实现的方法
override def run(): String = "I can run"
// 重写抽象类中有实现的方法
override def climb: String = "override climb"
override val distance: Int = 1000
// 实现特质中没有实现的方法,用不用override关键字都可以
override def fight: String = "with bar"
// 重写特质中有实现的方法
override def fly: Unit = println("override fly")
}