scala中的trait(特徵)

                                                                    
 一.java中的接口不是面向對象的只是對多繼承的一種補充 而scala是純面向對象的所以使用trait(特徵)相當於java中interface+abstract class


二.scala的沒有implements關鍵字,它使用extends關鍵字實現trait


三.scala沿用也java的庫所以scala中java的所有庫可以當做trait來使用
    trait Cloneable extends java.lang.Cloneable

四.scala也是單繼承的使用trait滿足了多繼承的要求


   1. 沒有父類 class  類名   extends   特質1   with    特質2   with   特質3 ..
   2. 有父類class  類名   extends   父類   with  特質1   with   特質2   with 特質3
   3. 實戰


 五.trait 可以擁有抽象方法也可以擁有實現的方法(我們將scala的class文件反編譯成java文件瞭解底層原理)


 1.底層原理  抽象方法和 具體實現方法 被封裝在不同的地方當中
      a.具體來說抽象方法和具體實現方法的抽象方法放在一個接口這個接口名就是我們聲明的特徵名
      b.具體實現就放在了另一個抽象類中(並定義爲一個靜態方法方便調用)
      c.當我們在scala中繼承特質時,底層會自動將實現方法的抽象方法給實現(即調用抽象類的靜態方法)

 2.源碼

 

package edu.lulu.oop.chapter6

object Test11 {
  def main(args: Array[String]): Unit = {

    var a = new MyTrait01
    a.test00()
    a.test01()
  }
}


class MyTrait01 extends MyTrait{

  override def test00(): Unit = {
    println("test02")
  }
}



trait MyTrait{

  def test00()//定義一個抽象方法

  def test01(): Unit ={
    println("tees01")
  }

}

3.反編譯產生的文件

    a.

    b.

package edu.lulu.oop.chapter6;

import scala.Predef.;

public abstract class MyTrait$class
{
  public static void test01(MyTrait $this)
  {
    Predef..MODULE$.println("tees01");
  }

  public static void $init$(MyTrait $this)
  {
  }
}




--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


package edu.lulu.oop.chapter6;

import scala.Predef.;
import scala.reflect.ScalaSignature;

@ScalaSignature(bytes="\006\001\0012A!\001\002\001\027\tIQ*\037+sC&$\b'\r\006\003\007\021\t\001b\0315baR,'O\016\006\003\013\031\t1a\\8q\025\t9\001\"\001\003mk2,(\"A\005\002\007\025$Wo\001\001\024\007\001a!\003\005\002\016!5\taBC\001\020\003\025\0318-\0317b\023\t\tbB\001\004B]f\024VM\032\t\003'Qi\021AA\005\003+\t\021q!T=Ue\006LG\017C\003\030\001\021\005\001$\001\004=S:LGO\020\013\0023A\0211\003\001\005\0067\001!\t\005H\001\007i\026\034H\017\r\031\025\003u\001\"!\004\020\n\005}q!\001B+oSR\004")
public class MyTrait01
  implements MyTrait
{
  public void test01()
  {
    MyTrait.class.test01(this);
  }
  public void test00() { Predef..MODULE$.println("test02"); }


  public MyTrait01()
  {
    MyTrait.class.$init$(this);
  }
}


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


package edu.lulu.oop.chapter6;

import scala.Predef.;
import scala.reflect.ScalaSignature;

@ScalaSignature(bytes="\006\001\0012A!\001\002\001\027\tIQ*\037+sC&$\b'\r\006\003\007\021\t\001b\0315baR,'O\016\006\003\013\031\t1a\\8q\025\t9\001\"\001\003mk2,(\"A\005\002\007\025$Wo\001\001\024\007\001a!\003\005\002\016!5\taBC\001\020\003\025\0318-\0317b\023\t\tbB\001\004B]f\024VM\032\t\003'Qi\021AA\005\003+\t\021q!T=Ue\006LG\017C\003\030\001\021\005\001$\001\004=S:LGO\020\013\0023A\0211\003\001\005\0067\001!\t\005H\001\007i\026\034H\017\r\031\025\003u\001\"!\004\020\n\005}q!\001B+oSR\004")
public class MyTrait01
  implements MyTrait
{
  public void test01()
  {
    MyTrait.class.test01(this);
  }
  public void test00() { Predef..MODULE$.println("test02"); }


  public MyTrait01()
  {
    MyTrait.class.$init$(this);
  }
}