我遇到了使用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;
}
}
答案 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变量。