public class class1 {
public void xxx(){
super.getXXX();
super().getXXX();
}
}
答案 0 :(得分:5)
java中的每个类都有一个超类。当您使用super
关键字时,您指的是超类,super
上的点运算符将允许您访问超类的属性和方法。
super()
是超类的构造函数。当您覆盖子类中的构造函数时,必须先调用super()
才能执行自己的逻辑,如果不这样做,编译器代表您将插入对no-args构造函数的调用。 (有时,没有一个,代码在编译时失败)
在Java中,调用构造函数会给你一个类的实例,当你执行super()
时,它不是同一个东西,因为没有单独的超类实例在创建时你做super()
。因此,虽然MyClass().doSomething()
是完全有效的通话,但super().doSomethingElse()
不是。
答案 1 :(得分:5)
两者都在子类中用作调用或引用其超类的方法。
super()
是在构造函数内或在重写方法内调用超类的构造函数或超类的重写方法的方法调用。在这些情况下,super()调用也可以使用参数。
请注意,由于默认情况下所有类都至少从Object继承,因此您始终可以在构造函数中调用super()(但它必须是构造函数中的第一个语句)。实际上,默认情况下,这个super()调用通常由编译器插入到你的no-arg构造函数中。
然而,如果超类没有no-arg构造函数,这可能会变得棘手,在这种情况下,对super()的调用将在没有相应args的情况下失败。默认情况下,通常会生成一个no-arg构造函数,因此您不必担心它,但如果您使用args明确定义另一个构造函数,则不会自动生成它,因此当您需要显式定义时一个人自己。
另一方面,没有parens的 super
只是对超类本身的引用,就像任何其他变量一样。它可用于调用该类中的任何可访问方法,或引用任何类的可访问字段,就像使用任何其他引用一样。例如:super.doSomething()
或super.x