问题背景:
在 Java 的早期版本中,建立了一个允许子类扩展父类行为的继承机制。使用关键字 super 来访问父类的成员,这是从 C++ 继承来的。
问题:
有时需要明确调用父类的方法或字段,尤其是在它们被重写或隐藏的情况下。如果不正确使用 super,可能会导致错误或不正确的行为,例如在处理构造函数时。
解决方案:
通过 super 可以:
示例:
class Animal { void makeSound() { System.out.println("Animal sound"); } } class Dog extends Animal { void makeSound() { super.makeSound(); // Animal sound System.out.println("Bark"); } }
关键特点:
调用 super 可以不是构造函数的第一行吗?
不可以。通过 super() 调用父类构造函数必须是构造函数的第一行。如果违反此限制,编译器将报错。
可以在静态方法或上下文中使用 super 吗?
不可以。关键字 super 只适用在非静态(实例)上下文中,因为它与对象的层次结构相关,而不是类的层次结构。
通过 super 可以访问父类的私有方法吗?
不可以。私有方法对子类不可见——即使通过 super。只有 public、protected 和 package-private 方法或字段可以通过 super 访问。
开发人员忘记在派生类的构造函数中显式调用 super(),而超类没有默认构造函数。
优点:
缺点:
在子类中重写的方法首先调用 super 实现,然后扩展额外的逻辑。
优点:
缺点: