JS技术

Scala:trait - bdmh的专栏 - 博客频道 - CSDN.NET bdmh的专栏 QQ:515840062

字号+ 作者:H5之家 来源:H5之家 2015-12-14 19:02 我要评论( )

Android之用PopupWindow实现弹出菜单---多选项、分栏菜单

Scala开篇(目录)

在Scala中有一个trait类型,它可以被继承,而且支持多重继承,其实它更像我们熟悉的接口(interface),但它与接口又有不同之处是:
trait中可以写方法的实现,interface不可以(java8开始支持接口中允许写方法实现代码了),这样看起来trait又很像抽象类(abstract),一会我们会通过反编译,看看Scala中对trait是怎样处理的,先来看看trait的使用。

//声明一个 trait trait TraitBase{ def add(x:Int,@deprecatedName('y) n:Int): Int ={ return x+n } } //TraitTest 继承自 TraitBase class TraitTest extends TraitBase{ //重写父类的方法 override def add(x:Int,y:Int): Int ={ return x+y*10 } } //如果需要调用父类的方法,使用super访问父类 class TraitTest extends TraitBase{ override def add(x:Int,y:Int): Int ={ return super.add(x,y)*10 } } //使用 val test = new TraitTest println(test.add(4,5))

对于多重继承,我们使用 with 关键字

FA(): Unit ={ println("FA") } } FB(): Unit ={ println("FB") } } content=null } { //这里不需要必须实现trait中的方法 }

看完了使用,我们看看编译器把trait编译成什么样的java对象了。编译后有两个文件(TraitBase$class.class和TraitBase.class)
先来看看TraitBase.class

{ (int paramInt1, int paramInt2); }

再看看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

{ scala$test$TraitBase$_setter_$content_$eq(String paramString); String content(); }

TraitBase$class.class

TraitBase$class { $init$(TraitBase $this) { $this.scala$test$TraitBase$_setter_$content_$eq("this is trait test"); } }

看来trait最终编译为interface和abstract class的两个文件

  • 上一篇Scala:object(单例)
  • 顶 0 踩 0

    我的同类文章

    猜你在找

    查看评论

    * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

    个人资料


    bdmh

  • 访问:227633次
  • 积分:3112
  • 等级:

    积分:3112

  • 排名:第6154名
  • 文章搜索

    文章分类

  • C#(9)
  • C/C++(12)
  • Delphi(28)
  • Java(13)
  • ExtJs(13)
  • FieldSet(1)
  • 布局(1)
  • Android(22)
  • Netty(7)
  • Scala(11)
  • 文章存档

    阅读排行

  • Android败笔之ListView设置分割线颜色(14937)
  • Asp.net网站部署时遇到的一些问题(11437)
  • Android开发:default activity not found(11354)
  • (8934)
  • (7714)
  • FastReport问题整理(?p=77)(6909)
  • Android:PendingIntent的FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT(6236)
  • 链表-简易学生成绩管理(5574)
  • ExtJs 4.x 学习小记:Ext.require动态加载js文件(5342)
  • 全局键盘钩子(WH_KEYBOARD)(4822)
  • 评论排行

  • 链表-简易学生成绩管理(25)
  • Delphi实现软件中登录用户的操作权限(17)
  • 超大数相加减(15)
  • (14)
  • (13)
  • 文字录入无限制Undo,Redo的实现(11)
  • Android败笔之ListView设置分割线颜色(9)
  • 根据数据库结构生成TreeView(8)
  • 在Win7系统中安装Delphi7(7)
  • 获取进程列表及相关信息(6)
  •  

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    网友点评
    <