例如,我有一个这样的课程:
public class StaticObjectReference{
private static StaticObjectReference instance;
private Vector queue;
public static StaticObjectReference getInstance(){
if(instance == null){
instance = new StaticObjectReference();
}
return instance;
}
public Vector getQueue(){
queue = new Vector();
return queue;
}
}
接下来的两个类称为StaticObjectReference
类。
public class CallerOne{
Vector queue1;
public void callObjectInstance1(){
queue1 = StaticObjectReference.getInstance().getQueue();
}
}
class CallerTwo{
Vector queue2;
public void callObjectInstance2(){
queue2 = StaticObjectReference.getInstance().getQueue();
}
}
CallerOne类中的queue1
是CallerTwo类中的同一个实例queue2
吗?
答案 0 :(得分:2)
您正在使用类StaticObjectReference
的相同实例来到队列,所以是的,它们是相同的队列。
请注意,无任何事情直接使用 instance
是静态的这一事实。还有更多要做的事情,这个类是实现Singleton pattern ,所以只有一个类的实例。
Brian指出,这个实现不是线程安全的。检查维基百科链接以获取线程安全方法。
答案 1 :(得分:2)
如果对象引用是静态的,是否意味着该对象的属性也是静态的?
如果你从字面上读它,这个问题没有意义......这可能是你不确定性的根源。
术语static(在Java中)表示变量属于类,而不是实例或方法调用。此处标记为static
的内容是变量。变量和变量中包含的值之间的区别是至关重要的。
对象引用不能是静态的。静态不是对象引用的有意义属性。它根本没有意义。对象引用是值,而不是变量。
虽然static
变量包含对对象的引用,但(通常)不会使它包含的对象引用(或它引用的对象)为静态。除术语问题外,如果更改static
变量,则最初引用的变量可能的对象消失。这显然是非静态行为。
事实上,instance
变量和queue
的静态问题是正交问题。如果变量声明为static
,则它们是静态的。否则他们不是。
现在您的代码确保 1 只有StaticObjectReference
的一个实例。但这是你编写类的方式的一个新兴属性,而不是与这两个变量的声明(static
或其他)有关。我们不会将此属性称为“静态”。我们称之为“单身人士”......如果你能原谅我滥用英语......
1 - 实际上,它并不总能保证因为它不是线程安全的,所以写成。