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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙地豪 中级黑马   /  2012-3-22 00:46  /  1907 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class F {

        static {
                System.out.println("父类的静态代码块");
        }

        {
                System.out.println("父类非静态代码块");
        }

        public F() {
                System.out.println("父类的构造器");
        }

}
public class C extends F {

        static F f = new F();
       
        static {
                System.out.println("子类的静态代码块");
        }
        {
                System.out.println("子类非静态代码块");
        }
        public C() {
                System.out.println("子类的构造器");
        }
       
        public static void main(String[] args) {
                C c = new C();
        }
}

有点晕,,,,,,,

4 个回复

正序浏览
本帖最后由 朱俊 于 2012-5-16 14:59 编辑

~~~~~~~~~~~~~~~~~~~~~
回复 使用道具 举报
执行先后顺序
    1静态代码块给类初始化 2(默认初始化然后再显示初始化)构造代码块给对象初始化 3构造函数给对应对象初始化
按照先后顺序判断,先把  static F f = new F();这句注释掉,比较好判断
注释掉后,按照原理静态最先执行,c是子类,f是父类,优先执行父类的静态代码。然后是子类的代码。
接下来是是构造代码块了,又因为子类构造函数super了父类的构造函数,所以父类构造函数优先于子类
的构造代码块,所以接下来是父类构造代码块 父类构造函数  子类构造代码块 子类构造
这是不加static F f = new F();这句的最终结果
父类的静态代码块      
子类的静态代码块
父类非静态代码块
父类的构造器
子类非静态代码块
子类的构造器
而加这句static F f = new F()  显然难度大了很多,但还是按照静态最先执行的原则。
static F f = new F()这句肯定要执行,所以父类的三个函数都要执行,顺序是
父类的静态代码块
父类非静态代码块
父类的构造器
而静态代码块只能执行一次的原则   现在的父类静态代码块就不执行了所以下来就是
子类静态代码块
下面的顺序和上面那个判断是一样的。结果是
父类非静态代码块
父类的构造器
子类非静态代码块
子类的构造器


所以最终结果是
                父类的静态代码块
                父类非静态代码块
                父类的构造器

                子类的静态代码块
                父类非静态代码块
                父类的构造器
                子类非静态代码块
                子类的构造器
回复 使用道具 举报
首先static{}是静态初始化块,这个只是在第一次进行初始化;{}是初始化块,每次都会初始化;
执行的顺序是:
一。在第一次使用类的时候,先加载类,然后初始化静态数据成员,接着执行类的静态初始化块;
二,在new对象的时候:
     ①调用父类的构造方法;
     ②初始化实例数据域,执行对象初始化块;
     ③执行构造方法;

在看程序:
①首先按照上面的原则,应该先加载类,然后初始化静态数据成员,在子类中有  static F f = new F();
就是执行new一个父类的对象,new的时候同样看上面的原则,应该先执行静态初始化块,然后执行初始化块在执行构造方法;
所以首先输出是:父类的静态代码块
                        父类非静态代码块
                        父类的构造器
②接着就是加载静态初始化块了,由于父类的静态块已经初始化过了,所以现在初始化子类的静态初始化块
所以在输出:子类的静态代码块
③接着就是调用构造方法来生成对象了,调用子类的构造首先要调用父类的构造,在调用父类构造的时候,会先执行初始化快,然后再执行构造方法
接着输出:父类非静态代码块
               父类的构造器
执行完父类的构造就得执行子类的构造了,同样的规则,先执行初始化块,在执行构造方法
最后输出:子类非静态代码块
               子类的构造器
回复 使用道具 举报
父类的静态代码块
父类非静态代码块
子类的静态代码块
子类非静态代码块
子类的构造器
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马