【问题标题】:Java ArrayList size() method return 0 instead of actual length of the ArrayList [closed]Java ArrayList size() 方法返回 0 而不是 ArrayList 的实际长度 [关闭]
【发布时间】:2021-12-30 18:33:04
【问题描述】:

我正在学习 Java,并遵循这样的教程:

package segovia.java.learn;

import java.util.ArrayList;

public class GroceryList {
    private ArrayList<String> groceryList = new ArrayList<String>();

    public void addGroceryItem(String item) {
        groceryList.add(item);
    }

    public void printGroceryList() {
        System.out.println("You have " + groceryList.size() + " items in your grocery list.");
        for (int i=0; i < groceryList.size(); i++) {
            System.out.println((i+1) + ". " + groceryList.get(i));
        }
    }

    public int getLength(){
        return groceryList.size();
    }
}
package segovia.java.learn;

public class Main {

    public static void main(String[] args) {
        GroceryList myGroceries = new GroceryList();
        myGroceries.addGroceryItem("apple");
        myGroceries.addGroceryItem("orange");
        myGroceries.addGroceryItem("pork");
        myGroceries.addGroceryItem("beef");
        myGroceries.printGroceryList();

        System.out.println(myGroceries.getLength());
    }
}

效果很好。但是,我认为既然myGroceries是一个ArrayList,所以它应该有.size()方法。所以我加了一行

System.out.println(myGroceries.size());

但 IntelliJ 告诉我它不起作用。所以我认为也许我应该使用继承所以我改为

public class GroceryList extends ArrayList {

现在.size() 方法正在工作,但它给了我一个错误的值。

最终代码如下:

package segovia.java.learn;

import java.util.ArrayList;

public class GroceryList extends ArrayList{
    private ArrayList<String> groceryList = new ArrayList<String>();

    public void addGroceryItem(String item) {
        groceryList.add(item);
    }

    public void printGroceryList() {
        System.out.println("You have " + groceryList.size() + " items in your grocery list.");
        for (int i=0; i < groceryList.size(); i++) {
            System.out.println((i+1) + ". " + groceryList.get(i));
        }
    }

    public int getLength(){
        return groceryList.size();
    }
}
package segovia.java.learn;

public class Main {

    public static void main(String[] args) {
        GroceryList myGroceries = new GroceryList();
        myGroceries.addGroceryItem("apple");
        myGroceries.addGroceryItem("orange");
        myGroceries.addGroceryItem("pork");
        myGroceries.addGroceryItem("beef");
        myGroceries.printGroceryList();

        System.out.println(myGroceries.getLength());
        System.out.println(myGroceries.size());
    }
}

getLenth() 给了我 4,这是正确的,而.size() 给了我 0,这显然是错误的。

谁能帮我理解为什么这些代码会这样工作?我猜它与类继承有关,但不确定。

【问题讨论】:

  • myGroceries is an ArrayList,不,不是。你没有声明 GroceryList extends ArrayList 那么为什么它会是一个 ArrayList 呢?它有一个私有的ArrayList,仅此而已。
  • GroceryList 的第一个版本不是ArrayList - 它只是包含 ArrayList 并且只有您的类定义的方法。 GroveryList 的第二个版本是一个ArrayList 并且包含一个ArrayList。即使在第二个版本中,您也只将项目添加到包含的ArrayList,但没有添加到您的GroceryList 扩展的“ArrayList”(即,您总是调用GroceryList.addGroceryItem(),但从不会GroceryList.add() 方法添加实际上会改变大小)。

标签: java class inheritance arraylist size


【解决方案1】:

我认为对继承与组合存在误解。在这种情况下,在您将extends ArrayList 添加到GroceryList 之前,您的GroceryList 有一个列表。这就是为什么 .size() 没有处理它的原因,因为您定义的 GroceryList 没有 size 方法。它确实有一个名为groceryList 的列表。这就是为什么在你addGroceryItem 之后,getLength 方法可以正常工作。它的大小为groceryList

在您添加extends ArrayList 之后,GroceryList 现在ArrayList,这就是它现在有size 方法的原因。但它与groceryList 不是同一个列表。因此,在addGroceryItem 之后获得myGroceries 的大小不会给您预期的大小。因为您从未向ArrayListmyGroceries 添加任何内容。您只向groceryList 添加了东西,这是myGroceries 中的一个字段。

【讨论】:

    猜你喜欢
    • 2015-08-15
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2015-07-27
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多