Java 班上跑数
在下面的示例中,我试图为类生成一个running作为简单ID::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
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;