Java 班上跑数

Java 班上跑数,java,class,static,count,Java,Class,Static,Count,在下面的示例中,我试图为类生成一个running作为简单ID::Product。然而,结果并不是我所期望的 我的代码 public class myProgram { public static void main(String[] args) { Product product1 = new Product("AAA"); Product product2 = new Product("BBB"); Product product3 = new

在下面的示例中,我试图为类生成一个running作为简单ID::
Product
。然而,结果并不是我所期望的

我的代码

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)。如果没有,如何生成一个运行编号?

因为静态变量在所有对象只有一个副本的对象之间共享。你可以说全班一份

静态变量(或类变量)属于类本身,而不是类的对象

请参阅有关的Java教程

试着从视觉上理解它


因为
productID
是定义的
static

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

来源:

你有

static int productID = 0;
这里的
static
表示
productID
属于产品类,而不属于产品实例。所有实例共享相同的产品ID

改用

int productID = 0

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

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


编辑:@DavidPostill——那么它们都将等于1。

因为
productId
是静态的,每个实例一次只有一个全局值,要匹配预期的输出,您需要每个实例都有一个本地
id
。另外,我建议您将
printItem()
替换为
toString()
和/或
getItem()
。最后,为了线程安全,您可能应该使用


您有一个
静态
字段,这意味着只有一个值。您可能希望有一个静态字段作为计数器,另一个成员为非静态字段,用于保存值

试着改变

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

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

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

cuz product id是静态变量?@KickButtowski我故意将其设置为静态,希望在创建对象的每个实例后添加1。如果不是,它将始终保持为0?因为它是一种通用变量类型。每个人都可以更新它。如果希望得到预期结果,则不应在allI am使用静态变量,因为它已经在使用toString()进行打印,实际上,我在这里重新键入了所有代码,以使其更简单并直接解决我的问题。注意:
++
不是原子的,因此在多线程环境中,最好使用
AtomicInteger
作为
productCount
类型。@Pshemo已编辑。好建议。@ElliottFrisch过度设计您的解决方案并不总是一个好主意。有时候,最好让代码做需要做的事情。如果我们有超过20亿个产品,我们可以使用AtomicLong,添加equals、hashCode、compareTo、缓存toString(),如果我们添加了所有我们认为可能需要的东西,我们可以在哪里停止@彼得拉维有时候杯子是它需要的两倍大,要装一品脱你需要一品脱的杯子@ThomasJunk OP似乎正在使用多少线程?;)“事实上还是曾经在他的生活中?”@ThomasJunk这门课在他的生活中可能会做很多事情,为什么要特别选择那个呢。我很想添加equals/hashCode,例如在我的IDE中使用代码生成,但这并不是一个好主意。@ThomasJunk“与工程师争论就像与猪在泥中摔跤。几个小时后,你意识到他喜欢它。”我正在试着理解逻辑,你说得很清楚,直截了当+1给你。非常感谢。
static int counter = 0;
int productID = 0;
String name;

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