父类与子类的初始化顺序

孤者浪人 提交于 2020-02-29 14:04:15

1. 构造器没有参数

创建爷爷类

public class GrandFather {
    public GrandFather() {
        System.out.println("爷爷");
    }
}

创建父亲类

public class Father extends GrandFather {
    public Father() {
        System.out.println("爸爸");
    }
}

创建A类

创建儿子类

public class A {
    public A() {
        System.out.println("A");
    }
}
public class Son extends Father {
    public Son() {
        System.out.println("儿子");
    }
     A a = new A();
    public static void main(String[] args) {
        new Son();
    }
}

运行结果:
爷爷
爸爸
A
儿子

结论:

  1. 构造过程是从父类“向外”扩散的,所以父类在子类构造器可以访问它之前,就已经完成了初始化,即使没有Son类的构造器,编译器也会默认合成一个构造器,然后调用父类的构造器。
  2. 虽然Son的构造方法在new A()之前,但是还是先执行了new A(),在执行Son的构造方法。也就是Son构造器初始化的时候会执行除构造函数和其他方法之外的其他代码;

接着在main方法中加入

getSuperClass(son.getClass());

getSuperClass方法体

    private static void getSuperClass(Class t) {
        System.out.println(t.getSuperclass());
        while (t!=null){
            getSuperClass(t.getSuperclass());
        }
    }

结果:
爷爷
爸爸
A
儿子
class javabianchengsixiang.Seven.Father
class javabianchengsixiang.Seven.GrandFather
class java.lang.Object
null(报异常)

结论:虽然没有显示的继承Object类,但是Son构造器会隐式的继承Object类

2. 构造器有参数

创建爷爷类

public class GrandFather {
    public GrandFather(int i) {
        System.out.println("爷爷");
    }
}
注意:创建父亲类

在这里插入图片描述
编译器提示我们不能这样创建;
解决办法有两种:

  1. 在爷爷类中显示的加入构造方法
  2. 使用super关键字,像这样:
    public class Father extends GrandFather {
        public Father() {
            super(666);
            System.out.println("爸爸");
        }
    }

儿子类

public class Son extends Father {
    public Son() {
        System.out.println("儿子");
    }
    public static void main(String[] args) {
        Son son = new Son();
    }
}

结果:
爷爷666
爸爸
儿子

结论:如果父类中的构造器有参数,则子类必须使用super关键字来继承。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!