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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小M姐姐呀~

如果对您帮助,请客观打赏点

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值