【发布时间】: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