-5

它提出“无法在原始类型 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;
4

1 回答 1

1
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循环持续时间的内容,而最大的问题稍后再考虑。这称为变量范围。

于 2013-01-22T20:53:20.167 回答