一、java接口
只要沒有implement接口就沒有實(shí)現(xiàn)症革。
package com.atguigu.bigdata.scala.chapter06;
public class Test {
public static void main(String[] args) {
CCC ccc = new BBB(); //為什么BBB沒有實(shí)現(xiàn)接口CCC卻能用罗晕?子類包含父類AAA所有內(nèi)容
System.out.println(BBB.class.getInterfaces().length); //0
System.out.println(AAA.class.getInterfaces().length); //1
}
}
interface CCC {
}
class AAA implements CCC{
}
class BBB extends AAA{
}
二、scala特質(zhì)trait
1.如果一個(gè)對(duì)象符合某個(gè)特質(zhì)憔儿,那么可以將這個(gè)特質(zhì)“混入”到對(duì)象中
2.特質(zhì)中可以聲明屬性和方法
3.如果類沒有父類可以使用extends關(guān)鍵字混入(類似java抽象類)
4.如果有父類忆植,使用with關(guān)鍵字混入特質(zhì)
5.動(dòng)態(tài)混入:創(chuàng)建對(duì)象的同時(shí)混入特質(zhì)
package com.atguigu.bigdata.scala.chapter06
object Scala04_Field {
def main(args: Array[String]): Unit = {
val user = new User14()
user.test()
//動(dòng)態(tài)混入
val user1444 = new User14444() with MyTrait14
user1444.test()
}
}
trait MyTrait14{
//特質(zhì)中可以聲明屬性和方法
//功能
def test() : Unit = {
println("test trait")
}
}
//混入
class User14 extends MyTrait14 {
}
class Parent14 {
}
//如果有父類,使用with關(guān)鍵字混入特質(zhì)
class User144 extends Parent14 with MyTrait14{
}
class User14444 {
}
三、特質(zhì)中的抽象方法和屬性
- 實(shí)現(xiàn)特質(zhì)朝刊,必須重寫特質(zhì)中的抽象方法
2.實(shí)現(xiàn)特質(zhì)耀里,必須重寫特質(zhì)中的抽象屬性并初始化
3.特質(zhì)的完整屬性可以重寫也可以不重寫
可以對(duì)比抽象類。
package com.atguigu.bigdata.scala.chapter06
object Scala04_Field {
def main(args: Array[String]): Unit = {
}
}
trait MyTrait15 {
//抽象方法: 只聲明拾氓,不初始化
def test() : Unit
def test1() : Unit = {
}
//抽象屬性
val name : String
//完整屬性
val age : Int = 20
}
class User15 extends MyTrait15 {
//實(shí)現(xiàn)特質(zhì)冯挎,必須重寫特質(zhì)中的抽象方法
override def test(): Unit = {
}
//實(shí)現(xiàn)特質(zhì),必須重寫特質(zhì)中的抽象屬性并初始化
override val name: String = "張三"
//特質(zhì)的完整屬性可以重寫也可以不重寫
override val age: Int = 30
}
四痪枫、特質(zhì)织堂、類之間的關(guān)系
- 特質(zhì)可以混入其他特質(zhì)
2.特質(zhì)可以繼承其他類
3.類可以混入多個(gè)特質(zhì),使用with關(guān)鍵字
package com.atguigu.bigdata.scala.chapter06
object Scala04_Field {
def main(args: Array[String]): Unit = {
}
}
//特質(zhì)可以繼承其他類
trait MyTrait16 extends User166{
}
//特質(zhì)可以混入其他特質(zhì)
trait MyTrait166 extends MyTrait16{
}
trait Mytrait1666{
}
//類可以混入多個(gè)特質(zhì)奶陈,使用with關(guān)鍵字
class User16 extends MyTrait16 with MyTrait166 with Mytrait1666 {
}
class User166 {
}
五易阳、trait的初始化順序
1.如果類存在父類,先初始化父類
2.父類初始化完成后吃粒,如果類存在多個(gè)特質(zhì)潦俺,會(huì)從左到右初始化
3.特質(zhì)只會(huì)初始化一次,所以如果之前初始化了徐勃,就不再初始化了事示。
package com.atguigu.bigdata.scala.chapter06
object Scala04_Field {
def main(args: Array[String]): Unit = {
val user17 = new User177()
}
}
trait MyTrait17 {
println("MyTrait17")
}
trait MyTrait177 {
println("MyTrait177")
}
trait MyTrait1777 {
println("MyTrait1777")
}
class User17 extends MyTrait17 {
println("user17....")
}
class User177 extends User17 with MyTrait17 with MyTrait177 with MyTrait1777 {
println("user177....")
}
打印:
MyTrait17
user17....
MyTrait177
MyTrait1777
user177....
1)執(zhí)行子類User177
2)執(zhí)行父類User17
3)執(zhí)行(構(gòu)建)父類User17的特質(zhì)MyTrait17
4)執(zhí)行特質(zhì)MyTrait17打印MyTrait17
5)執(zhí)行父類User17的類體,打印user17....
6)執(zhí)行with MyTrait17僻肖,打印MyTrait177
7)執(zhí)行with MyTrait1777肖爵,打印MyTrait1777
8)執(zhí)行子類User177類體,打印user177....
注意:子類繼承父類臀脏,并沒有實(shí)現(xiàn)父類實(shí)現(xiàn)的特質(zhì)(如上述class User17 extends MyTrait17劝堪,那么為什么class User177 extends User17 with MyTrait17沒有打兩遍MyTrait17呢?原因是父類構(gòu)造的時(shí)候已經(jīng)初始化trait MyTrait17一次了揉稚,所以在子類再with MyTrait17時(shí)秒啦,不再對(duì)trait MyTrait17初始化了。
六搀玖、trait的執(zhí)行順序
1.特質(zhì)初始化順序從左至右余境,執(zhí)行順序從右到左
2.此處的super不是父特質(zhì)的概念,而是上一個(gè)特質(zhì)的概念灌诅,如下LogFile的上一個(gè)特質(zhì)是DB
package com.atguigu.bigdata.scala.chapter06
object Scala04_Field {
def main(args: Array[String]): Unit = {
val mysql = new Mysql()
mysql.insert()
}
}
trait Operate {
def insert() : Unit = {
println("插入數(shù)據(jù)")
}
}
trait DB extends Operate {
override def insert(): Unit = {
print("向數(shù)據(jù)庫表中 ")
super.insert()
}
}
trait LogFile extends Operate {
override def insert(): Unit = {
print("向日志文件中 ")
//此處的super不是父特質(zhì)的概念芳来,而是上一個(gè)特質(zhì)的概念,如下LogFile的上一個(gè)特質(zhì)是DB
super.insert()
}
}
//特質(zhì)初始化順序從左至右猜拾,執(zhí)行順序從右到左
class Mysql extends DB with LogFile {
}
打蛹瓷唷:向日志文件中 向數(shù)據(jù)庫表中 插入數(shù)據(jù)