2021-01-15 02:51:27
super是Java中用于访问超类成员的关键词,主要用于在子类中引用或调用超类的成员(方法、变量或构造函数)。以下是其核心用法和注意事项:
1. super的三种主要用法(1) 调用超类方法super只能在子类的方法或构造函数中使用,不能在静态上下文(如静态方法)中使用。
不能用于访问父接口的成员(接口成员默认是public,无需super)。
无法通过super访问超类的私有成员(private成员对子类不可见)。
若超类没有无参构造函数,且子类未显式调用super(arguments),会导致编译错误。
调用不存在的超类方法或变量(如拼写错误)会引发编译错误。
子类覆盖超类方法时,可通过super复用超类逻辑:
class Animal { void eat() { System.out.println("Animal eats"); }}class Dog extends Animal { @Override void eat() { super.eat(); // 先执行超类的eat() System.out.println("Dog eats bone"); // 再扩展子类逻辑 }}(2) 解决变量遮蔽问题当子类与超类变量同名时,super可明确指定访问超类变量:
class Parent { String name = "Parent";}class Child extends Parent { String name = "Child"; void printNames() { System.out.println(super.name); // 输出"Parent" System.out.println(this.name); // 输出"Child" }}(3) 构造函数链式调用确保超类状态在子类初始化前完成:
class Vehicle { Vehicle(String type) { System.out.println("Vehicle type: " + type); }}class Car extends Vehicle { Car() { super("SUV"); // 必须放在第一行 System.out.println("Car initialized"); }}4. 总结super()调用构造函数,this()调用同类其他构造函数。
super访问超类成员,this访问当前对象成员。
通过合理使用super,可以提升代码的可维护性和可读性,同时避免因成员遮蔽或初始化顺序导致的潜在问题。