传递给方法时的Java对象赋值
我有以下几点传递给方法时的Java对象赋值,java,pointers,object,methods,Java,Pointers,Object,Methods,我有以下几点 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 voi
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是通过指针传递的,因此在我的bar方法中更改“a”的指针位置同样会更改传入的“x”的指针位置。您想通过更改“a”来更改“x”吗?关键字“new”将打开一个新的内存,因此功能“bar”内的“x”和“a”是指向不同内存的指针,您修改“a”将不会更改“x”。您可以尝试修改“栏”,如下所示:
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);
}
当你做
a=newinternal(5)时,你正在创建一个全新的对象代码>在Java中,它总是“按值传递”,而不是按引用传递。当您将t.x
传递给bar方法时,将创建内存地址的副本,并将其传递给方法。假设在bar方法中更改a=null
,这不会使t.x
为null,因为只有a
引用变量在方法中设置为null
a = new Inner(5);
此行将引用变量重新分配到新的内存位置,该位置不同于t.x
。因此,对该内存位置的任何更改都不会对t.x产生任何影响通过指针传递与通过引用传递不同。将指针更改为指向其他地方不会将其他指针更改为也指向其他地方。因此,如何在该程序中达到预期效果?哪一个是传入对象变量并在方法中更改它?在Java中不能通过引用传递参数。如果要从bar()
内更改x
,只需设置x=new-internal(5)代码>。如果这不是一个选项,那么您必须使用可变包装器类。好的,我明白您的意思。你能解释一下如何使用可变包装器类吗?还是有一个好的网络资源可以很好地解释它?