Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:Constructor,使用new初始化:为什么这段代码不';在最后一句话里,你不打印512吗?_Java_Constructor - Fatal编程技术网

Java:Constructor,使用new初始化:为什么这段代码不';在最后一句话里,你不打印512吗?

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

我想这段代码打印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(){
    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方法中调用方的引用呢?我想不出明确的原因。