抽象类定义
概念:如果你在类中定义了抽象字段或抽象方法,那就一定是抽象类
abstract class Animal {
//抽象字段
var name:String
//抽象方法
def eat()
}
注意:
1、抽象类中既可以又抽象成员又可以又普通成员
2、子类必须实现特质的抽象成员
特质定义
trait Person {
}
理解:
1、类似接口,比接口丰富,既可以又抽象成员又可以又普通成员
/**
* 特质
*/
trait Person {
//普通的属性
var name:String="zhangsan"
def resume={}
//抽象
var age:Int
def resume1
}
2、特质有构造方法
3、子类可以混入多个特质,解决单继承问题
4、子类必须实现特质的抽象成员
特质案例
/**
* 特质
*/
trait Person {
//普通的属性
var name:String="zhangsan"
def resume={}
//抽象
var age:Int
def resume1
}
class Student extends Person {
//必须实现抽象成员 ctrl+o
override var age: Int = 12
override def resume1: Unit = {
print("我的自我介绍!")
}
}
object Test{
def main(args: Array[String]): Unit = {
//创建Student
val st1=new Student
st1.resume1
}
}
混入多特质案例 extends with
trait MoneyWebLog {
//抽象方法:实现收集财务系统的日志
def MoneyLog
}
trait OAWebLog {
//抽象方法:实现收集财务系统的日志
def MoneyLog
}
trait OAWebLog {
//抽象方法:实现收集OA系统的日志
def OALog
}
trait PayWebLog {
//抽象方法:实现收集支付系统的日志
def PayLog
}
package com.zzk2
class LogTool extends MoneyWebLog with OAWebLog with PayWebLog {
override def MoneyLog: Unit = {
print("收集财务日志")
}
override def OALog: Unit = {
print("收集OA日志")
}
override def PayLog: Unit = {
print("收集Pay日志")
}
}
object Test{
def main(args: Array[String]): Unit = {
val log=new LogTool
log.MoneyLog
log.OALog
log.PayLog
}
}
特质构造方法执行顺序
先初始化特质,由左向右初始化构造方法
最后初始化自己的构造方法,创建实例