Java ArrayList size() 方法 return 0 而不是 ArrayList 的实际长度

Java ArrayList size() method return 0 instead of actual length of the ArrayList

我正在学习 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,这显然是错误的。

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

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

添加 extends ArrayList 后,GroceryList 现在 一个 ArrayList,这就是为什么它现在有一个 size 方法.但它与 groceryList 不是同一个列表。因此,在 addGroceryItem 之后获得 myGroceries 的大小并不能为您提供预期的大小。因为您从未向 ArrayList 添加任何内容,即 myGroceries。您只在 groceryList 中添加了 myGroceries.

中的字段