Java 清单的范围和有效期

Java 清单的范围和有效期,java,list,generics,arraylist,Java,List,Generics,Arraylist,我有一个产品类型的静态列表。当我从Shopowner类填充此列表时,它工作正常,但当我编译Customer.java时,列表返回空白集。为什么填充的列表不保留 class Products { String name; int itemcode; Products(){} static List <Products> list = new ArrayList<Products>(); Products(String name,in

我有一个产品类型的静态列表。当我从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 [] 
           }    
}

问题是您通过创建新产品创建了一个新列表,并在其上调用了showList。如果需要特定产品的列表,则应在正确的对象上调用该方法。Static为每个实例维护一个变量,因此它在静态时工作

问题在于,您通过创建新产品创建了一个新列表,并在其上调用了showList。如果需要特定产品的列表,则应在正确的对象上调用该方法。Static为每个实例维护一个变量,因此它在静态时工作

请参见下面的部分代码:

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()。showList()

注意:
它适用于静态列表,因为它在产品类的所有对象之间共享,而非静态列表则不是这样。

请参阅下面的部分代码:

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()。showList()

注意: 它适用于静态列表,因为它是在产品类的所有对象之间共享的,而非静态列表则不是这样。

首先,编译类不会得到您提到的结果。您不仅要编译Customer.java,还要执行Customer中的main方法

在我看来,你有两种主要的方法,一种是顾客,一种是店主。您希望在运行Customer#main()时,会看到Shopowner#main()中填充的内容。然而,这是不合理的:如果您运行Shopowner#main(),这是来自另一个运行Customer#main()的另一个进程。静态变量不会在不同的过程中传递

我相信你应该对编程有一些基本的了解。代码中有很多设计问题需要解决,但与上面提到的问题相比,它们变得微不足道了。…

首先,编译类不会得到您提到的结果。您不仅要编译Customer.java,还要执行Customer中的main方法

在我看来,你有两种主要的方法,一种是顾客,一种是店主。您希望在运行Customer#main()时,会看到Shopowner#main()中填充的内容。然而,这是不合理的:如果您运行Shopowner#main(),这是来自另一个运行Customer#main()的另一个进程。静态变量不会在不同的过程中传递



我相信你应该对编程有一些基本的了解。您的代码中有许多设计问题需要解决,但与上面提到的问题相比,它们变得微不足道……

Re:
Products(String c){c=itemname;}
该语句没有任何作用。成员
itemname
仍将为
null
。你想在那里做什么?也许你的意思是
this.itemname=c?对不起!那是打字错误,更正了。代码乱七八糟。你能把它格式化吗?Re:
Products(stringc){c=itemname;}
那句话什么也不做。成员
itemname
仍将为
null
。你想在那里做什么?也许你的意思是
this.itemname=c?对不起!那是打字错误,更正了。代码乱七八糟。您能正确设置它的格式吗?如何从customer类检索此列表而不在此类中添加任何内容。我可以在product类中创建一个静态块并将其放入其中。还有其他想法吗。您的上述观点不清楚,您正在考虑将列表设置为静态?是的,我正在尝试将此列表设置为静态。现在我创建了另一个类Customer{new Products().showList()//Prints[]}如何在此处检索已填充的列表这很容易。列表将返回Customer类中的列表。@Malwaregeek如果您的查询已解决,请接受回答。如何从Customer类检索此列表而不在此类中添加任何内容。我可以在product类中创建一个静态块并将其放入其中。还有其他想法吗。您的上述观点不清楚,您正在考虑将列表设置为静态?是的,我正在尝试将此列表设置为静态。现在我创建了另一个类Customer{new Products().showList()//Prints[]}如何在此处检索已填充的列表这很容易。列表将返回Customer类中的列表。@Malwaregeek如果您的查询已解决,请接受回答。静态列表应在项目的整个生命周期内保留?@Malwaregeek是的,这完全正确。静态对象将在整个运行期间保留其生存期。静态列表应在项目的整个生存期内保留?@Malwaregeek是的,这是完全正确的。静态对象将在整个运行过程中保持其生命周期。好的,如果我将填充列表代码放在paramaetrized构造函数中,并从customer类调用它,它应该可以正常工作。新店主(“添加产品”);或者,不用为店主和客户创建单独的类,我可以创建一个单独的类retail,使用switch语句,我可以添加以店主身份添加产品或以客户身份购买产品的功能。那么,你到底在问什么?我不确定这是否是我的问题。。。我完全不知道你想表达什么。确保你知道你在问什么,并以其他人能理解的方式问。这不是关于初学者与否。有很多初学者会问:好吧:)我问的是你提到的设计问题。你能在回答中详细说明一下吗。你的问题是要求“改变统计数据”