SCALA、JAVA、以及JVM之间的关系

目录

1. SCALA、JAVA、以及JVM之间的关系

2.SCALA编译解读

3.总结scala

1. SCALA、JAVA、以及JVM之间的关系

cc7994a452f64d22b8e80f014f759477.png

2.SCALA编译解读

(1)通过scalac编译scalawe文件生成两个字节码文件

d39a5a32171c4d159d2e1c736c7a223e.png

(2)通过反编译工具查看两个字节码文件内容

helloscala.class文件

1a8b2a11e7124188a83f598aaf0f7ed6.png

HelloScala$.class

5e55e85a563e4dae85aa32c145a9b8cf.png

(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关键字作用相同, 用来定义一个类

猜你喜欢

转载自blog.csdn.net/baidu_41833099/article/details/124674445