[英]how to inherit Constructor from super class to sub class
如何将构造函数从超类继承到子类?
构造函数不是继承的,您必须在子类中创建一个新的,相同原型的构造函数,该构造函数映射到超类中的匹配构造函数。
以下是一个如何工作的示例:
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);
}
}
超类构造函数不能在扩展类中继承。 虽然它可以在扩展类构造函数中使用super()作为第一个语句来调用。
默认构造函数 - 具有out参数(声明或隐含)的公共构造函数 - 默认继承。 您可以尝试以下代码作为示例:
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关键字的信息 (向下滚动子类构造函数)。 如果我理解你的问题,你可能想调用一个超类构造函数?
值得注意的是,如果您没有显式调用超类构造函数,Java编译器将自动对超类进行无参数构造函数调用。
如果你有,请说
/**
*
*/
public KKSSocket(final KKSApp app, final String name) {
this.app = app;
this.name = name;
...
}
然后一个名为KKSUDPSocket的子类扩展KKSSocket可以:
/**
* @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(...)并传入给定的args。
你继承了类属性,而不是类构造函数。这就是它的方式:
如果超类中没有添加构造函数,如果没有,则编译器添加无参数构造函数。 每当创建子类的新实例时,都会隐式调用此默认构造函数。 这里的子类可能有也可能没有构造函数,一切正常。
如果超类中提供了构造函数,编译器将查看它是否为arg构造函数或带参数的构造函数。
如果没有args,则编译器将为任何子类instanciation调用它。 这里的子类可能有也可能没有构造函数,一切正常。
如果父类中的一个或多个构造函数具有参数且没有args构造函数不存在,那么子类必须至少有一个构造函数,其中通过super(parent_contractor params)对父类构造进行隐式调用。
这样,您可以确保继承的类属性始终是instanciated。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.