传递给方法时的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)。如果这不是一个选项,那么您必须使用可变包装器类。好的,我明白您的意思。你能解释一下如何使用可变包装器类吗?还是有一个好的网络资源可以很好地解释它?