通过值传递混淆并通过java中的引用传递

Jay*_*esh 1 java java-ee

可能重复:
Java是"传递引用"吗?

嗨,我已经开发了以下代码.在交换方法中,我交换了两个对象的引用.然后它将在被调用的方法(这里是swap())中更改但在主方法中没有改变.为什么?

class Check
{

    public void swap(PassByRefDemoMain obj1,PassByRefDemoMain obj2)
    {

        PassByRefDemoMain temp;
        temp=obj1;
        obj1=obj2;
        obj2=temp;
        System.out.println(obj1.id+ " "+ obj2.id);

    }
}


public class PassByRefDemoMain {
    int id;
    PassByRefDemoMain(int id)
    {
        this.id=id;
    }
public static void main(String[] args) {
        PassByRefDemoMain obj1=new PassByRefDemoMain(10);
        PassByRefDemoMain obj2=new PassByRefDemoMain(20);

        Check obj=new Check(); 
        obj.swap(obj1,obj2);

        System.out.println(obj1.id + " " + obj2.id);

    }

}
Run Code Online (Sandbox Code Playgroud)

Tud*_*dor 8

传递给方法的对象作为引用传递,这意味着更改其成员将在外部看到,但引用本身是按值传递的,这意味着调用者不会看到更改引用.这是一个实验:

class Person {
    public String name;
}

class Test {
    public static void changePerson(Person p) {
         p.name = "Tudor";
         p = null;
    }

    public static void main(String[] args) {
        Person p = new Person();
        p.name = "John";
        changePerson(p);
        System.out.println(p.name); // prints Tudor and you don't get NPE
    }
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*hev 7

Java是按值传递的.

你只有两个对象.调用swap方法时,会复制两个新引用,但它们指向相同的对象.在该方法中,您只需更改复制的引用所指向的位置.但主要方法中的原始参考文献未被触及.

A - obj1
B - obj2

Acopy - obj1
Bcopy - obj2
Run Code Online (Sandbox Code Playgroud)

方法后:

Acopy - obj2
Bcopy - obj1
Run Code Online (Sandbox Code Playgroud)

A仍然指向obj1,B仍然指向obj2.