Scala开篇(目录)
在Scala中有一个trait类型,它可以被继承,而且支持多重继承,其实它更像我们熟悉的接口(interface),但它与接口又有不同之处是:
trait中可以写方法的实现,interface不可以(java8开始支持接口中允许写方法实现代码了),这样看起来trait又很像抽象类(abstract),一会我们会通过反编译,看看Scala中对trait是怎样处理的,先来看看trait的使用。
对于多重继承,我们使用 with 关键字
FA(): Unit ={ println("FA") } } FB(): Unit ={ println("FB") } } content=null } { //这里不需要必须实现trait中的方法 }看完了使用,我们看看编译器把trait编译成什么样的java对象了。编译后有两个文件(TraitBase$class.class和TraitBase.class)
先来看看TraitBase.class
再看看TraitBase$class.class
/**抽象类 它内部都是static的静态方法,但是大家注意 每个方法都带有一个参数,TraitBase 对象,通过这个对象,可以访问实际对象中定义的变量和方法 */ $class { (TraitBase $this, int x, int n) { return x + n; } $init$(TraitBase $this) { } }对于继承自trait的TraitTest,反编译结果如下
{ (int x, int n) { //调用的是TraitBase$class类中的add方法,并传递了自己这个实例对象 return TraitBase.class.add(this, x, n); } () { TraitBase.class.$init$(this); } }属性的访问,假如有下面的Scala代码
content = "this is trait test" } { def Foo(): Unit ={ println(content) } }反编译结果
TraitBase.class
TraitBase$class.class
TraitBase$class { $init$(TraitBase $this) { $this.scala$test$TraitBase$_setter_$content_$eq("this is trait test"); } }看来trait最终编译为interface和abstract class的两个文件
顶 0 踩 0
我的同类文章
猜你在找
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
个人资料
bdmh
积分:3112
文章搜索
文章分类
文章存档
阅读排行
评论排行