如何从父类继承构造函数到子类?
构造函数不会被继承,你必须在子类中创建一个新的、参数类型相同的构造函数,并将其映射到超类中与之匹配的构造函数。
以下是演示如何操作的示例:
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()作为第一条语句来调用它。
super();
。 - hotshot309默认构造函数是公共的,没有参数(无论声明还是隐含)。默认情况下会被继承。你可以尝试以下代码作为示例:
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();
。这会调用超类的默认构造函数。 - hotshot309阅读关于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(parent_contractor params)进行对父类构造函数的隐式调用。
这样可以确保继承的类属性始终被实例化。
public Class(String arg1) { /* 在此实现 */ }
,那么子类需要这样一个构造函数:public Subclass(String arg1) { super(arg1); }
。 - Powerlordsuper
”。我不知道Java中构造函数原型是什么。 - Matt Ball