黑马程序员技术交流社区

标题: 关于构造方法super的小问题 [打印本页]

作者: lvyanxin    时间: 2016-8-6 23:29
标题: 关于构造方法super的小问题
class A{
        A(){
                System.out.println("a");
        }
}
class B extends A{
       
        B(){
                super();
                System.out.println("b");
        }
        C c = new C();
}

class C{
        C(){
                System.out.println("c");
        }
}
public class Demo {
        public static void main(String[] args) {
                B b = new B();
        }
}



输出结果为什么不是a,b,c
作者: showJiang    时间: 2016-8-6 23:46
没看出来C这个类跟AB有什么关系呢
作者: renhao929    时间: 2016-8-6 23:48
不大清楚你什么意思啊
作者: 夜行御史    时间: 2016-8-7 00:09
建议加几个断点,debug跟一下
作者: lvyanxin    时间: 2016-8-7 00:18
renhao929 发表于 2016-8-6 23:48
不大清楚你什么意思啊

程序的执行过程。为什么初始化父类之后就运行new C
作者: lvyanxin    时间: 2016-8-7 00:19
showJiang 发表于 2016-8-6 23:46
没看出来C这个类跟AB有什么关系呢

c为什么会先于b打印
作者: lvyanxin    时间: 2016-8-7 00:21
夜行御史 发表于 2016-8-7 00:09
建议加几个断点,debug跟一下

解释一下原因呢
作者: aliali007    时间: 2016-8-7 20:51
执行顺序如下:
如果有静态代码块(本题没有),就先执行父类静态代码块,子类静态代码块。
然后再按照如下顺序执行:
父类普通代码块——无;
父类构造函数——打印a;
子类普通代码块(C c = new C();)——打印C;
子类构造函数——打印b。
作者: lvyanxin    时间: 2016-8-7 21:23
aliali007 发表于 2016-8-7 20:51
执行顺序如下:
如果有静态代码块(本题没有),就先执行父类静态代码块,子类静态代码块。
然后再按照如下 ...

get it
作者: qetu001212    时间: 2016-8-7 22:16
aliali007 发表于 2016-8-7 20:51
执行顺序如下:
如果有静态代码块(本题没有),就先执行父类静态代码块,子类静态代码块。
然后再按照如下 ...

原来在类中方法外创建对象会被默认这一句为构造代码块,学到了!!!
作者: wmc1994    时间: 2016-8-7 22:46
输出结果是a c b,每New 一个对象,JVM都会先执行一次构造方法
作者: lvyanxin    时间: 2016-8-7 23:22
class A{
        D d=new D();
        A(){
                System.out.println("a");
        }
}
class B extends A{
        C c=new C();
        B(){
                System.out.println("b");
        }
}
class C {
        C(){
                System.out.println("c");
        }
}
class D {
        D(){
                System.out.println("d");
        }
}

public class Test3 {
        public static void main(String[] args) {
                 B b=new B();
        }
}
结果:d a c b
作者: x55555lg    时间: 2016-8-7 23:38
C c = new C()是成员属性,成员属性比构造方法先初始化
作者: 夜行御史    时间: 2016-8-7 23:44
lvyanxin 发表于 2016-8-7 00:21
解释一下原因呢

简单来说,当主方法中new B();时,执行B的构造方法,加载B类中的成员变量,也就是c,初始值为null;然后构造方法执行,但要先执行super,调用其父类A,输出a,然后给成员变量赋值,即调用new C();输出c,然后B构造方法执行结束。好吧,说了这么多,其实一点不简单。
作者: showJiang    时间: 2016-8-8 19:22
lvyanxin 发表于 2016-8-7 00:19
c为什么会先于b打印

噢,没看见B里面还有个new C,C c = new C()是B的成员变量,构造函数就是用于初始化的,所以会先初始化自己的成员变量,所以先输出c,具体底层怎么实现的,就不知道了
作者: lvyanxin    时间: 2016-8-8 21:46
静态代码块优先于普通构造代码块优先于构造函数




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