Java引用修改值

 

public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
    
    @Override
    public String toString() {
        return " "+val+" ";
    }
}

ListNode A = new ListNode(1);
ListNode B = null;
A.next = B;
B = new ListNode(1); // A.next = null
A.next = B;// A.next.val =1;
B.val = 2; // A.next.val =2;
ListNode C = new ListNode(3);
B = C;// A.next.val = 2

 

### Java 中的传递与引用传递机制 Java 语言中关于参数传递的机制,一直是开发者容易混淆的问题之一。Java 中的方法调用始终采用的是 **传递**(pass-by-value)方式,无论是基本类型还是引用类型,传递的都是的副本。理解这一点有助于避免在实际开发中出现参数修改无效等常见问题。 #### 传递的基本原理 在 Java 中,传递指的是将实际参数的复制一份传递给方法的形式参数。这意味着方法内部对参数的修改不会影响到外部的原始变量。 对于基本数据类型(如 `int`、`double`、`boolean` 等),传递的是变量的本身。例如: ```java public static void modifyInt(int x) { x = 100; } public static void main(String[] args) { int a = 10; modifyInt(a); System.out.println(a); // 输出 10 } ``` 上述代码中,`modifyInt` 方法接收的是 `a` 的一个副本,因此对 `x` 的修改不会影响 `a` 的[^1]。 #### 引用类型的传递 对于引用类型(如对象、数组等),传递的是对象引用的副本,而不是对象本身。这意味着方法内部可以修改对象的内容,但无法改变外部引用指向的对象。 例如: ```java public static void modifyPerson(Person p) { p.setName("Tom"); p = new Person("Jerry"); } public static void main(String[] args) { Person person = new Person("John"); modifyPerson(person); System.out.println(person.getName()); // 输出 Tom } ``` 在这个例子中,`modifyPerson` 方法内部对 `p.setName("Tom")` 的调用修改了原始对象的内容,因此 `person.getName()` 返回 `"Tom"`。然而,`p = new Person("Jerry")` 仅改变了方法内部引用的指向,并不影响外部的 `person` 变量,因此输出仍为 `"Tom"`[^2]。 #### 引用传递的误解 Java 中并不存在真正的引用传递(pass-by-reference),即不能直接将变量的引用传入方法并修改其指向。有些开发者误认为 Java 存在引用传递,是因为引用类型参数可以修改对象的状态,但这只是因为传递的是引用的副本,而引用指向的对象在堆中是共享的。 例如,修改对象属性的行为会影响外部对象,但重新赋引用并不会影响外部引用的指向[^3]。 #### 传递与引用传递的区别总结 | 特性 | 传递 | 引用传递(Java 不支持) | |--------------------|----------------------------------------|--------------------------------------| | 参数传递方式 | 传递变量的副本 | 传递变量本身的引用 | | 对基本类型的影响 | 方法内修改不影响外部 | 方法内修改可影响外部 | | 对引用类型的影响 | 可修改对象内容,但无法更改引用指向 | 可修改对象内容,也可更改引用指向 | | Java 是否支持 | ✅ 支持 | ❌ 不支持 | #### 特殊情况:String 与 StringBuffer 的行为差异 字符串类型 `String` 是不可变对象,因此在方法中对字符串的重新赋不会影响外部变量: ```java public static void changeString(String str) { str = "New Value"; } public static void main(String[] args) { String s = "Original"; changeString(s); System.out.println(s); // 输出 Original } ``` 而对于 `StringBuffer` 或 `StringBuilder`,由于它们是可变对象,方法中修改内容会影响外部: ```java public static void changeStringBuffer(StringBuffer sb) { sb.append(" Appended"); } public static void main(String[] args) { StringBuffer sb = new StringBuffer("Initial"); changeStringBuffer(sb); System.out.println(sb); // 输出 Initial Appended } ``` 但如果在方法内部重新创建了对象,外部引用不会受到影响[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值