在Java中玩游戏。如果对象被修改并且给定值和不同的值(如果它被分配了新对象),我看到了不同的行为。这是我用来显示结果的代码。
public class Test {
int i;
public Test(int j) {
this.i = j;
}
public static void main(String[] args) {
Test A = new Test(5);
Test N = new Test(5);
add(A);
makeNew(N);
System.out.println("Value of A.i= "+A.i);
System.out.println("Value of N.i= "+N.i);
}
private static void add(Test t) {
t.i+= 3;
System.out.println("Inside method add() t.i= "+t.i);
}
private static void makeNew(Test t) {
t = new Test(8);
System.out.println("Inside method makeNew() t.i= "+t.i);
}
}
以下是上述代码的输出。
Inside method add() t.i= 8
Inside method makeNew() t.i= 8
Value of A.i= 8
Value of N.i= 5
在上面的例子中,对象A被修改为值8.对象B本身被赋予一个新对象。但是回调它们只有对象A显示新值。对象B显示旧值本身。它们不应该显示相同的值,因为这两种情况都是通过推荐传递的吗?我期待A.i和N.i的价值相同。
答案 0 :(得分:3)
以下是发生的事情:
Test A = new Test(5);
Test N = new Test(5);
add(A); // method is add(Test t)
makeNew(N)// method is makeNew(Test t)
t = new Test(8);
System.out.println("Value of A.i= "+A.i);
System.out.println("Value of N.i= "+N.i);
答案 1 :(得分:1)
在makeNew
中,您将使用new test(8)
对象覆盖对现有对象(作为参数传入的对象)的引用。但是,这是makeNew
内的本地内容,因此位于main(...)
内的原始对象不会受到影响。
答案 2 :(得分:1)
每当你使一个变量等于一个对象,然后在其他地方使用new就像通过另一个引用一样,你设置为对象引用的变量不再指向新对象,而是仍然保留旧对象。因此,如果不同范围的多个变量都有一个引用,那么它们都需要一种方法让它们等于新对象或者它们不再同步。
答案 3 :(得分:1)
我认为这会让你怀疑:
您看到N
仍然指向第一个对象
答案 4 :(得分:0)
Java是按值传递的。您将对象的引用作为值传递,因此您可以修改该对象。但是,您无法修改对象的实际引用并使其指向其他内容。
您的问题已在此处得到解答:Is Java "pass-by-reference" or "pass-by-value"?
答案 5 :(得分:-1)
在Java中,您不传递实际对象,也不传递对象的引用。 您将引用的副本传递给该对象。现在当您说
时makeNew(N);
N是new Test(5)
的引用,但未传递,但传递了它的引用的副本。在makeNew()函数中,此副本指向一些新对象并适当地打印该值,但N仍将指向原始对象。