java接口(interface) & scala 特質(zhì)(trait)

一、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ì)中的抽象方法和屬性

  1. 實(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)系

  1. 特質(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ù)庫(kù)表中 ")
    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ù)庫(kù)表中 插入數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容