目录
JDK和JRE和JVM分别是什么?有什么关系?
什么是字节码,采用字节码的好处是什么 ?
Java 程序从源代码到运行的过程
为什么 Java语言"编译与解释并存"
Java 和 C++、Go 语言的区别,各自的优缺点?
JDK和JRE和JVM分别是什么?有什么关系?
首先JVM是Java虚拟机,专门用来运行字节码文件,JVM是实现Java跨平台的关键所在,JVM屏蔽了各种不同的操作系统之间的差异,使得同样的Java程序可以在不同的操作系统上运行出相同的结果.
JRE 是 Java运行时环境包含Java已经编译好必备的软件环境,包含了JVM,JRE只能运行程序,不能创建Java程序.
JDK 是Java开发者工具包,包含了JRE,JVM,调试分析等工具,用来创建和编译Java程序,如果想使用Java进行开发,那么就需要安装JDK.
三者的关系就是 : JRE包含JVM, JDK包含了 JRE,JVM
什么是字节码,采用字节码的好处是什么 ?
JVM能够理解并且能够运行的代码就是字节码. 字节码只面向虚拟机,不针对特定的一种机器.
字节码解决了传统解释性语言效率低的问题,同时也保留了传统解释性语言的可移植性,使得Java可移植性强实现跨平台,其次,不同的操作系统对应着不同的JVM,但是字节码是通用的,可以使得Java程序无需重新编译,就可以在不同操作系统上/平台上运行. 也就是所谓的 "一次编译,到处运行".
main方法可以被其他方法调用么 ?
Java 程序从源代码到运行的过程
我们写的Java程序也就是.java文件会先使用Javac进行编译生成.class文件也就是字节码文件,然后会通过解释器逐行进行解释,但是当我们的方法/代码块多次执行这时这段代码会被认为是热点代码,于是就会交给Java即时编译器JIT来进行运行,经过JIT编译后会将字节码文件保存起来,当下一次使用的时候可以直接使用,这样的速度就会提升很多, JIT编译器属于运行时编译,经过解释器 & JIT即时编译器 进行解释/编译 最终会生成机器可以理解的机器码,然后交给机器来运行.
为什么 Java语言"编译与解释并存"
首先解释一下 什么是 "编译型语言" 和 "解释型语言"
"编译型语言" : 编译型语言是一次性的将源代码翻译成 机器所能理解的机器码,执行速度非常的快,但是开发效率比较低, 比如 C, C++, Rust
"解释型语言" : 解释型语言是每执行代码,一句一句的将源代码翻译成机器所能理解的机器码,执行速度满, 但开发效率比较高, 比如 JS, python.
为什么Java语言是 "解释与编译并存的" ?
Java语言是会先将源代码经过Javac进行编译成.class文件,也就是字节码,然后在通过 解释器&JIT来解释/编译生成平台所能理解的机器码,所以Java语言是解释与编译并存的.
Java 和 C++、Go 语言的区别,各自的优缺点?
- Java
- 优点
- Java语言使用起来简单,语法简便
- Java可以实现跨平台,一次编译,到处运行
- Java可移植性高,强大的生态
- 面向对象程序,具有 继承,封装,多态的特征
- Java无需手动释放内存,自动内存管理,减少了内存泄漏的风险
- 缺点
- 由于JVM的存在,运行速度比较慢
- 对于实时性比较高的场景,不如C++,Go这样的编程语言.
- 优点
- C/C++
- 优点
- 速度快,适合编写需要高性能的应用程序
- 应用广泛,特别是在游戏开发、操作系统和嵌入式系统开发方面
- 灵活性高,可以直接访问硬件和内存
- 缺点
- 学习难度较高,需要掌握指针、内存管理等底层知识
- 容易出现内存泄漏和指针错误等问题
- 编写代码过程中需要更多的手动管理,相比Java更容易出错
- 优点
- Go
- 优点
- 高并发,天生支持协程,能够轻松编写高效的并发程序
- 简单易学,语法简洁,上手容易
- 静态类型语言,可以避免一些潜在的运行时错误
- 快速编译,可以快速构建和部署应用程序
- 缺点
- 缺乏丰富的类库,与Java和C++相比有些不足
- 在一些性能要求极高的场景中可能不如C++表现
- 语言本身还比较年轻,相关生态和工具还需要进一步完善
- 优点
参考 : Java基础常见面试题总结(上) | JavaGuide(Java面试+学习指南)
编程导航面试题部分 : 编程导航 - 做您编程路上的导航员