A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ☆今☆ 中级黑马   /  2013-7-28 21:11  /  1170 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

       关于静态的初始化题
public class StaticDemo {
        public static void main(String[] args) {
               
                Demo1 d = Demo1.getInstance();
                System.out.println(d.count1+"......."+d.count2);       
        }

}
class Demo1{
        private Demo1(){
                System.out.println(count1+"...构造函数前..."+count2);
                count1++;
                count2++;
                System.out.println(count1+"...构造函数后..."+count2);
        }
        public static int count1;
        public static int count2=2;
        static{
                System.out.println(count1+"...静态代码块前..."+count2);
                count1++;
                count2++;
                System.out.println(count1+"...静态代码块后..."+count2);
        }
        private static Demo1 d = new Demo1();
       
        public static Demo1 getInstance(){
                return d;
        }
}
一个类中包含静态成员变量,静态代码块等,会在类加载时,根据这些静态变量和代码的在源码中的顺序执行.
本题中就是这样的,类加载时,1,先执行两成员变量的默认和显示初始化.2,执行静态代码块,在执行静态类对象的
创建,此时调用构造函数进行初始化.
所以结果是:
0...静态代码块前...2
1...静态代码块后...3
1...构造函数前...3
2...构造函数后...4
2.......4
若把对象的创建放在成员变量初始化之前,结果就有不一样.1,先是默认初始化,再执行构造代码块,2然后才是显示初始化.
3,最后才是静态代码块.
执行结果:
0...构造函数前...0
1...构造函数后...1
1...静态代码块前...2
2...静态代码块后...3
2.......3

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 新人鼓励

查看全部评分

4 个回复

正序浏览

哥们,什么得技术分
回复 使用道具 举报
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马