-2

调用p.name = "EJava";方法后不应该改变anotherMethod(p);吗?谁能解释为什么此代码返回:

anotherMethod
EJava
someMethod
someMethod

代替 :

anotherMethod
anotherMethod
someMethod
someMethod

班级人

class Person {
   public String name;
   public int height;
}    

测试仪

class EJavaGuruPassObjects1 {
    public static void main(String args[]) {
        Person p = new Person();
        p.name = "EJava";
        anotherMethod(p);
        System.out.println(p.name);
        someMethod(p);
        System.out.println(p.name);
    }

    static void someMethod(Person p) {
        p.name = "someMethod";
        System.out.println(p.name);
    }

    static void anotherMethod(Person p) {
        p = new Person();
        p.name = "anotherMethod";
        System.out.println(p.name);
    }
}

调用p.name = "EJava";方法后不应该改变anotherMethod(p);吗?

4

4 回答 4

3

您正在创建一个新Person对象。anotherMethod()它应该是

static void anotherMethod(Person p) {
   p.name = "anotherMethod";
   System.out.println(p.name);
}
于 2013-08-10T18:00:26.477 回答
1

对象引用变量在 Java 中按值传递(就像其他所有东西一样)。在 someMethod() 中,更改了 p 指向的实际对象的名称。在 anotherMethod() 中,它指向一个新的 Person 对象,其信息已更改。你原来的参考是不变的。在这些方法之外,您仍然有一些指向原始Person对象的变量。

最好将这些变量视为指针。您创建一个Person p,它指向这个新对象,名称由您决定。假设您创建另一个变量,Person x然后设置x = p. 现在 x 和 p 指向同一个对象。改变一个将反映在两个变量中。但是,如果你这样做p = new Person(),那么 p 将指向一个 NEW 对象,但 x 仍将指向 p 首先引用的那个原始对象。

于 2013-08-10T17:59:47.380 回答
0

Java 不使用 C++ 意义上的引用。所以你的方法

static void anotherMethod(Person p) {
p = new Person();
p.name = "anotherMethod";
System.out.println(p.name);
}
}

对变量没有任何p作用,它只是创建新对象,(暂时)调用它 p 并在方法完成后忘记它。

p 只是对实际对象的引用的副本,Java总是将参数作为副本传递。

于 2013-08-10T18:01:33.080 回答
0

Java 通过引用的副本传递所有对象,而不是通过引用。

这意味着pin是存在于 main 方法anotherMethod中的引用的副本。p如果您分配的内容对您的主要方法引用p中的anotherMethod内容没有影响p,因为它只是一个副本。

于 2013-08-10T18:01:58.690 回答