scala中的trait(特征)

本文深入探讨Scala中的trait(特征),对比Java中的接口,介绍其如何实现多继承,包括trait的使用方式、与Java库的集成、具体与抽象方法的实现原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值