无意中看到这样一个程序段:
class Singleton {
private static Singleton obj = new Singleton();
public static int counter1;
public static int counter2 = 0;
private Singleton() {
counter1++;
counter2++;
}
public static Singleton getInstance() {
return obj;
}
}
public class MyMain {
public static void main(String[] args) {
Singleton obj = Singleton.getInstance();
System.out.println("obj.counter1=="+obj.counter1);
System.out.println("obj.counter2=="+obj.counter2);
}
}
自己预期结果:
obj.counter1==1
obj.counter2==1实际运行一下得到如下结果:
obj.counter1==1
obj.counter2==0发现自己解释不了,谁来帮忙解释下这个问题。另外调整 private static Singleton obj = new Singleton(); 这行代码位置,输出结果也有所不同。
解决方案 »
- 关于时间组件的问题
- 关于JDBC
- struts2上传图片,然后jsp页面显示图片,问题!
- 我想在我的jsp网页上出现一个这样的效果 希望前辈赐教!!
- 最简单的提问?初入江湖,不懂江湖规矩,请多指教
- .net和j2ee在开发具体应用时该如何做选择
- 请教actionservlet填充actionform的实现原理
- hibernate和spring的配置文件是分开时,在spring配置中怎么使用dataSource?
- 再次提问weblogic8,调用oracle存储过程乱码的问题?
- 请问大虾们,多个ejb server的情况下,如何使用代码在ejb object中call另外某个ejb server上的ejb object急!!!
- 使用jQuery简化Ajax 开发
- 有熟悉adobe LiveCycle Forms的吗,求帮助文档?
Singleton 的静态变量 counter1,counter2 以及静态引用obj 的初始化都是在类加载的时候就初始化完成了吧,应该把main方法改成下面这样
public static void main(String[] args) {
System.out.println(Singleton.counter1);
System.out.println(Singleton.counter2);
}
结果应该也是:
1
0
应该没错吧
lz可以试试把private static Singleton obj = new Singleton();句放到另外两个成员变量后面,看看打印结果应该就明白了
恩,谢谢,这个算是明白了,还有能不能帮你再给我解释下这个:
public class Test{ static {
b = 9;
int i = b;// 报错
int j = b = 9;
System.out.println(b);// 报错
}
static {
b = 9;
int i = Test.b;// 不报错
int j = b = 9;
System.out.println(Test.b);// 不报错
}
static int b=0;
}
首先我觉得这么做没有任何意义,jdk在执行b=9;这句时会去查找是否存在该变量,实际上相当于Test.b,而int i = b;时它会认为该变量是有效的!
那这样的话,两个static块中的int j = b = 9; 岂不是也会出错?
原来单例还可以这么玩,真是领教了他的意思说没有obj.counter1没有初始化就直接引用应该会编译错误