1

例如我有一个这样的类:

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();
    }
}

CallerOnequeue1类中的 是 CallerTwo 类中的同一个实例queue2吗?

4

2 回答 2

2

您正在使用该类的相同实例StaticObjectReference来访问队列,所以是的,它们是同一个队列。

请注意,这与静态的事实没有 直接关系。这个类实现了单例模式还有更多的事情要做,所以这个类只有一个实例。instance

正如布赖恩指出的那样,这个实现不是线程安全的。检查 wikipedia 链接以获取线程安全方法。

于 2013-01-10T02:39:29.240 回答
2

如果对象引用是静态的,是否意味着该对象的属性也是静态的?

如果你从字面上看这个问题是没有意义的……这可能是你不确定的根源。

术语静态(在 Java 中)意味着变量属于一个类,而不是实例或方法调用。这里被标记为的东西static是一个变量。变量和变量中包含的值之间的区别是至关重要的。

对象引用不能是静态的。静态性对于对象引用来说不是一个有意义的属性。这根本没有意义。对象引用是一个值,而不是变量。

虽然static变量包含对对象的引用,但(通常)不会使其包含的对象引用(或它引用的对象)成为静态的。除了术语问题,如果你改变一个static变量,这个变量最初引用的对象可能会消失。这显然是非静态行为。

实际上,instance变量的静态性和queue正交性问题。如果变量声明static,则它们是静态的。否则他们不是。

现在您的代码确保1永远只有一个StaticObjectReference. static但这是您编写类的方式的一个紧急属性,与这两个变量的声明(或其他)无关。而且我们不会将此属性称为“静态性”。我们称之为“单身”......如果你能原谅我滥用英语......


1 - 实际上,它并不总是保证这一点,因为它不是线程安全的,如所写。

于 2013-01-10T02:54:41.910 回答