Scala的trait

今天看一下scala的trait,用法不讲,就看一下编译再反编译的源码
定义一个trait

trait TraitDemo {
  def say(): Unit
}

使用javac命令编译这个文件

# scalac TraitDemo.scala

得到一个TraitDemo.clss,我们再使用javap命令反编译这个class文件看一下

# javap TraitDemo.class

Compiled from "TraitDemo.scala"
public interface com.study.TraitDemo {
  public abstract void say();
}

一目了然,trait类型经过编译后变成了接口,而say()被编译成为了abstract方法。
如果我们把def say(): Unit方法实现,改为say(): Unit = {},看反编译之后的代码

Compiled from "TraitDemo.scala"
public abstract class com.study.TraitDemo$class {
  public static void say(com.study.TraitDemo);
  public static void $init$(com.study.TraitDemo);
}

这时候trait就变成了一个抽象类,而实现的方法变成了static级别的。

看到上面的编译结果,我们就可以想到scala中,定义不同的trait,实现不同的功能,当我们需要某一个功能的时候可以直接with进来,比如成为便捷的工具类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值