【发布时间】:2012-05-23 20:48:12
【问题描述】:
调用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) 获得编译器错误“无法在显式调用构造函数时引用实例方法”
那么,为什么我们不能废除“第一线要求”而只依赖最后一个错误呢?
【问题讨论】:
-
super()如果您使用它,则必须作为构造函数调用的第一行 - 但请检查此线程:stackoverflow.com/questions/9675431/… 或此:stackoverflow.com/questions/1168345/… -
谢谢!变通方法很有趣,但也很有趣,为什么要制作 Java,即如果我在调用 super 之前做某事有什么不好?例如,我可能只需要在调用 super 之前不访问实例成员。
-
@SuzanCioc 如果您在致电
super()之前做了一些事情。 Java 会停止你的程序并告诉你修复它。 -
@Suzan Cioc,birryree 提供的第二个链接涵盖了该问题
-
@Suzan 有一些语言(python)允许稍后或根本不调用超类的构造函数。这显然会产生不好的后果,但是我们都知道首先调用
super()并不能解决所有问题,并且会产生大量新问题。不过这是一种简化,因为这意味着我们不必将对象分配和初始化分成两个独立的部分。而且我认为它避免了一种会经常出现的问题。
标签: java constructor closures inner-classes superclass