上次讲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(特征) 1.Scala中没有接口(interface)的概念 2.特质用于在类之间共享程序接口和字段,类似Java接口 3.特质是字段和方法的集合,可以提供字段和方法实现 4.类和单例对象都可以扩展特质(extends) 5....
Scala3通过`trait`的`sealed`修饰符和`object`的`opaque`修饰符来鼓励更严格的封装。`sealed`特质限制了其子类只能在定义的文件或模块内存在,`opaque`对象则使得类型可以有私有的实现细节,对外只暴露必要的接口。 ...
8. **面向对象编程**:Scala支持传统的类、继承、封装和多态性,同时也引入了特质(trait),可以用来实现混合类型和行为。 9. **函数式编程**:函数在Scala中是一等公民,可以作为参数传递,也可以作为返回值。...
在实现差分进化算法时,可能会用到Scala的高阶函数、模式匹配、case类、特质(trait)以及可变和不可变集合等特性。 3. **并行计算与Spark框架**:文件名中的"spark"表明可能利用Apache Spark进行并行计算。Spark是...
6. ** Trait**:Scala的Trait是类似于接口的结构,但可以包含具体实现。它们用于实现多继承和行为组合。源码中可以学习Trait的实现细节。 7. **类型推断**:Scala的类型推断使得编写简洁的代码成为可能,编译器会...
- **面向对象**:支持类、接口、继承和多态,同时引入了特质(trait),提供了一种灵活的实现多重继承的方式。 - **函数式编程**:函数是一等公民,可以作为参数传递,也可以作为返回值。并支持高阶函数、柯里化、...
此外,Scala还引入了特质(trait),它类似于接口,但可以包含实现,提供了更灵活的多态性。 函数式编程是Scala的另一大特色。它支持高阶函数,即可以接受函数作为参数或返回函数的函数。函数是第一类公民,意味着...
8. ** Trait**:Trait是一种轻量级的抽象类型,可以看作是接口和部分实现的组合,可以用来实现多重继承。 9. **Option类型**:Option是Scala处理null安全的一种方式,它要么是Some[T],要么是None,避免了空指针...
5. ** Trait **:Scala的Trait类似于Java的接口,但可以包含实现。可能定义了`DvdManager` Trait,其中包含了管理DVD的基本操作,然后由具体类实现这些操作。 6. **函数式编程**:利用函数式编程的不可变性,DVD的...
Scala支持类、对象、继承、封装和多态,同时引入了特质(trait),它允许你实现多重继承的效果。这部分还会讲解伴生对象(companion object)和隐式转换,这些特性使得Scala的面向对象设计更加灵活。 "Scala进阶之...
6. ** Trait**:类似于接口但更灵活的抽象类型,支持多重继承和混合实现。 7. **匿名函数与Lambda表达式**:简化函数定义,常用于函数式编程场景。 8. ** Actors模型**:Scala的并发处理机制,基于消息传递的并发...
- 特质(Trait)支持多重继承,可以看作是接口的扩展,可以包含具体实现。 - 抽象类可以有成员变量和部分方法的实现,但不能实例化。它支持单继承。 3. **object 和 class 的区别**: - `object` 单例对象,每个...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得开发者能够在同一平台上享受到两种编程范式的优点。标题"scala-2.12.1 sdk"表明我们正在讨论的是Scala的软件开发工具包(SDK),版本为...
不过,它还引入了特质(trait),这是一种更轻量级的继承方式,可以用来实现多重继承和混合行为。 3. **函数式编程**:Scala是函数式编程的强大平台,它提供了高阶函数、匿名函数、柯里化、尾递归优化等功能。函数...
3. **面向对象**:Scala支持传统的面向对象编程,包括类、对象、继承和封装等概念,同时引入了特质(trait),增强了多继承的能力。 4. **函数式编程**:Scala深受函数式编程语言如Lisp和Haskell的影响,支持高阶...
5. ** Trait**:Scala的Trait类似于Java的接口,但可以包含实现,允许多重继承。Trait是实现行为组合的重要手段,有助于避免“菱形问题”。 6. ** Actors模型**:Scala内置对Akka框架的支持,提供了一种基于Actors...
3. **特质(Trait)**:Scala的特质是用于实现多重继承和行为组合的关键。通过阅读`trait`的源码,可以理解如何避免传统多继承带来的问题,并实现灵活的代码复用。 4. **函数和闭包**:Scala中的函数是一等公民,...
在Scala编程语言中,接口这一概念并不存在,取而代之的是特质(Trait),它结合了接口和抽象类的功能。特质是一种定义行为的蓝图,可以被多个类共享,从而实现多态性。Scala中的trait关键字用于声明特质,其基本结构...
在Spark中,Scala的特质(trait)被用来实现混入(mix-in)多重继承,这使得代码更加灵活。另外,Spark利用Scala的Actor模型进行并发处理,提供了Actor系统来管理分布式环境中的任务调度和通信。 在压缩包“scala-...