目录
1. SCALA、JAVA、以及JVM之间的关系
2.SCALA编译解读
(1)通过scalac编译scalawe文件生成两个字节码文件
(2)通过反编译工具查看两个字节码文件内容
helloscala.class文件
HelloScala$.class
(3)反编译结果分析
- HelloScala
HelloScala..MODULE$.main(paramArrayOfString);
此句应是调用HelloScala$的一个静态属性(对象)
MODULE$的main方法。
- HelloScala$
static
{
new ();
}
即表示在静态代码块中new一个本身对象,相当于静态对象
private HelloScala$() { MODULE$ = this;
}
私有的构造方法,逻辑即为将本身在静态代码块中new出的对象赋给MODULE$。
(4)为什么存在两个字节码文件,java编译后只有一个字节码文件?
因为scala是基于java要更加对象化,因此第一个文件main方法中调用第二个文件的对象再调用scala.Predef.中的方法输出。而不是像java那样直接在main函数中print。
这好像不好太理解,那我们换个思路。主要是因为在java中由static关键字修饰的成员方法和成员变量都需要类名去调用,SCALA语言的开发者马丁奥德斯基觉得这样并不对象化,既然是一门面向对象的语言,就应该一切都由对象来调用。马丁奥德斯基取消了static这个关键字,将需要static修饰的内容,都放在伴生对象中,因此程序入口需要伴生对象来协助按成。因此scala文件编译后有两个文件,一个是程序入口类,一个是$类称为伴生对象所属类。
3.总结scala
package com.atguigu.chapter01
object Hello {
def main(args: Array[String]): Unit = {
println("hello scala")
}
}
Scala完全面向对象,故Scala去掉了Java中非面向对象的元素, 如static关键字, void类型
1) static
Scala无static关键字, 由object实现类似静态方法的功能(类名.方法名) 。
2) void
对于无返回值的函数, Scala定义其返回值类型为Unit类
class关键字和Java中的class关键字作用相同, 用来定义一个类