scala语言的底层是java实现的_Scala学习笔记一(与Java、Jvm的关系以及程序执行流程分析)...
一、Scala语言与Java、Jvm的关系分析
Scala语言是马丁奥德斯基接触Java语言后,针对Java语言的特点,将函数式编程语言的特点融合到Java中,由此发明的。Scala语言和Java语言的;联系是十分紧密的。现在主流的JVM的Javac编译器就是马丁奥德斯基编写的,包括JDK1.5和JDK1.8。那么Scala和Java以及JVM之间有什么样的联系呢?我们来分析一下,如下图所示:
可以看出Scala语言编译的范围要大于Java语言的编译范围,也就是说有的Java程序可以通过Scalac编译形成字节码,然后通过Scala运行器运行想要的class文件,因为Scala语言包含了部分Java语法。
但是Java编译器是无法,编译Scala程序然后用Java运行器执行的,因为Scala拥有自己一些特有的语法,这是Java编译器和运行器所顾及不到的。
同时Scala语言也有自己的类库SDK,这些类库可能会用到JDK提供的相关类库,主要是使用JDK对其进行进一步的包装形成SDK。
Scala语言的Scalac编译和Scala运行器文件都在Scala安装目录的bin文件夹下。
总结一下Scala语言的特点:
(1)Scala是一门以Java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言。
(2)Scala 是一门多范式 (multi-paradigm) 的编程语言,Scala支持面向对象和函数式编程。
(3)Scala源代码(.scala)会被编译成Java字节码(.class),然后运行于JVM之上,并可以调用现有的Java类库,实现两种语言的无缝对接。
(4)scala 单作为一门语言来看, 非常的简洁高效 。
(5)Scala 在设计时,马丁·奥德斯基是参考了Java的设计思想,可以说Scala是源于java,同时马丁·奥德斯基也加入了自己的思想,将函数式编程语言的特点融合到JAVA中, 因此学习过Java,只要在学习Scala的过程中,搞清楚Scala和java相同点和不同点,就可以快速的掌握Scala这门语言。
二、Scala程序执行流程分析
Scala语言的源代码文件的后缀名是.scala,编写完源代码然后经过Scalac编译器编译会生成两个.class文件,下面来分析一下具体的执行过程。先编写一个最简单的Scala程序:
object TestScala {
def main(args: Array[String]): Unit={
println("hello,scala,idea...")
}
}
1.object表示一个伴生对象,这里可以简单的理解就是一个对象
2.TestScala就是对象名字,它底层真正对应的类名是TestScala$,对象是TestScala$类型的一个静态对象MODULE$
3.def表示是一个方法,这是一个关键字
4.main表示方法名字,表示程序执行的入口
5.args:Array[String]表示形参,scala的特点是将参数名写在前面,类型在后
6.Array[String]表示类型是一个数组
7. :Unit=表示该函数的返回值为空
8.println 打印输出
9.当我们编写一个object TestScala,底层会生成两个.class文件分别是TestScala和TestScala$,对上面这两个.class文件进行反编译,如下所示:
TestScala
public final classTestScala
{public static voidmain(String[] paramArrayOfString)
{
TestScala$.MODULE$.main(paramArrayOfString);
}
}
TestScala$
public final classTestScala$
{public static finalMODULE$;static{new();
}public voidmain(String[] args)
{
Predef..MODULE$.println("hello,scala,idea...");
}private TestScala$() { MODULE$ = this; }
}
10.scala在运行时的流程如下:
(1)先从TestScala的main开始执行
(2)然后调用TestScala$类的主方法TestScala$.MODULE$.main
(3)即执行了TestScala$类中的main方法,打印输出了“hello,scala,idea...”,可以理解为我们在main中写的代码放在了TestData$的main方法中,在底层执行scala编译器做了一个包装。
我们可以通过Java程序来模拟上面Scala程序的执行过程,如下所示:
public classTestScala {public static voidmain(String[] paramArrayOfString) {
TestScala$.MODULE$.main(paramArrayOfString);
}
}final classTestScala$ {public static finalTestScala$ MODULE$;static{
MODULE$= newTestScala$();
}public voidmain(String[] args)
{
System.out.println("hello,scala,idea...");
}//private TestScala$() { MODULE$ = this; }
}
只要以后看到有 object objectName,应该有这样一个认识:
1、object objectName对应的是一个objectName$的一个静态对象MODULE$
2、在我们的程序中,是一个单例
Scala程序开发的注意事项:
Scala源文件以 “.scala" 为扩展名。
Scala程序的执行入口是main()函数。
Scala语言严格区分大小写。
Scala方法由一条条语句构成,每个语句后不需要分号(Scala语言会在每行后自动加分号),这也体现出Scala的简洁性。如果在同一行有多条语句,除了最后一条语句不需要分号,其它语句需要分号。
scala语言的底层是java实现的_Scala学习笔记一(与Java、Jvm的关系以及程序执行流程分析)...相关推荐
- scala与java的区别_Scala学习笔记及与Java不同之处总结
Scala与Java具有许多相似之处,但又有许多不同.这里主要从一个Java开发人员的角度,总结在使用Scala的过程中所面临的一些思维转变.这里只是总结了部分两种语言在开发过程中的不同,以后会陆续更 ...
- scala java抽象理解_Scala学习笔记(五) 抽象类以及类中的一些语法糖
1. 抽象类 Scala 的抽象类跟Java的一样,不能被实例化. 1.1抽象字段 抽象类中,变量不使用就无需初始化,可以等到子类继承时再进行初始化. scala> abstract class ...
- Java 8 函数式编程学习笔记
Java 8 函数式编程学习笔记 @(JAVASE)[java8, 函数式编程, lambda] Java 8 函数式编程学习笔记 参考内容 Java 8中重要的函数接口 扩展函数接口 常用的流操作 ...
- Java高并发编程学习(三)java.util.concurrent包
简介 我们已经学习了形成Java并发程序设计基础的底层构建块,但对于实际编程来说,应该尽可能远离底层结构.使用由并发处理的专业人士实现的较高层次的结构要方便得多.要安全得多.例如,对于许多线程问题,可 ...
- Java虚拟机(JVM)与Java内存模型(JMM)学习笔记
Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...
- JAVA基础与高级学习笔记
JAVA基础与高级学习笔记 /记录java基础与高级,除了较简单的内容,没有必要记录的没有记录外,其余的都记录了/ java初学者看这一篇就够了,全文 6万+ 字. JAVA基础 java会出现内存溢 ...
- 《Java编程思想》学习笔记【一对象导论】
重头学习Java,大一没怎么学,大二上课也没听.(流下不学无术的眼泪) 所有编程语言都提供抽象机制,我们所能解决的问题的复杂性直接取决于抽象的类型和质量. 汇编语言是对底层机器的轻微抽象," ...
- Java多线程- 线程池的基本使用和执行流程分析 - ThreadPoolExecutor
线程池的实现原理 池化技术 一说到线程池自然就会想到池化技术. 其实所谓池化技术,就是把一些能够复用的东西放到池中,避免重复创建.销毁的开销,从而极大提高性能. 常见池化技术的例如: 线程池 内存池 ...
- 零基础学习Java开发,这些学习笔记送给你
因为Java具备很多特点,并且在企业中被广泛应用为此很多小伙伴选择学习Java基础开发,但是零基础学习Java技术开发需要我们制定Java学习路线图对于我们之后的学习会非常有帮助. 零基础学习Java ...
最新文章
- 特斯拉放弃SAP,仅25个人4个月就开发了整套ERP!就问你服不服?
- 动态SQL字符长度超过8000
- Resource stopwords not found. Please use the NLTK Downloader to obtain the r
- 写代码的16个好习惯,减少80%的bug
- vue编写to-do list源码
- hadoop3.1.2版本中FsImage与Editslog合并解析
- 深度学习(tensorflow+keras)性能问题
- Ogre1.8.1 Basic Tutorial 6 - The Ogre Startup Sequence
- 不同VPC路由器通过静态路由、动态路由(OSPF)实现网络互通实战
- 2.1 InnoDB存储引擎(概述、版本、体系结构)
- 需求分析及技术方案设计
- openpyxl插入分页符
- oc引导windows蓝屏_蓝屏错误疑难解答
- 数模学习(七)--- 多元线性回归
- 1075:字符串统计
- java中put是什么意思_关于java:请求参数和PUT方法
- TIPC 透明通信协议
- phpwind移动社区APP生成步骤说明
- LVS DR TUN(IP Tunneling)介绍
- Java的基本特性和优势
热门文章
- 2.7 负采样-深度学习第五课《序列模型》-Stanford吴恩达教授
- 第十四章 降维操作-机器学习老师板书-斯坦福吴恩达教授
- 3.12 总结-深度学习-Stanford吴恩达教授
- 5.1 代价函数-机器学习笔记-斯坦福吴恩达教授
- MFC EDIT控件 接收“回车”与“ESC”键 退出问题!
- DFTug Test_point
- 通过串口输入控制指令控制图像在VGA显示器中的显示位置
- 码code | 巧用2种方法,打破20条云开发数据库限制
- SpringCloud实践分享-日志收集Kafka-ELK
- angular2 安装