Java继承中的构造器问题

继承结构中,父类的构造器只能够被调用,而不能被子类继承。 调用父类的构造方法要在子类的构造器中使用super()

“对于子类,其构造器的正确初始化是非常重要的,而且当且仅当只有一个方法可以保证这点:在构造器中调用父类构造器来完成初始化,而父类构造器具有执行父类初始化所需要的所有知识和能力。”

正常情况下,子类会默认自动调用父类的构造器(无参的,不管是自己手动写的的还是系统自动新建的),但是如果父类没有无参构造器,子类必须要显式地调用父类的带参构造器,而且必须是在子类构造器中做的第一件事(第一行代码)。

请看简短的代码:

class Person {
    protected String name;
    Person(String name) {
        System.out.println("Person Constrctor-----" + name);
    }
    Person() {
        System.out.println("Person Constrctor-----");
    }
}

public class Husband extends Person {
    Husband() {
        // 从结果可以看出,系统自动调用的父类的Person()方法
        System.out.println("Husband Constructor...");
    }
    public static void main(String[] args) {
        Husband husband = new Husband();
    }
}

运行结果:

Person Constrctor-----
Husband Constructor...

再看,对比一下有参的时候的情况:

class Person {
    protected String name;
    Person1(String name) {
        System.out.println("Person Constrctor-----" + name);
    }
}

public class Husband extends Person {
    Husband() {
        /** 
         * 必须在这显式地调用父类的构造函数,否则会报错,因为父类里面我们新建了一
         * 个自定义了带参构造器,而没有重载一个无参构造器
         * 系统就不会为我们新建默认构造器了,在这里也就自然不会隐式地调用父类的
         * 默认构造器
         */
        super("chenssy");
        System.out.println("Husband Constructor...");
    }
    public static void main(String[] args) {
        Husband husband = new Husband();
    }
}

运行结果:

Person Constrctor-----chenssy
Husband Constructor...

猜你喜欢

转载自blog.csdn.net/qq_38232598/article/details/80656947
今日推荐