gpt4 book ai didi

Java 传递值混淆

转载 作者:行者123 更新时间:2023-11-30 07:14:00 25 4
gpt4 key购买 nike

好吧,有点奇怪的问题。我有以下代码,它只是创建一个名为 DumObj 的简单 java 对象,并使用 setter 方法设置一个字符串值。然后使用 DumObj 作为参数从 TestBed 类调用一些方法。

我最初认为调用 TestBed.updateId(DumObj) 不会影响我的 DumObj,并且设置为“apple”的 ID 的初始值将保持不变。 (因为整个按值传递的事情)

然而,ID 的值被设置为“orange”的更新值。好吧,我想,这很奇怪,所以我写了另一个方法,TestBed.setToNull(DumObj)。此方法只是将 DumObj 设置为 null,因此当我调用 getId() 方法时,我期望得到一个空指针异常。

但是我得到的输出是 ID 的值仍然设置为“橙色”。

代码如下:

    public static void main(String[] args) 
{
TestBed test = new TestBed();
DumObj one = new DumObj();

one.setId("apple");
System.out.println("Id : " + one.getId());

test.updateId(one);
System.out.println("Id : " + one.getId());

test.setToNull(one);
System.out.println("Id : " + one.getId());
}

public void updateId(DumObj two)
{
two.setId("orange");
}

public void setToNull(DumObj two)
{
two = null;
}

输出如下:

    Id : apple
Id : orange
Id : orange

这可能是我忽略的非常简单的事情,但有人可以向我解释这种行为吗? Java 不是按值传递吗?

最佳答案

当你写作时

DumObj one = new DumObj();

认识到 one 不是 DumObj 很重要 - 它是对 DumObj引用,以及引用按值传递

因此您始终按值传递,并且您可以更改传递的引用(因此您传递的引用现在指向不同的对象)。但是,您的对象本身可能是可变的,因此:

   one.setValue(123);

将更改引用的对象。当你调用它时:

public void setToNull(DumObj two)
{
two = null;
}

您正在更改传递的引用(记住 - 它是通过传递的,并且是方法的局部变量!)因此您的原始对象和原始引用不受影响。

关于Java 传递值混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18763460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com