它出现了“无法在原始类型int上调用getNumber()。为什么?
公共卡片findLargest(){
ArrayList<Card> cardStack;}
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;
continue;
} else if (largest.getNumber() == c.getNumber()) {
if(largest.getSuit().equals("Diamonds"))
largest = c;
continue;
答案 0 :(得分:1)
largest = c;
由于现在需要让largest
变量引用具有新最高值的卡,您只需将变量指向该变量即可。
下次约largest.getNumber()
将返回c.getNumber()
现在返回的内容。
确保Card largest;
的声明不在您的循环之内。
编辑:
我会为您添加一些解释,希望能回答您的问题。
当你声明一个Object时:
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
该对象并发回一个相同但不同的对象,您对其所做的任何修改都不会影响原始卡。在许多对象中,仅创建新对象,从不修改旧对象的能力称为Immutable。例如,String对象是不可变对象。
当我谈到需要在循环外写入Card largest;
时,意味着分配给持有引用的内存仅存在于循环的范围内。如果我们这样做:
for (....) {
Card largest;
//...
}
...每次循环迭代时,largest
变量都会被销毁并重新创建,删除我们在其中保存的引用或数据。对于我上面的更大的例子,我们可以将Card c;
放在循环中,因为我们只关心循环持续时间c
是什么,而后来最大的问题。这称为可变范围。