Java 如果对象引用是静态的,是否意味着该对象的属性也是静态的?
例如,我有一个这样的类:Java 如果对象引用是静态的,是否意味着该对象的属性也是静态的?,java,object,static,Java,Object,Static,例如,我有一个这样的类: public class StaticObjectReference{ private static StaticObjectReference instance; private Vector queue; public static StaticObjectReference getInstance(){ if(instance == null){ instance = new Stati
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
相同 您正在使用类的同一实例StaticObjectReference
访问队列,因此是的,它们是相同的队列
请注意这与实例是静态的这一事实没有直接关系。该类实现了,因此该类只有一个实例
正如Brian指出的,这个实现不是线程安全的。检查wikipedia链接中的线程安全方法。您使用的是类的相同实例StaticObjectReference
,因此它们是相同的队列
请注意这与实例是静态的这一事实没有直接关系。该类实现了,因此该类只有一个实例
正如Brian指出的,这个实现不是线程安全的。检查wikipedia链接中的线程安全方法
如果对象引用是静态的,是否意味着该对象的属性也是静态的
如果你逐字读下去,这个问题就没有意义了。。。这可能是你不确定的根源
术语static(在Java中)表示变量属于类,而不是实例或方法调用。这里标记为static
的东西是一个变量。变量和变量中包含的值之间的区别至关重要
对象引用不能是静态的。对于对象引用,静态属性不是有意义的属性。这根本没有道理。对象引用是一个值,而不是一个变量
当一个静态变量持有一个对象的引用时,它(通常)不会使它所包含的对象引用(或它所引用的对象)是静态的。除了术语问题之外,如果您更改静态变量
,变量最初引用的对象可能会消失。这显然是非静态行为
事实上,实例
变量和队列
的静态性是正交问题。如果变量声明为静态
,则它们是静态的。否则,它们就不是
现在,您的代码确保只有一个StaticObjectReference
实例。但这是编写类的方式的一个紧急属性,与这两个变量的声明(static
或其他)无关。我们不会把这个属性叫做“静态性”。我们称之为“独身性”。。。请原谅我滥用英语
1-实际上,它并不总是保证这一点,因为它不是线程安全的
如果对象引用是静态的,是否意味着该对象的属性也是静态的
如果你逐字读下去,这个问题就没有意义了。。。这可能是你不确定的根源
术语static(在Java中)表示变量属于类,而不是实例或方法调用。这里标记为static
的东西是一个变量。变量和变量中包含的值之间的区别至关重要
对象引用不能是静态的。对于对象引用,静态属性不是有意义的属性。这根本没有道理。对象引用是一个值,而不是一个变量
当一个静态变量持有一个对象的引用时,它(通常)不会使它所包含的对象引用(或它所引用的对象)是静态的。除了术语问题之外,如果您更改静态变量
,变量最初引用的对象可能会消失。这显然是非静态行为
事实上,实例
变量和队列
的静态性是正交问题。如果变量声明为静态
,则它们是静态的。否则,它们就不是
现在,您的代码确保只有一个StaticObjectReference
实例。但这是编写类的方式的一个紧急属性,与这两个变量的声明(static
或其他)无关。我们不会把这个属性叫做“静态性”。我们称之为“独身性”。。。请原谅我滥用英语
1-事实上,它并不总是保证这一点,因为它不是线程安全的,正如所写的那样。哦,谢谢。我将尝试运行它并获取queue1和queue2的hashCode(),以确保安全。我刚刚想到了它。除了这是一种不安全且不正确的实现单例的方法外,如果这是多线程的,它可能会生成两个不同的StaticObjectReference
类实例。但是在我链接的维基百科页面中显示了线程安全选项。是的。。。但值得一提的是,OP不是;)+哦,谢谢。我将尝试运行它并获取queue1和queue2的hashCode(),以确保安全。我刚刚想到了它。除了这是一种不安全且不正确的实现单例的方法外,如果这是多线程的,它可能会生成两个不同的StaticObjectReference
类实例。但是在我链接的维基百科页面中显示了线程安全选项。是的。。。但值得一提的是,OP不是;)+1您正在以不安全的方式实现一个单例,如果您正在谈论