22.3 Extends 构造方法的执行顺序

/*
* 1.有子父类继承关系的类中,创建父类对象未调用,执行父类无参构造
* 2.有子父类继承关系的类中,创建子类对象未调用,执行顺序:默认先调用 父类无参构造---子类无参构造
* 在子类的构造方法的第一行代码如果没有调用父类的构造或者没有调用子类的其他构造,则默认调用父类无参构造
*
* * 为什么要调用父类构造?
* 因为需要给父类的成员变量初始化
* 肯定会先把父类的构造执行完毕,在去执行子类构造中的其他代码
* */


1.创建子类对象,使用子类无参构造,子类无参构造第一行代码没有调用其他构造。
故输出顺序:
  父类无参构造---子类无参构造
public class ExtendsFunDemo {
    public static void main(String[] args) {
//        Dad6 d = new Dad6();
        Kid6 k = new Kid6();

    }
}

class Dad6 {
    public Dad6() {
        System.out.println("父类无参构造");
    }

    public Dad6(String name) {
        System.out.println("父类有参构造");
    }
}

class Kid6 extends Dad6 {
    public Kid6() {
        System.out.println("子类无参构造");
    }

    public Kid6(String name) {
        System.out.println("子类有参构造");
    }
}

执行结果

2.
* 1.子类构造方法第一行使用this调用该类的有参构造,所以执行顺序:
* (先执行无参中的this即(在执行this中的有参,有参第一行没有调用)父类无参--)子类有参--子类无参
* 2.同理,子类构造第一行使用super调用父类的有参构造,执行顺序:
* (先执行无参中的super即)父类有参---子类无参
public class ExtendsFunDemo2 {
    public static void main(String[] args) {
        Kid2 k = new Kid2();
    }
}

class Kid2 extends Dad6 {
    public Kid2() {
        this("小明");
//        super("大明");
        System.out.println("子类无参构造");
    }

    public Kid2(String name) {
//        super("大明");
        System.out.println("子类有参构造");
    }
}

输出

3.
* 创建子类对象,调用子类的有参构造方法
* 执行顺序:
* (子类构造方法第一行无调用)父类无参---子类有参
* 同理:
* 子类有参第一行调用子类无参(子类无参第一行未调用,先执行父类无参)
* 执行顺序:父类无参---子类无参--子类有参
public class ExtendsFunDemo3 {
    public static void main(String[] args) {
        Kid3 k = new Kid3("小明");
    }
}

class Dad3 {
    public Dad3() {
        System.out.println("父类无参");
    }

    public Dad3(String name) {
        System.out.println("父类有参");
    }
}

class Kid3 extends Dad3 {
    public Kid3() {
//        super("大明");
        System.out.println("子类无参");
    }

    public Kid3(String name) {
        this();
        System.out.println("子类有参");
    }
}

输出




原文地址:https://www.cnblogs.com/longesang/p/11206037.html