黑马程序员技术交流社区

标题: 【已解决】一头雾水啊,彻底让程序搞懵了,求高手指点... [打印本页]

作者: hello world    时间: 2012-8-6 18:43
标题: 【已解决】一头雾水啊,彻底让程序搞懵了,求高手指点...
本帖最后由 刘向阳 于 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");
        }
}

这个类到底是怎样子的加载流程啊?
作者: 杨锦    时间: 2012-8-6 18:52
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
作者: 王晓龙    时间: 2012-8-6 19:22

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:29
本帖最后由 杜佳瑞 于 2012-8-6 19:33 编辑

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

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

未命名111.jpg

作者: hello world    时间: 2012-8-6 19:32
谢谢各位的鼎力支持,明白了
作者: 涂金哲    时间: 2012-8-6 20:00
创建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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2