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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刘向阳 于 2012-8-6 19:31 编辑

public class Test {
        public static void main(String[] args) {
                new B();
        }
}

class A {
        static {
                System.out.println("A");
        }
        A() {
                System.out.println("B");
        }
        A(int i) {
                this();
                System.out.println("C");
        }
}

class B extends A {
        static {
                System.out.println("D");
        }
        A a = new A(123);
        B() {
                System.out.println("E");
        }
}

这个类到底是怎样子的加载流程啊?

6 个回复

倒序浏览
1,首先创建了一个B的对象,进入B的无参构造函数,默认第一行有一句super(),所以进入A的无参构造函数,所以执行静态代码块,打印"A"
2,回到B的无参构造函数,执行静态代码块,打印"D",然后执行A的无参构造函数打印"B"
3,在B中创建了一个有参的A对象,调用A的有参构造函数,遇到this()关键字,调用自己的无参构造函数,打印"B",再打印一个"C",继续执行,打印一个E
结果: A D B B C E

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报

public class Test {
        public static void main(String[] args) {
                new B();
        }
}

class A {
        static {
                System.out.println("A");        //1父类静态代码块随类的加载加载  A
        }
        A() {
                System.out.println("B");        //3 创建对象初始化 B
        }
        A(int i) {                                                        // 4this()调用构造函数A() 打印B
                this();
                System.out.println("C");        // 5 打印C
        }
}

class B extends A {
        static {
                System.out.println("D");        //2 子类静态代码块随类的加载而加载 D
        }
        A a = new A(123);                                        //4 创建对象调用父类的方法 A(int i)
        B() {
                System.out.println("E");        // 6最后执行 打印 E

        }
}
希望对你有帮助啊
回复 使用道具 举报
本帖最后由 杜佳瑞 于 2012-8-6 19:33 编辑

记住这个顺序应该没问题了
1,当new一个Zi对象时,首先将Zi.class以及父类文件加载到内存中。
2,执行父类中得static代码块,static成员变量初始化,这两个static代码按顺序执行,然后再执行子类的static代码块和static成员变量。
3,父类中普通成员变量初始化以及构造代码块执行,无优先级之分,顺序如同静态。
4,最后执行父类中构造函数,完毕后才向下执行子类。
5,子类中普通成员变量、代码块、构造函数执行顺序同父类。
回复 使用道具 举报
看看这个图,虽然不太成熟 呵呵

未命名111.jpg (57.3 KB, 下载次数: 6)

未命名111.jpg
回复 使用道具 举报
谢谢各位的鼎力支持,明白了
回复 使用道具 举报
创建B的对象时的初始化过程   1.首先执行父类的初始化 而静态代码块的优先执行 父类中初始化静态部分打印A 接着子类的静态代码块部分 打印D  2.接下来是父类的初始化 类代码块{ } 优先于构造器执行(程序中无)  所以,执行new B()时会首先隐式调用父类的默认构造器 父类的类代码块会先 执行(程序中无)  父类默认构造器 A()执行打印B 父类初始化完成   3. 接着是子类的初始化   子类中创建了父类对象  A a=new A(int )时 由于父类已经加载到内存 虚拟机优先完成A类对象的内存分配  a通过有参数构造器 new A(int i)分配空间  此构造器显示调用了 A类中的无参数构造器 打印B 然后打印c  ,接着是子类默认构造器 打印 E
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马