我有以下
class Test{
public Inner x;
public static void main(String[] args){
Test t = new Test();
t.bar(t.x);
}
public Test(){
x = new Inner();
System.out.println("X = "+x.val);
}
public void bar(Inner a){
x.val = 2;
System.out.println("a = "+a.val);
a = new Inner(5);
System.out.println("a = "+a.val);
System.out.println("X = "+this.x.val);
}
class Inner{
public int val;
public Inner(){val=0;}
public Inner(int i){val=i;}
}
}
我担心为什么程序告诉我我的类的内部对象和传入的对象是相同的,但是当我将传递的对象更改为新对象时,它们突然变得不一样了。我认为java通过指针传递,从而改变" a"的指针位置。在我的bar方法中同样会改变传入的" x"的指针位置。
答案 0 :(得分:0)
你想改变" a",来改变" x"它?关键字" new"将打开一个新的记忆,所以功能" bar"在你的" x"和" a"是一个指向不同内存的指针,你可以修改" a"不会改变" x"。您可以尝试修改" bar"如下:
public void bar(Inner a){
x.val = 2;
System.out.println("a = "+a.val);
//a = new Inner(5);
a.val = 5;
System.out.println("a = "+a.val);
System.out.println("X = "+this.x.val);
}
答案 1 :(得分:0)
当您执行a = new Inner(5);
答案 2 :(得分:0)
在Java中,它始终是“按值传递”而不是通过引用传递。将t.x
传递给bar方法时,会创建内存地址的副本并将其传递给方法。假设您更改了bar方法中的a = null
,这不会使t.x
为空,因为在您的方法中只有a
引用变量设置为null。
a = new Inner(5);
此行将您的引用变量重新分配给与t.x
不同的新内存位置。因此,对此内存位置的任何更改都不会对t.x
产生任何影响。