【发布时间】:2017-02-24 08:28:51
【问题描述】:
我是新人,请不要介意你觉得这个问题很愚蠢。我弄乱了单例代码。我稍微改了一下(我的问题与单例无关,是的,我已经删除了单例检查)。我的问题是虽然 java 中的类实例只能是为什么输出中有两个静态类“实例”(参见哈希)的一个原因。我知道“new”关键字会给出一个新的内存地址(这就是在哈希中打印的内容)但不是t 静态类实例应该是一个?所以我得到了两个用于打印对象实例的哈希,静态变量 k 具有相同的值,这很好。
public class Singleton {
private static Singleton instance;
static int k;
public static Singleton getInstance(){
try{
instance = new Singleton();
System.out.println(instance);
}catch(Exception e){
throw new RuntimeException("Exception occured in creating singleton instance");
}
return instance;
}
public static void main(String[] ar) {
Singleton c1=Singleton.getInstance();
c1.k=1;
Singleton c2=Singleton.getInstance();
c2.k=2;
System.out.println(c1.k);
System.out.println(c2.k);
}
}
输出:
Singleton@15db9742
Singleton@6d06d69c
2
2
【问题讨论】:
-
你想在这里问什么?
-
您的代码不是单例,每次调用
getInstance()时都会生成一个新实例。 -
static表示只有 1 个变量实例。它与您创建多少对象实例无关。 -
Java 中没有“静态类实例”之类的东西;您的问题似乎是基于缺乏对 Java 基础知识的理解。您的类中只有一个静态字段,其中包含您创建的最后一个实例。您将获得两个不同的实例,因为这就是您的代码所做的:每次调用
getInstance()方法时创建一个新实例。 -
再次,这是基本的 Java。它只是一个字段,可以随时(重新)分配。与非静态字段的区别在于该字段由类拥有,而不是由该类的实例拥有。并且
static Singleton s=new Singleton()是完全允许的,只要该定义在 class 主体中,而不是在方法主体中。