40

如何将构造函数从超类继承到子类?

4

6 回答 6

49

构造函数不是继承的,您必须在子类中创建一个新的、原型相同的构造函数,该构造函数映射到其在超类中的匹配构造函数。

这是一个如何工作的示例:

class Foo {
    Foo(String str) { }
}

class Bar extends Foo {
    Bar(String str) {
        // Here I am explicitly calling the superclass 
        // constructor - since constructors are not inherited
        // you must chain them like this.
        super(str);
    }
}
于 2010-02-23T16:26:22.237 回答
14

超类构造函数不能在扩展类中继承。虽然它可以在扩展类构造函数中以 super() 作为第一条语句来调用。

于 2012-09-08T07:21:06.767 回答
7

默认构造函数——没有参数的公共构造函数(无论是声明的还是隐含的)——都是默认继承的。您可以尝试以下代码作为示例:

public class CtorTest {
    public static void main(String[] args) {
        final Sub sub = new Sub();
        System.err.println("Finished.");
    }

    private static class Base {
        public Base() {
            System.err.println("In Base ctor");
        }
    }

    private static class Sub extends Base {
        public Sub() {
            System.err.println("In Sub ctor");
        }
    }
}

如果要显式调用超类的构造函数,则需要执行以下操作:

public class Ctor2Test {
    public static void main(String[] args) {
        final Sub sub = new Sub();
        System.err.println("Finished.");
    }

    private static class Base {
        public Base() {
            System.err.println("In Base ctor");
        }

        public Base(final String toPrint) {
            System.err.println("In Base ctor.  To Print: " + toPrint);
        }
    }

    private static class Sub extends Base {
        public Sub() {
            super("Hello World!");
            System.err.println("In Sub ctor");
        }
    }
}

唯一需要注意的是 super() 调用必须作为构造函数的第一行,否则编译器会生你的气。

于 2010-02-23T16:35:19.323 回答
4

阅读super 关键字(向下滚动子类构造函数)。如果我理解您的问题,您可能想调用超类构造函数?

值得注意的是,如果您没有显式调用超类构造函数,Java 编译器将自动对超类进行无参数构造函数调用。

于 2010-02-23T16:26:34.427 回答
1

说如果你有

/**
 * 
 */
public KKSSocket(final KKSApp app, final String name) {
    this.app = app;
    this.name = name;
    ...
}

那么扩展 KKSSocket 的名为 KKSUDPSocket 的子类可以具有:

/**
 * @param app
 * @param path
 * @param remoteAddr
 */
public KKSUDPSocket(KKSApp app, String path, KKSAddress remoteAddr) {
    super(app, path, remoteAddr);
}

/**
 * @param app
 * @param path
 */
public KKSUDPSocket(KKSApp app, String path) {
    super(app, path);
}

您只需将参数传递到构造函数链上,就像对超类的方法调用一样,但是使用 super(...) 引用超类构造函数并传入给定的参数。

于 2010-02-23T16:31:49.277 回答
1

您继承类属性,而不是类构造函数。这就是它的方式:

如果在超类中没有添加构造函数,如果没有,则编译器添加一个无参数构造函数。每当创建子类的新实例时,都会隐式调用此默认构造函数。这里的子类可能有也可能没有构造函数,一切正常。

如果在超类中提供了构造函数,编译器将查看它是无参数构造函数还是带参数的构造函数。

如果没有参数,那么编译器将为任何子类实例化调用它。这里的子类可能有也可能没有构造函数,一切都很好。

如果父类中的 1 个或多个构造函数具有参数并且不存在 args 构造函数,则子类必须具有至少 1 个构造函数,其中通过 super (parent_contractor params) 对父类构造进行隐式调用。

这样你就可以确定继承的类属性总是被实例化的。

于 2015-12-21T23:32:45.520 回答