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

Java 如何将构造函数从超类继承到子类,java,inheritance,constructor,superclass,Java,Inheritance,Constructor,Superclass,如何将构造函数从超类继承到子类?构造函数不是继承的,必须在子类中创建一个新的、相同原型的构造函数,该构造函数映射到超类中与其匹配的构造函数 下面是一个如何工作的示例: class Foo { Foo(String str) { } } class Bar extends Foo { Bar(String str) { // Here I am explicitly calling the superclass // constructor -

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

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

下面是一个如何工作的示例:

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);
    }
}
阅读(向下滚动子类构造函数)。如果我理解你的问题,你可能想调用一个超类构造函数

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

如果您有

/**
 * 
 */
public KKSSocket(final KKSApp app, final String name) {
    this.app = app;
    this.name = name;
    ...
}
然后,名为KKSUDSocket的子类扩展KKSSocket可能具有:

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

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

默认构造函数——没有参数(声明或暗示)的公共构造函数——默认情况下是继承的。您可以尝试以下代码以获取此示例:

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()调用必须作为构造函数的第一行,否则编译器会对您发火。

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

您继承类属性,而不是类构造函数。它是这样运行的:

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

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


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

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


通过这种方式,您可以确保继承的类属性始终是实例化的。

即使作为非n00b Java程序员,我也不清楚这一点。你能澄清一下吗?@bear会吃掉你:如果父类有这样一个构造函数:
public class(String arg1){/*implementation here/*}
,那么子类需要这样一个构造函数:
public Subclass(String arg1){super(arg1);}
,这听起来像是一种奇特的说法“在子类的构造函数中使用
super
。”我不知道Java中的构造函数原型是什么。我相信通过“构造函数原型”,Andrew指的是构造函数签名。但是,答案不一定是真的(或者至少不是很清楚)--您不必声明具有相同签名的构造函数,也没有太多意义,因为客户端代码无论如何都必须引用新的子类。如果要调用基础构造函数,用户只需调用super(/*parameter list*/),为其提供参数所需的任何值。(这就是我试图用下面的答案表达的观点,至少…)如何在Eclipse中自动执行此操作?当您创建新类时,Eclipse可以自动为您编写超级构造函数定义。但是,在您创建了该类并忘记选中复选框以通知Eclipse执行此操作之后,该怎么办呢?有什么方法吗?是的……或者您可以调用超类构造函数的任意变体o使用(正如@GoodManish所说,它可能没有参数,或者可能有更多参数)。在某些情况下,
super()构造函数存在于超类中,并且未在子类中显式定义,如果子类也没有任何显式定义的重载构造函数(即带参数的构造函数),则编译器将自动向子类中插入一个只包含
super()的公共无参数构造函数
。这将调用超类的默认构造函数。“编译器将为任何子类实例调用它”-上面的要点似乎是,如果子类具有无参数构造函数,则必须显式调用super()。
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");
        }
    }
}