我正在编写一个简单的双人游戏控制台应用程序,我想知道我是否可以在下面执行以下操作。我对整个Java传值/参考文章感到困惑....
Player p1 = new Player("John");
Player p2 = new Player("Sam");
Player current = p1;
while(p1.life > 0 && p2.life > 0) {
current.doSomething();
if(current.name.equals(p1.name)) {
current = p2;
} else {
current = p1;
}
}
我担心的是变量current
可能会被修改,但不是p1
或p2
。这是我要修改的那两个实例。我只是不想为每个玩家复制一个完整的代码块,导致一个非常笨重的if-else语句。
答案 0 :(得分:1)
您的担心是错误的。current
,p1
和p2
都是引用。在您的情况下有2个实例和3个引用。因此,current
指向的实例可以进行修改,并会反映在p1
或p2
中。
答案 1 :(得分:1)
没关系。在Java中,对象变量是引用。这意味着变量不包含值,但是是包含值的结构的间接。因此,当current=p1
成立时,current.life
或p1.life
确实具有完全相同的效果。 Java中的对象变量就像是你的名字和昵称。你是对象,任何人都可以使用你的名字或任何合适的昵称来引用你。
答案 2 :(得分:1)
我是否可以使用另一个修改两个或更多个对象实例 对象变量
是的,你可以!!!
Java 传递值不传递参考,但是在Objects
的情况下,因为它们位于堆内存中的单个位置,所以这两个参考指向单个对象,而不是创建了副本的变量。
Website w=new Website("StackOverflow");
changeName(w);
public void changeName(Website w){<--- this w is now pointing to same Object passed to it , not making copies unlike variables
w.setName("StackExchange");
}
由于传递了Object,因此对Object状态所做的更改将反映在main(i.e caller)
函数