JDK、JRE、JVM 分别是什么关系?
JVM:Java 运行时环境,运行 Java 程序(运行 Java 字节码)。
JRE:包括 JVM 和 Java Class Library(必要的类库 - 导包)两部分。
JDK:包括 JRE 和 编写 Java 程序所必需的开发工具 {
编译:javac 命令
反编译:javap 命令
启动 JVM 运行 Java 程序的 Java 命令
调试:jdb 命令 - debug
文档注释(Java API 文档):javadoc 命令 - 注释
基于 JXM 的可视化监控:jconsole 命令 // JXM - 暂无需理解
打包:jar 命令
... ...
}。
为什么 Java 被称作是 “平台无关的编程语言” ?
[ 为什么 Java 被称作是 “平台无关的编程语言” ?] 等同于 [ 为什么 Java “一次编译,到处运行” ? ]
- Java 源文件(`.java`)可被编译成字节码文件(`.class`);
- JVM 是一个可以执行 Java 字节码的虚拟机进程;
- JVM 有针对不同系统(Windows、Linux、macOS)的特定实现(目的是使用相同的字节码,它们都会给出相同的结果)。
综上所述,字节码和不同系统的 JVM 实现是 Java “一次编译,到处运行” 的关键所在。
Java 和 C++ 的区别?
- 相同点:
- Java 和 C++ 都是面向对象语言;
- Java 和 C++ 都支持封装、继承和多态。
面向对象语言的三大特征:封装、继承和多态。
- 不同点:
- Java 不提供指针来直接访问内存,程序内存更加安全;
- Java 的类之间支持单继承;C++ 的类之间支持多继承;Java 的接口之间支持多继承;
- Java 有自动内存管理垃圾回收机制(GC),不需要程序员手动释放无用内存;
- Java 仅支持方法重载;C++ 支持方法重载和操作符重载; // 操作符包括运算符
- ... ...
什么是字节码?采用字节码的最大好处是什么?
- 什么是字节码?
供 JVM 理解的代码叫做字节码(即扩展名为 `.class` 的文件)。 // 字节码仅面向 JVM
- Java 程序从源文件到运行的流程
1. 源代码(`.java`)-> 2. 编译器 -> 3. `.class` -> 4.JVM -> 5. 解释器&即时编译器(JIT编译器) -> 6. 机器码 -> 7. 机器(系统)
图 1
热点代码:在程序运行时被频繁执行的代码段。
JIT编译器完成第一次编译后会将字节码对应的机器码保存下来,下次可以直接使用。
- 高级编程语言按照程序的执行方式分为两种:
1. 编译型:
编译型语言会通过编译器将源代码一次性翻译成可被该平台(系统)执行的机器码。
一般情况下,编译型语言的执行速度比较快,开发效率比较低。
常见的编译型语言有:C、C++、GO、Rust ...
2. 解释型:
解释型语言会通过解释器一句一句的将代码解释为机器码后再执行。
一般情况下,解释型语言的开发效率比较高,执行速度比较慢。
常见的解释型语言有:Python、JavaScript、PHP ...
- 为什么说 Java 语言 “编译和解释并存” ?
因为 Java 程序从源文件到运行要经过先编译,后解释两个步骤。
- 采用字节码的最大好处是什么?
1. “编译与解释并存” // 在一定程度上解决了传统解释型语言执行速度比较慢的问题
2. “一次执行,到处运行”
Java 是静态类型语言还是动态类型语言?
- 静态类型语言和动态类型语言两者的区别就在于对类型的检查是在编译期还是在运行期。
- 静态类型语言对类型的检查是在编译期;动态类型语言对类型的检查是在运行期。
- 静态类型语言是判断变量自身的类型信息 {
变量在声明时必须显式地指定类型,而不能根据赋值来推断类型。
};
- 动态类型语言是判断变量值的类型信息 {
例如,假设我们声明了一个变量 x 并且给它赋值为整数 1 。根据这个赋值操作,系统可以推断出变量 x 的类型为整数。
但是如果我们在后续的代码中将变量 x 的值修改为字符串 "Hello",那么变量 x 的类型会随之改变为字符串类型。
因此,该观点强调了变量值是决定变量类型的关键因素。是值决定了变量的类型信息,而不是变量本身具有固定的类型。
};
- Java 是静态类型语言;js、Python 是动态类型语言。