我是面向对象编码的新手,但遇到以下问题。
(请注意,此解决方案是我的问题的一部分)
我需要许多对象可以引用的变量,但要为每个对象保留一些“私有”信息。更具体地说,我创建了一个名为的类,Worker
并且希望该类的每个对象都具有type的唯一ID
int
。因此,第一个对象具有ID=1
,第二个对象ID=2
等…请注意,我不只是想要一个随机整数,而我需要从0开始计数并递增…
在类中声明和初始化变量
static private int workId = 0;
我试图通过在构造函数主体中添加这一行代码来实现增量
workId++;
我实例化一些对象,将它们添加到中,ArrayList
然后使用for循环打印每个对象的变量。
System.out.println("Worker ID: "+workerList.get(i).getWorkerId());
并且getWorkerId()
(类方法)由
public int getWorkerId () { return this.workId; }
问题是我的程序不会打印每个唯一值workID
(因为没有),而是打印静态变量的最后一个值(恰好是对象的数量)。
您能描述我的问题的解决方案吗?
评论转为答案:
您走在正确的轨道上。
当前,您创建的每个工作人员都会增加您的静态成员。这意味着它将不保存工作人员的ID(情况并非如此,因为静态变量属于 类 而不是单个 实例
),而是保存到目前为止创建 的工作人员总数 。
固定
numWorkers
以反映其功能id
(或workerId
如果您愿意)workId++
为id = ++numWorkers
为什么?
现在,每个工人都有自己的id
。您可以通过查看当前已创建的工作人数(numWorkers
)进行分配,将该值加1,然后将其分配给id
。这样,您的第一个工作人员的ID将为1
,第二个工作人员的ID
2
以此类推。numWorkers
始终保留创建的工作人员数量,这是您分发的最后一个ID。
放在一起
由于这个问题引起了很多反对(=兴趣),我将上述内容总结为一个蓝图:
public class Worker {
private static int numWorkers; // Number of Worker objects created
private int id; // Individual ID of a worker
public Worker() {
id = ++numWorkers; // Will be 1 for the first, 2 for the second, ...
}
public int getID() {
return id;
}
public static int getNumWorkers() {
return numWorkers;
}
}
请注意,在Java中,你不需要初始化原始类型
int
到0
,因为这是在默认值的一个int
。当然,无论如何都很好-
明确表示永远不会有伤害。
如何从多个线程同时访问静态变量。 如果我有这样的课 我需要访问线程1的值,比如 从线程2中,我需要设置如下值 这会导致内存冲突吗?。如果是,建议使用什么方法来处理这种情况?。
问题内容: 我正在自学Java,这本书中的其中一项复习练习要求“对象”和“对象变量”之间的区别。 我知道什么是对象(类的特定实例),但是我似乎无法在书中的任何地方(无答案部分)或在互联网上找到术语“对象变量”。 有人知道这个名词的意思吗? 问题答案: 它是“实例变量”的同义词: 显然,该术语并不常用,最好坚持使用“实例变量”以避免任何潜在的歧义。
问题内容: 为什么我们可以通过Java中的对象引用访问静态变量,如下面的代码? 问题答案: 通常,每个人都可以访问公共变量,并且只能从该类的当前实例内部访问私有变量。在您的示例中,您被允许从方法中访问变量,因为该方法在Static类内。 如果您想知道为什么为什么要允许您从静态类的另一个实例(而不是当前实例)访问它(通常不允许使用私有变量),这仅仅是因为静态变量不存在于静态类中。每个实例,但每个班级
问题内容: 我有一个带有静态实例的android java类,其中包含一个用户信息。但是,在极少数情况下,当用户使用我的应用程序时,该静态实例中的变量之一会在一段时间后变为null。该Java类是全局的(未附加到任何活动)。是什么原因造成的? 编辑:该变量永远不会更改,除非在应用程序启动期间。我已经检查过调用它的函数永远不会被调用一次以上(adb logcat证明了当我添加一条日志表明正在被调用时
问题内容: 类的静态成员是否在每个进程或线程中仅作为单个实例存在?意思是每个线程都具有自己的类的静态成员变量副本吗? 我的猜测是每个过程,对吗? 问题答案: 静态 字段 为每个类加载器提供一个值。 如果需要每个线程的值,请设置static 。
问题内容: 根据Java,静态变量可以通过类名访问,但是即使Java不建议使用静态变量,类对象也可以访问它们,并且给出相同的答案。 我知道该变量只有一个副本,并且所有对象和其他事物的值都相同。Java为什么建议使用类名而不是类对象? 问题答案: 因为可能会造成混淆!静态成员上没有动态调度。 看一下这个令人困惑的代码:(可能是语法错误;我的Java生锈了) 看起来很混乱,因为方法似乎是多态的,所以输