列表的范围和生命周期
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了列表的范围和生命周期相关的知识,希望对你有一定的参考价值。
我有一个静态产品列表类型。当我从Shopowner类填充此列表时,它工作正常,但是当我编译Customer.java时,列表返回空白集。为什么填充的列表没有保留?
class Products {
String name;
int itemcode;
Products(){}
static List <Products> list = new ArrayList<Products>();
Products(String name,int itemcode)
{
this.name=name;
this.itemcode=itemcode;
}
public String toString()
{return (name+""+itemcode);}
}
class Shopowner {
public static void main (String ...at)
{
Products o = new Products("Shamppo",12);
Products.list.add(o);
Products o1 = new Products("choco",1112);
Products.list.add(o1);
System.out.println(Products.list); //prints fine
}
}
class Customer {
public static void main (String args[])
{
System.out.println(Products.list); //prints []
}
}
OutPut(编译Customer.jav时)
[]
答案
请参阅下面的部分代码:
public static void main (String ...a)
{
Products o= new Products("Chocolate");
o.addToList();
Products o1= new Products("Icecream");
o1.addToList();
new Products().showList(); //This line is the culprit
您正在对象o和o1中添加列表,并且您在另一个对象上调用showList(),共有新的Products()。showList();?
注意:它适用于静态列表,因为它在Product类的所有对象之间共享,而非静态列表则不是这种情况。
另一答案
问题是您通过创建新产品并在其上调用了showList来创建新列表。如果您想要特定产品的列表,那么您应该在正确的对象上调用该方法。 Static为每个实例维护一个变量,因此它在静态时起作用。
另一答案
首先,编译一个类不会给你你提到的结果。您不仅要编译Customer.java,还要在Customer中执行main方法。
在我看来,你有2个主要方法,一个在Customer,一个在Shopowner。您希望在运行Customer#main()时,您将看到Shopowner#main()中填充的内容。然而,这根本不合理:如果您运行Shopowner#main(),那么它是另一个Customer#main()运行的另一个进程。静态变量不会跨越不同的进程。
我相信你应该对编程有一些基本的了解。您的代码中存在许多需要修复的设计问题,但与上述问题相比,它们变得微不足道....
以上是关于列表的范围和生命周期的主要内容,如果未能解决你的问题,请参考以下文章