AI面试总结:System.exit(0)和System.exit(1)区别
前言 简单记录一下Java面试中System.exit(0...
Java面试中常见的问题就是关于「值拷贝」和「地址拷贝」,简单记录于此,方便自己查阅和学习。
先说结论:
Java 只有「值拷贝」,没有「地址拷贝」
Java 永远是 pass-by-value(值传递)
基本类型拷贝的就是「值本身」
int a = 10; int b = a; b = 20; System.out.println(a); // 10
完完全全的值拷贝
引用类型拷贝的「引用的值」
Person p1 = new Person("Tom"); Person p2 = p1; p2.setName("Jerry"); System.out.println(p1.getName()); // Jerry
发生了什么:
栈: p1 ──┐ ├──► 堆中的 Person 对象 p2 ──┘
仍然是值拷贝,只是值是“地址”
Java 是值传递
void change(int x) { x = 100; } int a = 10; change(a); System.out.println(a); // 10
方法里改的是 形参的副本
void change(Person p) { p.setName("Changed"); } Person person = new Person("Tom"); change(person); System.out.println(person.getName()); // Changed
关键点:
void change(Person p) { p = new Person("New"); } Person person = new Person("Tom"); change(person); System.out.println(person.getName()); // Tom
原因:
再次证明:Java 是值传递
当你在匿名类中访问局部变量:
int x = 10; Runnable r = () -> System.out.println(x);
本质是:
class Inner { private int val$x; Inner(int x) { this.val$x = x; } }
| 场景 | 拷贝的是什么 |
|---|---|
| 基本类型 | 数值本身 |
| 引用类型 | 引用的值(地址值) |
| 方法参数 | 永远都是值拷贝 |
| Java 整体 | 只有值传递 |
Java 没有地址拷贝,只有“值拷贝 + 引用的值”