我是一位经验丰富的C ++学习Java的人。我正在努力理解那些引用"指向"到对象的特定实例。在C ++中,这很容易。但我对Google" java引用实例对象的次数越多,"我读的越多,我就越熟悉这种东西在Java中是如何运作的。
让我举例说明一个具体的例子。假设我想创建一个拳击模拟。下面是(缩写)代码,设置拳击手,让他们公爵。在战斗结束时,我想要一个" WinnerReference"参考"点"到最后一个拳击手:
public class Boxer {
String Name;
public Boxer(String a) {
Name = a;
}
String GetName() { return Name; }
}
public class BoxingRing {
public BoxingRing() {
// Do nothing
}
void FightFightFight(Boxer a, Boxer b, >>WinnerReference<< )
// Boxers fight here
// WinnerReference is pointed to winning boxer here
}
}
public class BoxingMatch {
public static void main(String[] args) throws IOException {
Boxer Joe = new Boxer("Joe");
Boxer Sam = new Boxer("Sam");
BoxingRing TheRing = new BoxingRing();
// Create reference called "WinnerReference" of type Boxer here
TheRing.FightFightFight(Sam, Joe, WinnerReference);
System.out.println("The winner of this boxing match was: " + WinnerReference::GetName());
}
}
我整个下午一直在研究这个问题,但找不到直接引导我完成我想做的事情的教程。 (你可能会看到我从C ++的角度来看这个。)
我想问论坛是这样的:这是一个可行的Java程序方法吗?我在Google上搜索正确的术语吗?是否有人推荐的好资源?
非常感谢! -P
答案 0 :(得分:3)
在战斗结束时,我想要一个&#34; WinnerReference&#34;参考&#34;点&#34;到最后一个拳击手站立
听起来你正在寻找传递参考。这在Java中并不存在 - 所有值都是按值传递的,但对于任何非基本类型,表达式的值无论如何都是一个引用。那个不与传递引用相同。
通常,绕过此限制的最佳方法是简单地使用返回值:
Boxer fightFightFight(Boxer a, Boxer b) {
// Boxers fight here
return winner; // Or whatever
}
然后在你的主叫代码中:
Boxer winner = ring.fightFightFight(sam, joe);
了解您不会在此处创建任何新 Boxer
对象非常重要(当然,除非您明确地这样做) - 您&#39 ; ll只是返回一个现有的引用。
在C ++中,这有点等同于
Boxer* fightFightFight(Boxer *a, Boxer *b)
......如果有帮助的话!
(顺便说一句,现在开始遵循Java命名约定是一个好主意。)
答案 1 :(得分:3)
这在Java中是不可能的,因为它是通过值传递的。您可以在(按值)中传递Boxer
实例,因为值 引用。 Java命名约定是方法的驼峰(低位字母)。要么返回Boxer
,要么传入另一个引用,例如
void fightFightFight(Boxer a, Boxer b, Boxer theChamp) {
// if a wins...
theChampe.setName(a.getName());
// .. or if b wins
theChampe.setName(b.getName());
}
或者返回获胜者
Boxer fightFightFight(Boxer a, Boxer b) {
// if a wins...
return a;
// otherwise
return b;
}
最后,Java不是C ++。
答案 2 :(得分:2)
关于WinningReference,您传递的是它的值(在该点为null),而不是指向它的指针。 Java中更常见的方法是:
Boxer fightFightFight(Boxer a, Boxer b)
// Boxers fight here
return winner;
}