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);
  }
}