【发布时间】:2016-04-19 00:33:58
【问题描述】:
为什么 Java 编译器 (javac) 有时很愚蠢,当然我知道 Java 编译器只是一个程序,但有时被设计为愚蠢(有时不是),我也是 Java 的粉丝 :)
class Child extends Base {
Child() {
int i = 5; // any statement here.
super(i);
}
}
class Base{
Base(int i) {
}
}
这里的编译器,声称第一个语句应该是对继承类的构造函数的调用,但是如果我们将第一个语句包装在一个静态方法中,它就可以正常工作!!!!!!
class Child extends Base {
Child() {
super(foo()); // works fine!!!!
}
static int foo(){
return 5;
}
}
这很好用!!!!!!!,另一个杀手级的例子:
Child() {
try{
super(5);
}catch(Exception e){}
}
try catch 是语言特性!!!
我知道编译器强制我们调用超类型构造函数,因为它应该在self对象之前初始化继承的对象(一般Java继承是通过对象链接释放的),但我认为编译器应该有点聪明,它应该让我们在调用它的超级构造函数之前不接触对象时操作代码,这样必须工作:
Child() {
int i = 5; // this MUST BE acceptable since we didn't touch
// any current object or inherited field or we didn't
// call any method on it.
super(i);
}
但这不应该工作:
class Child extends Base {
private int i;
Child() {
i = 6; // this shouldn't work (its clear why).
super();
}
}
我只是想了解为什么没有实现这一点,尤其是当我看到 Java 可以捕获无法访问的代码(一个智能功能)时???,所以 20 多年来,Java 没有提供这样的 BASIC 功能,因为通常这有时会使代码更丑陋,有时我们必须制作愚蠢的静态方法来避免这种情况,其他时候,我们只需调用超级构造函数(javac 闭嘴)然后我们重新初始化继承的字段!!!!!!!!!
虽然,我不认为,这是 JVM 和字节码的问题,我认为这只能在 javac 中实现 :)
我真的很喜欢Java,但是这个让我很生气,我忘记在下一个版本(Java 9)中推荐这个,我希望它会包含在Java 10中,我们再等3年,总比没有好完全没有:'(
【问题讨论】:
-
我们不要把 Java 编译器称为愚蠢 :)
-
好吧,我没说它愚蠢 ;),它很聪明,但我说 Java 编译器愚蠢,这并不意味着 Java 编译器完全愚蠢 ;)
-
这是一个问题还是一个咆哮?
-
@Laurel 一个问题,因为我想了解原因,只是因为 Java 设计者懒于实现它,或者因为还有另一件事,我不知道 :)
标签: java constructor javac super