簡體   English   中英

Java ArrayList 方法返回 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 .size()方法。 所以我添加了一行

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

但 IntelliJ 告訴我它不起作用。 所以我認為也許我應該使用 inheritance 所以我改為

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( .size()給了我 0,這顯然是錯誤的。 在此處輸入圖像描述

誰能幫我理解為什么代碼會這樣工作? 我猜它與 class inheritance 有關,但不確定。

我認為 inheritance 與組成存在誤解。 在這種情況下,在您添加extends ArrayListGroceryList之前,您的GroceryList有一個 list 這就是為什么.size()沒有處理它的原因,因為您定義的GroceryList沒有size方法。 它確實有一個名為groceryList的列表。 這就是為什么在您addGroceryItem之后, getLength方法可以正常工作的原因。 它的大小與groceryList

添加extends ArrayList后, GroceryList現在ArrayList ,這就是它現在有size方法的原因。 但它與groceryList不是同一個列表。 因此獲得myGroceries的大小,在addGroceryItem沒有給你你期望的大小之后。 因為您從未向ArrayListmyGroceries添加任何內容。 您只將東西添加到了groceryList中的一個字段的myGroceries中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM