在Java中,若执行以下代码,最终输出结果是什么? ``` class Person { String name; int age; } public class Main { public static void modify(Person p) { p = new Person(); p.name = "Alice"; } public static void main(String[] args) { Person p1 = new Person(); p1.name = "Bob"; modify(p1); System.out.println(p1.name); } } ```
答案解析
### 核心考点说明
本题考察Java方法参数的引用传递机制,需理解对象引用在方法调用时的复制特性及堆栈内存的关系。
### 解题思路分析
1. `p1`在堆内存中创建对象,`name`属性初始化为"Bob"
2. `modify`方法接收的是`p1`引用的副本(形参`p`),此时`p`与`p1`指向同一对象
3. 方法内`p = new Person()`使形参`p`指向新对象,但原`p1`的引用不受影响
4. 最终输出的是原对象的`name`属性
### 选项详细分析
- **A**:错误。误以为方法内对形参的重新赋值会影响实参,混淆引用传递的本质是值传递(复制引用地址)
- **B**:正确。实参`p1`始终指向原对象,方法内操作不影响其实例属性
- **C**:错误。可能误认为`new Person()`后未显式赋值的`name`为`null`,但此处`p1`的属性未被修改
- **D**:错误。代码语法正确,无编译错误
### 易错点提醒
- 方法调用时对象引用的值传递特性容易与C++的引用传递混淆
- 方法内对形参的重新赋值只会改变局部变量的指向,不影响原引用
正确答案:B