java - 为什么在扩展抽象类中需要另一个构造函数?

标签 java inheritance constructor abstract-class default-constructor

<分区>

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

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 在任何 类中为您提供默认构造函数(即使您没有自己定义一个),这意味着您在类 中有 Base() 默认构造函数>Base,但不是任何其他构造函数(带参数的构造函数,例如 Base(String s))because constructors are not inherited .

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

关于java - 为什么在扩展抽象类中需要另一个构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34962810/

相关文章:

java - 在 XmlValidatingMessageSelector 中关闭 DTD 加载和验证

C++继承/未声明的标识符问题

java - 如何在构造函数中避免这种不必要的 throws 语句?

VB.Net调用New而不赋值

java - Eclipse Java 格式化程序。花括号之前换行,但之后没有

java - 如何终止 NetBeans 中正在运行的 Maven 构建?

java - Android 上的 Junit 测试 Realm 。无法在未调用 Looper.prepare() 的线程内创建处理程序

c++ - 私有(private)继承 vs 包含

Python使用super覆盖属性,传递参数时出现意外的参数错误

constructor - ImageElement的构造函数