largest = c;
由于您现在需要让您的largest
变量引用具有新最大值的卡片,您只需要将变量指向它。
下一次largest.getNumber()
将返回c.getNumber()
现在返回的内容。
但是,请确保 for 的声明Card largest;
在您的循环之外。
编辑:
我将为您添加一些解释,并希望回答您的问题。
当您这样声明对象时:
Card c;
您正在创建一个可以引用 Card 类型的任何对象(或子类)的引用变量。通过创建该对象的实例...
Card c = new Card();
您正在保留内存并初始化其子对象/原语。
因此,当您编写这样的函数时:
List<Card> cardStack; //Just assuming you have a List of cards
public Card getLargest() {
Card largest;
Card c;
for (int i = 1, largest = cardStack.get(0); i < cardStack.size(); i++) {
c = cardStack.get(i);
if (largest.getNumber() > c.getNumber()) {
largest = c;
} else if (largest.getNumber() == c.getNumber()) {
if(...)//Check suits as you would
}
}
return largest;
}
您正在创建引用堆栈中存在的 Card 对象的变量。引用没有发生新的内存分配(除了它们需要保存引用的内存)。
结果,您将拥有一个在别处创建的卡片对象列表,以及两个引用,c
它们largest
只是指向存储在不同位置的对象。从函数返回Card
会返回该引用,因此您对其执行的任何操作都会影响它所引用的卡片。
或者,您将clone
对象发送回一个相同但不同的对象,您对其进行的任何修改都不会影响原始卡。在许多对象中,只创建新对象而不修改旧对象的能力称为不可变。例如,字符串对象是不可变对象。
当我谈到需要Card largest;
在循环之外编写时,这意味着分配给保存引用的内存只存在于循环的范围内。如果我们这样做:
for (....) {
Card largest;
//...
}
...每次循环迭代时,largest
变量被销毁并重新创建,删除和引用或我们保存在其中的数据。对于我上面的更大示例,我们可以放入Card c;
循环,因为我们只关心c
循环持续时间的内容,而最大的问题稍后再考虑。这称为变量范围。