调用super()
构造函数应该是构造函数的第一行吗?如果是,那为什么?为什么在构造函数调用之前不能做一些简单的有限计算,比如构造函数参数计算?
我发现内部类构造函数的情况可以用闭包规范调用:
class A {
class Inner1 {
Inner1() {
// do something
}
}
}
class B {
A a1 = new A();
A a2 = new A();
class Inner2 extends A.Inner1 {
Inner2(boolean sel) {
(sel?a1:a2).super();
}
}
}
这个案例表明我们可以为基类构造函数选择封闭实例。为什么选择逻辑应该如此有限?为什么一个人不能写这样的东西
if( sel ) {
a1.super();
}
else {
a2.super();
}
添加
通过我的问题,我的意思是限制可能类似于以下情况:
public class Base {
private final String content;
public Base(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
public class Derived extends Base {
public Derived(String content) {
super(String.format("Current value of content is %s.", getContent()));
}
}
在后一种情况下,我:
1) 满足super()
排在第一线的要求
2)违反施工顺序
3) 获得编译器错误“在显式调用构造函数时无法引用实例方法”
那么,为什么我们不能取消“第一线要求”而只依赖最后一个错误呢?