前言:工作中常用到Java,但一些知识点虽然知道,但总是很模糊,所以,特写个《Java常见坑》系列供自己及他人查漏补缺。内容多来源于网上资料整理。
1、认识虚拟机(JVM)
Java的一个非常重要的特点就是与平台的无关性。
那么,Java是如何实现这一特点的呢?
一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java虚拟机后,Java在不同平台上运行时不需要重新编译。Java使用虚拟机屏蔽了与具体平台相关的信息,使得Java编译程序只需生成在Java虚拟机上运行的字节码,就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
实际上,JVM 并不是只有一种!只要满足 JVM 规范,每个公司、组织或者个人都可以开发自己的专属 JVM。 也就是说我们平时接触到的 HotSpot VM 仅仅是是 JVM 规范的一种实现而已。
2、字节码
1)什么是字节码?
在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。
2)采用字节码的好处是什么?
Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以, Java 程序运行时相对来说还是高效的(不过,和 C++,Rust,Go 等语言还是有一定差距的),而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。
3、为什么说 Java 语言“编译与解释并存”?
我们可以将高级编程语言按照程序的执行方式分为两种:
- 编译型 :编译型语言 会通过编译器将源代码一次性翻译成可被该平台执行的机器码。一般情况下,编译语言的执行速度比较快,开发效率比较低。常见的编译性语言有 C、C++、Go、Rust 等等。
- 解释型 :解释型语言会通过解释器一句一句的将代码解释(interpret)为机器代码后再执行。解释型语言开发效率比较快,执行速度比较慢。常见的解释性语言有 Python、JavaScript、PHP 等等。
Java 语言既具有编译型语言的特征,也具有解释型语言的特征。Java 程序要先编译生成字节码(.class 文件),然后由 Java 解释器来解释执行。
4、Java 和 C++的区别?
1)都是面向对象的语言,都支持封装、继承和多态。
2)Java 不提供指针来直接访问内存,程序内存更加安全。
3)Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
4)Java 有自动内存管理垃圾回收机制(GC),不需要程序员手动释放无用内存。
5)C ++同时支持方法重载和操作符重载,但是 Java 只支持方法重载(操作符重载增加了复杂性,这与 Java 最初的设计思想不符)。