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
.
中的字段
我正在学习 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
.