对于初学者来说,规则很简单。 孩子可以在父母之前存在吗?否。 这就是为什么我们在创建子类时总是调用super()
。这样,超类的每个成员都会“复制”到子类。
所以我举个例子:
class Duck extends Animal {
int size;
public Duck(int size) {
super();
this.size = size;
}
}
我的问题是为什么我们不能用Animal()
而不是super()
来调用Animal构造函数。或者,为什么我们不能这样做:
class Duck extends Animal {
int size;
public Duck(int size) {
Animal();
this.size = size;
}
}
两个代码都不能编译吗?我的意思是说,它们之间在技术上没有区别,编译器几乎可以知道关键字 extends 的Duck
IS-A Animal
。那是什么问题呢?
答案 0 :(得分:2)
为什么必须使用super()而不是其类名来调用超类构造函数?
简单。因为这就是Java语法的设计方式。
假设,他们可以设计Java语法,以便您也可以 1 使用超类的名称而不是super
。但是他们没有。故事的结尾,真的。 (设计决定是在1995年之前做出的,现在更改它们为时已晚。)
为便于记录,在JLS 8.8.7.1中指定了相关语法,语法产生为ExplicitConstructorInvocation
。
1-我们不知道为什么他们选择super
而不是其他可能性的细节。很久以前,会议是私人的。但是,作为一般规则,在编程语言中提供两种表达同一事物的方式并没有实现任何实际意义。实际上,它可能只会使该语言更加难以阅读和学习。
答案 1 :(得分:1)
一种好的编程语言是一种使作者能够表达自己意图的语言,其中包含尽可能少的语法变体。变化越多,程序员必须掌握的规则越多,而支持所有这些变化的编译器必须越复杂。
假设我避开Java命名约定,并在静态方法的名称中使用大写字母:
class Duck extends Animal {
int size;
public Duck(int size) {
Animal(); //super or static method?
this.size = size;
}
private static void Animal() {
System.out.println("I'm a static method");
}
}
Duck构造函数是调用Animal构造函数还是静态方法?我们可以引入一个涵盖这种情况的新规则,但是它将引入更多的复杂性。
您所建议的是实现完全相同的事情的两种方法。没有理由支持super
独自完美地实现该目的。
为什么他们也不允许我们使用parent()
或superconstructor()
或superclass()
? you 的责任在于提供令人信服的理由,说明为什么应该得到支持。
答案 2 :(得分:1)
这就是为什么我们在创建子类时总是调用super()。
我认为答案在于问题: 因为您正在创建子类。
我的问题是为什么我们不能用Animal()而不是super()来调用Animal构造函数。
在子类中,您无权访问“ Animal()”构造函数。
如果您想了解有关困境的更多信息:https://www.w3schools.com/java/java_inheritance.asp