`
suigara
  • 浏览: 81883 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

scala的trait是如何实现的?

 
阅读更多

上次讲scala基础的时候提到过特质(trait),这是一个胖接口,可以实现类似多继承的东西。

但一直很好奇这是怎么编译成class并让jvm顺利执行。

 

经过网上提问无果后,只能自己找答案了。

 

首先发现trait编译后是两个class文件,如:

 

trait TestTrait1 {
    def foo1() = {println ("foo1")};
}

 

 编译后:

TestTrait1.class和TestTrait1$class.class

经过javap -verbose后发现两个文件分别为interface和class。

TestTrait1.class(只列出关键部分)

 

public interface org.ww.test.TestTrait1 extends scala.ScalaObject
  SourceFile: "TestTrait1.scala"
。。。。。。。。。。。省略。。。。。。。。。。

{
public abstract void foo1();

}

 

 可以看出,这就是一个java的接口

 

而TestTrait1$class.class

 

public abstract class org.ww.test.TestTrait1$class extends java.lang.Object
  SourceFile: "TestTrait1.scala"
。。。。。省略。。。。。。。

{
public static void foo1(org.ww.test.TestTrait1);
  Code:
   Stack=2, Locals=1, Args_size=1
   0:   getstatic       #11; //Field scala/Predef$.MODULE$:Lscala/Predef$;
   3:   ldc     #13; //String foo1
   5:   invokevirtual   #17; //Method scala/Predef$.println:(Ljava/lang/Object;
V
   8:   return
  LineNumberTable:
   line 4: 0

  LocalVariableTable:
   Start  Length  Slot  Name   Signature
   0      9      0    $this       Lorg/ww/test/TestTrait1;


public static void $init$(org.ww.test.TestTrait1);
  Code:
   Stack=0, Locals=1, Args_size=1
   0:   return
  LineNumberTable:
   line 3: 0

  LocalVariableTable:
   Start  Length  Slot  Name   Signature
   0      1      0    $this       Lorg/ww/test/TestTrait1;

 

 可见,一个trait会编译成一个接口和一个实现类,而trait的实现会放在类中当做静态方法。

 

编译的时候,把实现trait的子类编译成实现trait接口的类,是实现就是调用trait静态方法

这回可以理解了吧。

 

 

 

 

慢着。。。。

好像漏了点什么。。。。

public static void $init$(TestTrait1 $this)是什么?

看名字就知道了,是在初始化实现类的时候调用trait的初始化方法,实际上就是trait的无参构造函数

 

 

到这里,关于trait在jvm的实现应该有了一个大致的了解。

对于学习scala语言来说,这种程度应该可以了,如果想有更深的了解的话,建议去看看scala的源码。

 

 

分享到:
评论

相关推荐

    Scala Trait(特质).html

    Scala Trait(特征) 1.Scala中没有接口(interface)的概念 2.特质用于在类之间共享程序接口和字段,类似Java接口 3.特质是字段和方法的集合,可以提供字段和方法实现 4.类和单例对象都可以扩展特质(extends) 5....

    scala3 scala3 scala3 scala3 scala3

    Scala3通过`trait`的`sealed`修饰符和`object`的`opaque`修饰符来鼓励更严格的封装。`sealed`特质限制了其子类只能在定义的文件或模块内存在,`opaque`对象则使得类型可以有私有的实现细节,对外只暴露必要的接口。 ...

    scala sdk scala-2.12.3

    8. **面向对象编程**:Scala支持传统的类、继承、封装和多态性,同时也引入了特质(trait),可以用来实现混合类型和行为。 9. **函数式编程**:函数在Scala中是一等公民,可以作为参数传递,也可以作为返回值。...

    差分进化算法的Scala实现_Scala_代码_下载

    在实现差分进化算法时,可能会用到Scala的高阶函数、模式匹配、case类、特质(trait)以及可变和不可变集合等特性。 3. **并行计算与Spark框架**:文件名中的"spark"表明可能利用Apache Spark进行并行计算。Spark是...

    scala-2.12.8 源码包

    6. ** Trait**:Scala的Trait是类似于接口的结构,但可以包含具体实现。它们用于实现多继承和行为组合。源码中可以学习Trait的实现细节。 7. **类型推断**:Scala的类型推断使得编写简洁的代码成为可能,编译器会...

    scala2.12.1Windows镜像包

    - **面向对象**:支持类、接口、继承和多态,同时引入了特质(trait),提供了一种灵活的实现多重继承的方式。 - **函数式编程**:函数是一等公民,可以作为参数传递,也可以作为返回值。并支持高阶函数、柯里化、...

    scala学习源代码

    此外,Scala还引入了特质(trait),它类似于接口,但可以包含实现,提供了更灵活的多态性。 函数式编程是Scala的另一大特色。它支持高阶函数,即可以接受函数作为参数或返回函数的函数。函数是第一类公民,意味着...

    Programming In Scala 中文版及英文版

    8. ** Trait**:Trait是一种轻量级的抽象类型,可以看作是接口和部分实现的组合,可以用来实现多重继承。 9. **Option类型**:Option是Scala处理null安全的一种方式,它要么是Some[T],要么是None,避免了空指针...

    scala版DVD管理系统

    5. ** Trait **:Scala的Trait类似于Java的接口,但可以包含实现。可能定义了`DvdManager` Trait,其中包含了管理DVD的基本操作,然后由具体类实现这些操作。 6. **函数式编程**:利用函数式编程的不可变性,DVD的...

    最好的scala学习 课件

    Scala支持类、对象、继承、封装和多态,同时引入了特质(trait),它允许你实现多重继承的效果。这部分还会讲解伴生对象(companion object)和隐式转换,这些特性使得Scala的面向对象设计更加灵活。 "Scala进阶之...

    Scala程序设计 例子 源代码

    6. ** Trait**:类似于接口但更灵活的抽象类型,支持多重继承和混合实现。 7. **匿名函数与Lambda表达式**:简化函数定义,常用于函数式编程场景。 8. ** Actors模型**:Scala的并发处理机制,基于消息传递的并发...

    Scala考试题1

    - 特质(Trait)支持多重继承,可以看作是接口的扩展,可以包含具体实现。 - 抽象类可以有成员变量和部分方法的实现,但不能实例化。它支持单继承。 3. **object 和 class 的区别**: - `object` 单例对象,每个...

    scala-2.12.1 sdk

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得开发者能够在同一平台上享受到两种编程范式的优点。标题"scala-2.12.1 sdk"表明我们正在讨论的是Scala的软件开发工具包(SDK),版本为...

    Scala-2.11.1.zip

    不过,它还引入了特质(trait),这是一种更轻量级的继承方式,可以用来实现多重继承和混合行为。 3. **函数式编程**:Scala是函数式编程的强大平台,它提供了高阶函数、匿名函数、柯里化、尾递归优化等功能。函数...

    scala-2.11.12 win msi 安装包

    3. **面向对象**:Scala支持传统的面向对象编程,包括类、对象、继承和封装等概念,同时引入了特质(trait),增强了多继承的能力。 4. **函数式编程**:Scala深受函数式编程语言如Lisp和Haskell的影响,支持高阶...

    scala学习笔记整理

    5. ** Trait**:Scala的Trait类似于Java的接口,但可以包含实现,允许多重继承。Trait是实现行为组合的重要手段,有助于避免“菱形问题”。 6. ** Actors模型**:Scala内置对Akka框架的支持,提供了一种基于Actors...

    scala-2.11.8源码

    3. **特质(Trait)**:Scala的特质是用于实现多重继承和行为组合的关键。通过阅读`trait`的源码,可以理解如何避免传统多继承带来的问题,并实现灵活的代码复用。 4. **函数和闭包**:Scala中的函数是一等公民,...

    Scala—— 10.trait特质(接口)(未完待续)

    在Scala编程语言中,接口这一概念并不存在,取而代之的是特质(Trait),它结合了接口和抽象类的功能。特质是一种定义行为的蓝图,可以被多个类共享,从而实现多态性。Scala中的trait关键字用于声明特质,其基本结构...

    scala-2.13.1.zip

    在Spark中,Scala的特质(trait)被用来实现混入(mix-in)多重继承,这使得代码更加灵活。另外,Spark利用Scala的Actor模型进行并发处理,提供了Actor系统来管理分布式环境中的任务调度和通信。 在压缩包“scala-...

Global site tag (gtag.js) - Google Analytics