Миш*_*лев 24 java oop constructor super
如果我有课:
class A {
public A() { }
}
Run Code Online (Sandbox Code Playgroud)
和另一个
class B extends A {
public B() { }
}
Run Code Online (Sandbox Code Playgroud)
有没有办法B.B()
不打电话A.A()
?
pol*_*nts 28
在Java中绝对没有办法做到这一点; 它会破坏语言规范.
在作为结果返回对新创建的对象的引用之前,处理指示的构造函数以使用以下过程初始化新对象:
- 为构造函数[...]分配参数
- 如果这个构造函数以同一个类(using
this
)中另一个构造函数的显式构造函数调用开头,那么[...]- 此构造函数不以同一类(使用
this
)中另一个构造函数的显式构造函数调用开头.如果此构造函数用于除以外的类Object
,则此构造函数将以超类构造函数的显式或隐式调用开始(使用super
).- 为此类执行实例初始值设定项和实例变量初始值设定项[...]
- 执行此构造函数的其余部分[...]
Ada*_*ski 20
您可以实现的最接近期望的行为是将通常在构造函数中执行的初始化委托给模板方法,然后在子类实现中覆盖该模板方法.例如:
public class A {
protected Writer writer;
public A() {
init();
}
protected void init() {
writer = new FileWriter(new File("foo.txt"));
}
}
public class B extends A {
protected void init() {
writer = new PaperbackWriter();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,正如其他人所说,这通常表明您的设计存在问题,我通常更喜欢这种情况下的组合方法 ; 例如,在上面的代码中,您可以定义构造函数以接受Writer
实现作为参数.
如果您不想调用超类构造函数,则对象模型还有其他问题.