Java:Constructor,使用new初始化:为什么这段代码不';在最后一句话里,你不打印512吗?
我想这段代码打印512,但它打印100。 我认为Java:Constructor,使用new初始化:为什么这段代码不';在最后一句话里,你不打印512吗?,java,constructor,Java,Constructor,我想这段代码打印512,但它打印100。 我认为f=newfoo(512)将f的引用从新的Foo(100)更改为新的Foo(512);然后int num应该初始化为512。但事实并非如此。 我对这个准则有什么误解吗 class Foo{ private int num; public Foo(int n){ num =n; } public void setNum(int n){ num = n; } public int getNum(){ re
f=newfoo(512)代码>将f的引用从新的Foo(100)更改为新的Foo(512);然后int num应该初始化为512。但事实并非如此。
我对这个准则有什么误解吗
class Foo{
private int num;
public Foo(int n){
num =n;
}
public void setNum(int n){
num = n;
}
public int getNum(){
return num;
}
}
public class Bar{
static void changeFoo(Foo f){
f = new Foo(512);
}
public static void main(String[] args){
Foo f = new Foo(100);
changeFoo(f);
System.out.println("f is " + f.getNum());
}
}
如果不返回Foo
并将其分配给引用,则无法修改调用方的引用。像
static Foo changeFoo(Foo f){
return new Foo(512);
}
public static void main(String[] args){
Foo f = new Foo(100);
f = changeFoo(f);
System.out.println("f is " + f.getNum());
}
或者,通过调用方的引用分配字段,如
static void changeFoo(Foo f){
f.num = 512; // <-- assuming your num field is named num.
}
如果不返回Foo
并将其分配给引用,则无法修改调用方的引用。像
static Foo changeFoo(Foo f){
return new Foo(512);
}
public static void main(String[] args){
Foo f = new Foo(100);
f = changeFoo(f);
System.out.println("f is " + f.getNum());
}
或者,通过调用方的引用分配字段,如
static void changeFoo(Foo f){
f.num = 512; // <-- assuming your num field is named num.
}
java完全是按值传递
,而不是按引用传递
,这是您的错误所在。顺便说一下,您可以简化此代码,因为您的类Foo
本质上与java.lang.Integer
相同(特别是您的setNum()
方法从未被调用),谢谢,这里的pass-by-reference似乎有效java完全是pass-by-value
,而不是pass-by-reference
,这就是您的错误所在。顺便说一下,您可以简化此代码,因为您的类Foo
本质上与java.lang.Integer
相同(特别是您的setNum()
method从未调用)谢谢,这里的pass-by-reference似乎有效谢谢您的帮助。它确实更改了Foo引用。那么,为什么我们不能像我的代码那样更改void方法中调用方的引用呢?我搞不清楚原因。谢谢你的帮助。它确实更改了Foo引用。那么,为什么我们不能像我的代码那样更改void方法中调用方的引用呢?我想不出明确的原因。