主要是复习和不漏,不适合自学,想看的可以看一下
一、运行 Java 程序
运行 Java 程序需要经过编译和执行两个关键步骤:
- 编译阶段:借助Javac.exe编译器对 Java 源程序进行编译操作,执行命令Javac xxx.java,该过程会生成对应的xxx.class字节码文件。字节码文件是 Java 程序的中间表示形式,具有平台无关性的特点。
- 执行阶段:使用java命令运行生成的xxx.class字节码文件,命令为java xxx(注意此处不需要加.class后缀) 。Java 程序最终在 JVM(Java 虚拟机)中运行,JVM 充当了 Java 程序与操作系统之间的桥梁,使得 Java 程序实现 “一次编写,到处运行”。
这里还涉及到 JDK、JRE、JVM 三个重要概念,它们之间的关系如下:
- JDK(Java Development Kit):即 Java 开发工具包,它包含了 JRE 以及一系列开发工具,像我们编译程序使用的javac工具就属于 JDK 中的开发工具集。
- JRE(Java Runtime Environment):Java 运行时环境,由 JVM 和 JavaSE 标准类库组成。JRE 是运行 Java 程序所必需的环境。
- JVM(Java Virtual Machine):Java 虚拟机,负责加载字节码文件并解释执行,它屏蔽了底层操作系统的差异。
问题:JDK,JRE,JVM之间的关系?
JDK = JRE+开发工具集(比如:javac)
JRE = JVM+JavaSE标准类库
二、一些不常见的关键字
1. instanceof
instanceof关键字用于判断某个对象是否属于特定类或接口的实例,返回值为布尔类型。在实际开发中,常用于类型检查和多态性的处理,例如:
|
System.out.println(animal instanceof Dog); |
上述代码会判断animal对象是否是Dog类的实例,并返回相应的布尔结果。
2. native
native关键字用于修饰方法,表明该方法的实现是由其他语言(如 C、C++)编写的,即本地方法。当 Java 需要调用底层操作系统的功能,或者希望利用其他语言的高效性能时,会使用到本地方法。
3. transient
transient用于修饰变量,在对象序列化过程中,被该关键字修饰的变量不会被序列化。当对象被反序列化后,transient字段会被设置为默认值(如null、0)。例如:
|
class User implements Serializable { private String username; private transient String password; } |
在上述代码中,password字段在对象序列化时不会被保存,增强了数据安全性。
4. strictfp
strictfp能够确保浮点数运算在不同平台上都能获得一致的结果,它可以修饰类、接口或者方法,避免因硬件或 JVM 实现差异导致的舍入误差。示例如下:
|
public strictfp double calculate() { double a = 1.0 / 3.0; double b = 2.0 / 3.0; return a + b; } |
通过strictfp修饰,保证了calculate方法中浮点数运算结果的一致性。
5. volatile
volatile用于修饰变量,保证不同线程对该变量操作时的可见性,即一个线程修改了这个变量的值,新值对于其他线程来说是立即可见的。由于变量的可见性是影响多线程安全的重要因素,因此volatile在多线程编程中扮演着重要角色。
6. assert
assert用于调试阶段进行断言检查,若断言条件不成立,会抛出AssertionError。通常用于验证方法参数的合法性等场景,如:
|
public class Calculator { public int divide(int numerator, int denominator) { // 确保分母不为零(通常用if判断,但断言可用于内部防御性检查) assert denominator != 0 : "分母不能为零"; return numerator / denominator; } } |
在调试Calculator类的divide方法时,assert可以帮助快速发现参数不合法的情况。
以上就是 JavaSE 第一章 “初识 Java” 的核心复习要点,掌握这些内容能够为后续 Java 学习打下坚实的基础。
1050

被折叠的 条评论
为什么被折叠?



