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

时间:2013-01-10 02:37:57

标签: java object static

例如,我有一个这样的课程:

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吗?

2 个答案:

答案 0 :(得分:2)

您正在使用类StaticObjectReference的相同实例来到队列,所以是的,它们是相同的队列。

请注意无任何事情直接使用 instance是静态的这一事实。还有更多要做的事情,这个类是实现Singleton pattern ,所以只有一个类的实例。

Brian指出,这个实现不是线程安全的。检查维基百科链接以获取线程安全方法。

答案 1 :(得分:2)

  

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

如果你从字面上读它,这个问题没有意义......这可能是你不确定性的根源。

术语static(在Java中)表示变量属于类,而不是实例或方法调用。此处标记为static的内容是变量。变量和变量中包含的值之间的区别是至关重要的。

对象引用不能是静态的。静态不是对象引用的有意义属性。它根本没有意义。对象引用是值,而不是变量。

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

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

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


1 - 实际上,它并不总能保证因为它不是线程安全的,所以写成。