在下面的示例中,我尝试生成一个作为类:: Product
的简单ID的运行。然而,结果并不像我预期的那样。
我的代码
public class myProgram
{
public static void main(String[] args)
{
Product product1 = new Product("AAA");
Product product2 = new Product("BBB");
Product product3 = new Product("CCC");
System.out.println(product1.printItem());
System.out.println(product2.printItem());
System.out.println(product3.printItem());
}
}
class Product
{
static int productID = 0;
String name;
public Product(String startName)
{
productID ++;
name = startName;
}
public int printItem()
{
return productID;
}
}
计划结果
3
3
3
我希望得到的结果是:
1
2
3
我的问题:我做错了什么导致错误的程序输出?
编辑1:我放置了一个静态关键字,希望在每次创建实例后增加ProductID
(而不是每次都重置为0)。如果没有,如何生成一个正在运行的号码呢?
答案 0 :(得分:4)
由于productId
是静态的,因此每个实例一次只有一个全局值,为了匹配您的预期输出,您需要每个实例拥有一个本地id
。另外,我建议您将printItem()
替换为toString()
和/或getItem()
。最后,为了保证线程安全,您应该使用AtomicInteger
,
class Product {
static AtomicInteger productCount = new AtomicInteger(0);
int productID = 0;
String name;
public Product(String startName) {
productID = productCount.addAndGet(1);
name = startName;
}
public int getItemId() {
return productId;
}
@Override
public String toString(){
return String.valueOf(productID);
}
}
答案 1 :(得分:2)
因为静态变量在只有一个副本的对象之间共享。你可以说全班一份。
静态变量(或类变量)是属于类本身的变量,而不是类的对象。
请参阅Understanding Class Members
上的 Java Tutorial尝试从视觉上理解它。
答案 2 :(得分:2)
您有static
字段,表示只有一个值。你可能想要的是有一个静态字段,它是你的计数器和一个保持该值的成员非静态字段。
尝试更改
static int counter = 0;
int productID = 0;
String name;
public Product(String startName) {
productID = ++counter;
如果您在调试器中单步执行代码,您将看到您的程序实际执行的操作。
答案 3 :(得分:1)
因为productID
已定义为static
注意:静态变量的值对于类的所有对象(或实例)是相同的,换句话说,您可以说同一类的所有实例(对象)共享一个静态变量的副本。
答案 4 :(得分:1)
你有
static int productID = 0;
此处static
表示productID
属于Product类,而不属于Product实例。所有实例共享相同 ProductID
改为使用
int productID = 0
然后每个实例都拥有它自己的副本。您需要找到另一种设置值的方法......
答案 5 :(得分:1)
因为您已将ProductID设为静态,所以它的值将由Product类型的所有对象共享。我的建议是在主函数中创建一个变量,每次创建产品时都会增加该变量并将其作为参数传递。
编辑:@DavidPostill - 然后它们都将等于1。