美丽涵涵童装店--说我博客名字,给你们打折!
随笔 - 82  文章 - 266  trackbacks - 0
<2008年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678


点击这里给杨爱友发消息
美丽涵涵童装店
说我博客名字,给你们打折!

常用链接

留言簿(6)

随笔分类

随笔档案

文章档案

好友的BLOG

搜索

  •  

最新评论

阅读排行榜

评论排行榜

下面这段程序的打印结果是:
        obj.counter1==1
        obj.counter2==0
百思不得其解,counter1没有附初值,默认值也是0啊,为什么他们两个的结果不一样呢?
请大侠讲解下其中的原因,谢谢!
public 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 static void main(String[] args) {
    Singleton.getInstance();
    System.out.println("obj.counter1==" + counter1);
    System.out.println("obj.counter2==" + counter2);
  }
}
posted on 2008-10-28 15:26 杨爱友 阅读(1292) 评论(9)  编辑  收藏 所属分类: java相关技术

FeedBack:
# re: 类加载问题[未登录] 2008-10-28 16:38 caoer
这是因为构造函数在静态变量初始化前执行:

Singleton() -> obj.counter1==0 ->obj.counter1==1 ->类变量初始化
obj.counter2==0 obj.counter2==1
因此输出会是obj.counter1==1
obj.counter2==0  回复  更多评论
  
# re: 类加载问题 2008-10-28 16:39 日月雨林@gmail.com
你用过IDE 的debug 功能没有?一用你就知道为什么了。
改了一下:
public class Singleton {

public static int counter1;
public static int counter2 = 0;

private Singleton() {
counter1++;
counter2++;
}

public static Singleton getInstance() {
Singleton obj = new Singleton();
return obj;
}

public static void main(String[] args) {
Singleton.getInstance();
System.out.println("obj.counter1==" + counter1);
System.out.println("obj.counter2==" + counter2);
}
}
  回复  更多评论
  
# re: 类加载问题[未登录] 2008-10-28 16:43 hiker
类初始化时首先于每一个静态字段开辟一个存储区([obj],[counter1=0],[counter2=0])。接着初始化类,所有的静态成员按照顺序初始化(按代码声明顺序从上到下开始)。故,在初始化obj时候,counter1=1,counter2=1;按照顺序,->counter1=1(不变)->counter2=0.  回复  更多评论
  
# re: 类加载问题 2008-10-28 17:25 jestane
执行顺序问题:
1.先执行静态,从上往下,先执行private static Singleton obj = new Singleton();
2.执行第一步的时候,进入构造函数
3.在构造函数中count1和count2都被初始化为默认值0,并都++为1.
4.再执行public static int counter1,只是一个申明,跳过。
5.最后执行public static int counter2=0,赋值counter2为0.
6.最后就是输出的内容了。
  回复  更多评论
  
# re: 类加载问题[未登录] 2008-10-28 17:31 henry1451
private static Singleton obj = new Singleton();

public static int counter1;
public static int counter2 = 0;

把后面两句放到第一句代码的前面,就会输出相同的了,输出都为1.
所以@caoer说法有误码,正确的应该是:类的初始化顺序为,静态变量(包括类变量和类对象)按按代码声明顺序从上到下开始,再初始化其他普通变量.  回复  更多评论
  
# re: 类加载问题[未登录] 2008-10-29 10:47 james
Singleton.getInstance() 时候
开始初始化静态变量
当初始化到 private static Singleton obj = new Singleton();
调用构造函数 两个counter++
然后顺序继续静态变量
counter1 不变, counter2给了它1
所以结果是如此  回复  更多评论
  
# re: 类加载问题 2008-10-29 11:12 depeng@ncsi.com.cn
public class Singleton {

public static int counter1;
public static int counter2 = getINT();

private static Singleton obj = new Singleton();

private Singleton() {
System.out.println("Singleton()" );
counter1++;
counter2++;
}

public static int getINT(){
System.out.println("getINT()" );
return 0;
}

public static void main(String[] args) {
System.out.println("obj.counter1==" + counter1);
System.out.println("obj.counter2==" + counter2);
}
}
  回复  更多评论
  
# re: 类加载问题 2008-10-29 11:18 depeng@ncsi.com.cn
getINT()
Singleton()
obj.counter1==1
obj.counter2==1

------------------
赋值的优先权和调用方法一样
这里一定要搞清分配空间,和赋值上。 一个是栈,一个是堆
  回复  更多评论
  
# re: 类加载问题 2008-10-29 11:41 zhuxing
类型初始化 VS 实例初始化 ^_^  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
美丽涵涵童装店
亲,说我博客名字,给你们打折!