1.编译型语言和解释型语言的区别
Java语言是一种特殊的高级语言,它既具有解释型语言的特征,也具有编译型语言的特征,因为Java程序要经过先编译,后解释两个步骤。
有的编程语言要求必须提前将所有源代码一次性转换成二进制指令,也就是生成一个可执行程序(Windows 下的 .exe)(有一个成品,以后也可以使用),比如C语言、C++、Golang、Pascal(Delphi)、汇编等,这种编程语言称为编译型语言,使用的转换工具称为编译器。
有的编程语言可以一边执行一边转换,需要哪些源代码就转换哪些源代码,不会生成可执行程序,比如 Python、JavaScript、PHP、Shell、MATLAB 等,这种编程语言称为解释型语言,使用的转换工具称为解释器。
类型 | 原理 | 优点 | 缺点 |
---|---|---|---|
编译型语言 | 通过专门的编译器,将所有源代码一次性转换成特定平台(Windows、Linux 等)执行的机器码(以可执行文件的形式存在)。 | 编译一次后,脱离了编译器也可以运行,并且运行效率高。 | 可移植性差,不够灵活。 |
解释型语言 | 由专门的解释器,根据需要将部分源代码临时转换成特定平台的机器码。 | 跨平台性好,通过不同的解释器,将相同的源代码解释成不同平台下的机器码。 | 一边执行一边转换,效率很低。 |
分析
回过头来看Java,我们知道,Java代码执行前需要先编译成class文件,再交由JVM执行。因此从这一过程来看,Java可以称之为编译型语言。
然而,class文件的内容属于一种中间语言,计算机无法直接识别,仍然需要由JVM解释成机器语言执行,因此这个角度来说,可以称之为解释型语言。
2.通过JVM实现跨平台
Java语言里负责解释执行字节码文件的是Java虚拟机,即JVM (Java Virtual Machine)。JVM是可运行Java字节码文件的虚拟计算机。所有平台上的JVM向编译器提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机能理解的代码,然后由虚拟机来解释执行。在一些虚拟机的实现中,还会将虚拟机代码转换成特定系统的机器码执行,从而提高执行效率。
当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码不面向任何具体平台,只面向JVM。不同平台上的JVM都是不同的,但它们都提供了相同的接口。JVM是Java程序跨平台的关键部分,只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。显然,相同的字节码程序需要在不同的平台上运行,这几乎是“不可能的”,只有通过中间的转换器才可以实现,JVM 就是这个转换器。
JVM是一个抽象的计算机,和实际的计算机一样,它具有指令集并使用不同的存储区域。它负责执行指令,还要管理数据、内存和寄存器。
- Oracle公司制定的Java虛拟机规范在技术上规定了JVM的统-标准,具体定义了JVM的如下细
节:
➢指令集
➢寄存器
➢类文件的格式
➢栈
➢垃圾回收堆
➢存储区
Oracle公司制定这些规范的目的是为了提供统一的标准, 最终实现Java程序的平台无关性。
3.javac编译程序为什么不需要指定目标文件的文件名
javac编译程序
java 解释运行程序
4.java源文件的命名规则
5.JDK9新增的jshell工具
JDK 9工具的一大改进就是提供了jshell 工具,它是一个REPL (Read-Eval-Print Loop)工具,该工具是一个交互式的命令行界面,可用于执行Java 语言的变量声明、语句和表达式,而且可以立即看到执行结果。因此,我们可以使用该工具来快速学习Java或测试Java的新API。
对于一个立志学习编程(不仅是Java)的学习者而言,一定要记住:看再好的书也不能让自己真正掌握编程(即使如《疯狂Java讲义》也不能)!书只能负责指导,但最终一定需要读者自己动手。即使是一个有经验的开发者,遇到新功能时也会需要通过代码测试。
在没有jshell时,开发者想要测试某个新功能或新API,通常要先打开IDE工具(可能要花1分钟),然后新建一个测试项目,再新建一个类,最后才可以开始写代码来测试新功能或新API。这真要命啊!而jshell 的出现解决了这个痛点。
开发者直接在jshell界面中输入要测试的功能或代码,jshell 会立刻反馈执行结果,非常方便。启动jshell非常简单,只要在命令行窗口输入jshell 命令,即可进入jshell交互模式。
6.Java 9 的G1垃圾回收器
内存泄漏
传统的C/C++等编程语言,需要程序员负责回收已经分配的内存。显式进行垃圾回收是一件比较困难的事情,因为程序员并不总是知道内存应该何时被释放。如果一些分配出去的内存得不到及时回收,就会引起系统运行速度下降,甚至导致程序瘫痪,这种现象被称为内存泄漏。
显式进行垃圾回缺点
- 程序忘记及时回收无用内存,从而导致内存泄漏,降低系统性能。
- 程序错误地回收程序核心类库的内存,从而导致系统崩溃。
垃圾回收
Java语言不需要程序员直接控制内存回收,Java程序的内存分配和回收都是由JRE在后台自动进行的。JRE会负责回收那些不再使用的内存,这种机制被称为垃圾回收(GarbageCollection,GC)
Java的堆内存是一个运行时数据区,用以保存类的实例(对象),Java虚拟机的堆内存中存储着正在运行的应用程序所建立的所有对象,这些对象不需要程序通过代码来显式地释放。一般来说,堆内存的回收由垃圾回收器来负责,所有的JVM实现都有一个由垃圾回收器管理的堆内存。垃圾回收是一种动态存储管理技术,它自动释放不再被程序引用的对象,按照特定的垃圾回收算法来实现内存资源的自动回收功能。
散称知识点:
- Java标准版开发包 JDK(Java SE Development Kit)包含 Java运行时环境 JRE(Java Runtime Environment)包含JVM。
- 学生提问:为什么选择用户变量?用户变量与系统变量有什么区别?
答:用户变量和系统变量并没有太大的差别,只是用户变量只对当前用户有效,而系统变量对所有用户有效。为了减少自己所做的修改对其他人的影响,故设置用户变量避免影响其他人。对于当前用户而言,设置用户变量和系统变量的效果大致相同,只是系统变量的路径排在用户变量的路径之前。这可能出现一种情况:如果Path 系统变量的路径里包含了java 命令,而PATH用户变量的路径里也包含了java命令,则优先执行Path系统变量路径里包含的iava命令。