java初始化问题

yanebupt 2011-02-23 02:00:04

无意中看到这样一个程序段:
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(); 这行代码位置,输出结果也有所不同。
...全文
220 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
跑跑跳跳噢 2011-03-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yangyan19870319 的回复:]

引用 5 楼 gray_sky 的回复:

引用 4 楼 yangyan19870319 的回复:
引用 1 楼 gray_sky 的回复:
Singleton 的静态变量 counter1,counter2 以及静态引用obj 的初始化都是在类加载的时候就初始化完成了吧,应该把main方法改成下面这样
public static void main(String[] args) {
……
[/Quote]


提这个问题说明lz没有看题目,b都没有声明变量类型
龙四 2011-03-10
  • 打赏
  • 举报
回复
看不进去《深入java虚拟机》,也该看看《java解惑》啊,都是书本上的内容
Joop_Song 2011-03-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 joop_song 的回复:]
引用 11 楼 yangyan19870319 的回复:
引用 10 楼 shaofei830927 的回复:

你确定 obj.counter1 能够编译通过?


什么意思?


原来单例还可以这么玩,真是领教了。。。

他的意思说没有obj.counter1没有初始化就直接引用应该会编译错误。。。
[/Quote]竟然还没有结贴。。。
lovingaccount 2011-02-24
  • 打赏
  • 举报
回复
new Singleton()的时候会调用无参的构造方法.然后再赋值,最后得到结果obj.counter1=1,obj.counter2=0;
yanebupt 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 joop_song 的回复:]

引用 11 楼 yangyan19870319 的回复:

原来单例还可以这么玩,真是领教了。。。

他的意思说没有obj.counter1没有初始化就直接引用应该会编译错误。。。
[/Quote]

恩 ,刚开始分析这个的时候,由于是单例感觉就是个死循环和递归,给弄晕了
Joop_Song 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yangyan19870319 的回复:]
引用 10 楼 shaofei830927 的回复:

你确定 obj.counter1 能够编译通过?


什么意思?
[/Quote]

原来单例还可以这么玩,真是领教了。。。

他的意思说没有obj.counter1没有初始化就直接引用应该会编译错误。。。
yanebupt 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 shaofei830927 的回复:]

你确定 obj.counter1 能够编译通过?
[/Quote]

什么意思?
shaofei830927 2011-02-23
  • 打赏
  • 举报
回复
你确定 obj.counter1 能够编译通过?
yanebupt 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gray_sky 的回复:]

首先我觉得这么做没有任何意义,jdk在执行b=9;这句时会去查找是否存在该变量,实际上相当于Test.b,而int i = b;时它会认为该变量是有效的!
[/Quote]

那这样的话,两个static块中的int j = b = 9; 岂不是也会出错?
ETCentury 2011-02-23
  • 打赏
  • 举报
回复
楼上解释的很给力
Gray_Sky 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yangyan19870319 的回复:]
还有能不能帮你再给我解释下这个:
……
[/Quote]

首先我觉得这么做没有任何意义,jdk在执行b=9;这句时会去查找是否存在该变量,实际上相当于Test.b,而int i = b;时它会认为该变量是有效的!
yanebupt 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gray_sky 的回复:]

引用 4 楼 yangyan19870319 的回复:
引用 1 楼 gray_sky 的回复:
Singleton 的静态变量 counter1,counter2 以及静态引用obj 的初始化都是在类加载的时候就初始化完成了吧,应该把main方法改成下面这样
public static void main(String[] args) {
System.out.println(Sing……
[/Quote]

恩,谢谢,这个算是明白了,还有能不能帮你再给我解释下这个:
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;
}
Gray_Sky 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yangyan19870319 的回复:]
引用 1 楼 gray_sky 的回复:
Singleton 的静态变量 counter1,counter2 以及静态引用obj 的初始化都是在类加载的时候就初始化完成了吧,应该把main方法改成下面这样
public static void main(String[] args) {
System.out.println(Singleton.counter1);
System.out.println(Singleton.counter2);
}
结果应该也是:
1
0
应该没错吧[/Quote]

lz可以试试把private static Singleton obj = new Singleton();句放到另外两个成员变量后面,看看打印结果应该就明白了
yanebupt 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gray_sky 的回复:]

当程序执行private static Singleton obj = new Singleton(); 句的时候就去调用了Singleton构造器,此时counter1、counter2都是1,但是接着执行向下执行:public static int counter1;时将1赋给counter1,执行public static int counter2 = 0;时重新给counter2赋值为0……
[/Quote]

Singleton 的静态变量 counter1,counter2 以及静态引用obj 的初始化都是在类加载的时候就初始化完成了吧,应该把main方法改成下面这样
public static void main(String[] args) {
System.out.println(Singleton.counter1);
System.out.println(Singleton.counter2);
}
结果应该也是:
1
0
应该没错吧
soft_xiang 2011-02-23
  • 打赏
  • 举报
回复
对,静态的,按顺序
zn85600301 2011-02-23
  • 打赏
  • 举报
回复
初始化顺序的问题
Gray_Sky 2011-02-23
  • 打赏
  • 举报
回复
当程序执行private static Singleton obj = new Singleton(); 句的时候就去调用了Singleton构造器,此时counter1、counter2都是1,但是接着执行向下执行:public static int counter1;时将1赋给counter1,执行public static int counter2 = 0;时重新给counter2赋值为0

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧