在班级中运行号码

时间:2014-07-20 20:11:00

标签: java class static count

在下面的示例中,我尝试生成一个作为类:: 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)。如果没有,如何生成一个正在运行的号码呢?

6 个答案:

答案 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

Read more...

尝试从视觉上理解它。

enter image description here

答案 2 :(得分:2)

您有static字段,表示只有一个值。你可能想要的是有一个静态字段,它是你的计数器和一个保持该值的成员非静态字段。

尝试更改

static int counter = 0;
int productID = 0;
String name;

public Product(String startName) {
    productID = ++counter;

如果您在调试器中单步执行代码,您将看到您的程序实际执行的操作。

答案 3 :(得分:1)

因为productID已定义为static

注意:静态变量的值对于类的所有对象(或实例)是相同的,换句话说,您可以说同一类的所有实例(对象)共享一个静态变量的副本。

来源:http://beginnersbook.com/2013/05/static-variable/

答案 4 :(得分:1)

你有

static int productID = 0;

此处static表示productID属于Product类,而不属于Product实例。所有实例共享相同 ProductID

改为使用

int productID = 0

然后每个实例都拥有它自己的副本。您需要找到另一种设置值的方法......

答案 5 :(得分:1)

因为您已将ProductID设为静态,所以它的值将由Product类型的所有对象共享。我的建议是在主函数中创建一个变量,每次创建产品时都会增加该变量并将其作为参数传递。

编辑:@DavidPostill - 然后它们都将等于1。