【问题标题】:Why do I need another constructor in an extended abstract class? [duplicate]为什么在扩展抽象类中需要另一个构造函数? [复制]
【发布时间】:2016-04-30 00:05:39
【问题描述】:

我遇到了这个问题,我想知道这里有什么区别:

abstract class Abstract {
    Abstract() {
        System.out.println("Abstract.Abstract()");
    }

    Abstract(String s) {
        System.out.println("Abstract.Abstract(String)");
    }

    void test() {
        System.out.println("Abstract.test()");
    }

    void test(String s) {
        System.out.println("Abstract.test(s)");
    }
}

abstract class Base extends Abstract {
}

class Sub extends Base {
    Sub(String s) {
        super(s);   // undefined constructor
    }

    void subTest(String s) {
        super.test(s);  // why is this all right then?
    }
}

为什么我必须定义 Base(String s) 构造函数以使其可编译,但 super.test(s) 调用没有定义任何内容就可以了?

【问题讨论】:

    标签: java inheritance constructor abstract-class default-constructor


    【解决方案1】:

    Java 在 any 类中为您提供了默认构造函数(即使您自己没有定义一个),这意味着您在 Base 类中有 Base() 默认构造函数,但没有任何其他构造函数(带参数的,例如Base(String s)because constructors are not inherited

    另外,扩展一个类通过继承给你它的方法,所以在这里调用super.test(s)是合法的,因为Base的方法test(String s)继承自Abstract

    【讨论】:

      【解决方案2】:

      因为Base 只定义了一个构造函数,即调用超类无参数构造函数的无参数默认构造函数。

      现在,Sub 可以使用哪些超类 cunstructors?只有一个。

      【讨论】:

        猜你喜欢
        • 2018-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-13
        • 2021-02-05
        • 1970-01-01
        • 1970-01-01
        • 2013-11-25
        相关资源
        最近更新 更多