gpt4 book ai didi

Java 按值传递——你能解释一下吗?

转载 作者:行者123 更新时间:2023-12-02 09:06:56 24 4
gpt4 key购买 nike

我读到this excellent article这是有道理的:Java 是严格按值传递的;当对象是参数时,对象的引用通过值传递

但是,我完全困惑为什么下面的代码片段可能有效。Foo 有一个 String 成员变量 a,它是不可变的,每次都需要烧入。第一种燃烧方法(已注释掉)应该可以正常工作,而且确实如此。第二种方法将 a 的引用设置为所传递的值。如果 newstr 是临时变量,则它不应该起作用。预期输出结果为:

Totally temp
NULL

但是,我明白了

Totally temp
Totally temp
为什么?临时变量引用仍然很好,这只是纯粹的运气吗?

public class Foo {
String a;
public Foo(){}
public void burna(String newstr){
// a = new String(newstr);
a = newstr; /*this should not work: */
}
}

public class foobar {
Foo m_foo;
public foobar(){};
public void dofoo(){
String temp = new String("Totally temp\n");
m_foo.burna(temp);
System.out.print(m_foo.a);
}

}

public static void main(String[] args) {
Foo myfoo = new Foo();
foobar myfoobar = new foobar();

myfoobar.m_foo = myfoo;
myfoobar.dofoo();
System.out.print(myfoo.a);

}

最佳答案

Foo has a String member variable a which is immutable and needs to be burned in every time.

不,它没有:它没有标记为final:

public class Foo {
String a;
...
}

该变量是完全可变的 - 您可以随时更改它以引用不同的字符串,这就是您在 burna 方法中所做的事情。

我目前不明白为什么您认为这行不通:

public void burna(String newstr){
a = newstr; /*this should not work: */
}

即将 a设置为 newstr - 这是对 a 的引用字符串(或空)。这就是它所做的一切。我不确定你所说的“烧入”变量是什么意思。

您正在调用 burna 并传入对带有文本“Totally temp\n”的字符串的引用 - 因此 a 设置为对该字符串的引用.

“如果 newstr 是临时变量,则它不应该工作”是什么意思?不存在“临时变量”这样的东西。有一个本地变量 - 但对象不会仅仅因为引用它的变量超出范围而被销毁。这就是让你感到困惑的地方吗?

您的程序发生了一些事情 - foobar 类可能无法帮助您理解。您能否尝试将代码简化到仍然让您感到困惑的程度,但事情却变得更少了?这样我们就可以更精确地隔离困惑的根源。

关于Java 按值传递——你能解释一下吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3182049/

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