数组仅输出最后一个初始化的数组

时间:2014-03-08 17:40:47

标签: java arrays

我遇到了使用jGrasp在Java中声明和初始化对象数组的问题。这是一个赋值,我直接从书中复制代码并更改了类和数组名称。我已经尝试使用'itemA,itemB,itemC'分配和初始化没有数组,并且在代码底部可以看到相同的重复输出。

驱动程序类:

class Driver
{

    public static void main(String[] args)
    {

        RetailItem[] item = new RetailItem[3];

        item[0] = new RetailItem("a", 1, 1);
        item[1] = new RetailItem("b", 2, 2);
        item[2] = new RetailItem("c", 3, 3);

        for (int i = 0; i < item.length; i++)
        {
           System.out.printf("item: " + item[i].getItemName());
        }
    }

输出结果为:

  

项目:c

     

项目:c

     

项目:c

我不明白,因为我是初学者,为什么输出始终是最后一个初始化的数组对象。

我正在尝试的输出是:

  

项目:a

     

项目:b

     

项目:c

这是我的RetailItem类:

class RetailItem
{
    private static String itemName;
    private static int unitsOnHand;
    private static double priceEach;

    //Constructor(s)

    public RetailItem(String name, int qty, double price)
    {
        itemName = name;
        unitsOnHand = qty;
        priceEach = price;
    }

    //Public Methods
    public static double getPriceEach()
    {
        return priceEach;
    }

    public static String getItemName()
    {
        return itemName;
    }

    public static int getUnitsOnHand()
    {
        return unitsOnHand;
    }
}

2 个答案:

答案 0 :(得分:1)

您的问题是itemName(以及所有其他变量)已被声明为static。这会将它们绑定到,而不是实例,因此当构造函数更改itemName时,它会改变整个类的变量。

要查看“类变量”的含义,请尝试以下操作:在main中定义RetailItem方法,如下所示:

public static void main(String[] args) {
    // Print the property of the RetailItem *class*: remember, you don't even have an instance of the class at this point.
    System.out.println(RetailItem.itemName); // null

    RetailItem item = new RetailItem("a", 1, 1);

    // Print the property of the class again, ignoring the instance that you created.
    System.out.println(RetailItem.itemName); // "a"
}

要解决此问题,只需从您想要成为实例变量的任何内容中删除static声明(以及setter / getters!)。

private String itemName;
public String getItemName() {
    return itemName;
}

答案 1 :(得分:0)

问题是您将itemName,unitsOnHand和priceEach设置为static。基本上这意味着RetailItem的所有实例对于每个变量都具有相同的值。如果删除static关键字,则每个实例都有自己的itemName,unisOnHand和priceEach变量。