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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lvyanxin 中级黑马   /  2016-8-6 23:29  /  806 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

15 个回复

倒序浏览
没看出来C这个类跟AB有什么关系呢
回复 使用道具 举报
不大清楚你什么意思啊
回复 使用道具 举报
建议加几个断点,debug跟一下
回复 使用道具 举报
renhao929 发表于 2016-8-6 23:48
不大清楚你什么意思啊

程序的执行过程。为什么初始化父类之后就运行new C
回复 使用道具 举报
showJiang 发表于 2016-8-6 23:46
没看出来C这个类跟AB有什么关系呢

c为什么会先于b打印
回复 使用道具 举报
夜行御史 发表于 2016-8-7 00:09
建议加几个断点,debug跟一下

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

get it
回复 使用道具 举报
aliali007 发表于 2016-8-7 20:51
执行顺序如下:
如果有静态代码块(本题没有),就先执行父类静态代码块,子类静态代码块。
然后再按照如下 ...

原来在类中方法外创建对象会被默认这一句为构造代码块,学到了!!!
回复 使用道具 举报
输出结果是a c b,每New 一个对象,JVM都会先执行一次构造方法
回复 使用道具 举报
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
回复 使用道具 举报
C c = new C()是成员属性,成员属性比构造方法先初始化
回复 使用道具 举报
lvyanxin 发表于 2016-8-7 00:21
解释一下原因呢

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

噢,没看见B里面还有个new C,C c = new C()是B的成员变量,构造函数就是用于初始化的,所以会先初始化自己的成员变量,所以先输出c,具体底层怎么实现的,就不知道了
回复 使用道具 举报
静态代码块优先于普通构造代码块优先于构造函数
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马