传递给方法时的Java对象赋值

时间:2016-03-07 04:02:42

标签: 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 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"的指针位置。

3 个答案:

答案 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产生任何影响。