java中super关键字的用法

java中super关键字的用法
最新回答
落花缤纷下

2022-10-17 19:41:17

super 关键字是 Java 中用于在子类中访问父类成员(变量、方法或构造函数)的特殊引用。其核心用途和注意事项如下:

1. 主要用途(1) 访问父类成员变量
  • 当子类与父类存在同名变量时,使用 super.变量名 明确指定访问父类的变量。
  • 示例:class Parent { int value = 10;}class Child extends Parent { int value = 20; void printValues() { System.out.println(super.value); // 输出父类的 value (10) System.out.println(this.value); // 输出子类的 value (20) }}
(2) 调用父类方法
  • 在子类中覆盖父类方法后,仍需调用父类原始逻辑时使用 super.方法名()。
  • 示例:class Parent { void show() { System.out.println("Parent's show()"); }}class Child extends Parent { @Override void show() { super.show(); // 先调用父类的 show() System.out.println("Child's show()"); }}
(3) 调用父类构造函数
  • 子类构造函数必须通过 super() 调用父类构造函数(显式或隐式),且必须放在第一行
  • 示例:class Parent { Parent(String name) { System.out.println("Parent constructor: " + name); }}class Child extends Parent { Child() { super("Default"); // 显式调用父类有参构造 } Child(int age) { this(); // 调用本类无参构造(内部会调用 super("Default")) }}
2. 使用注意事项
  • 作用域限制:super 仅能在子类的实例方法、构造方法或实例代码块中使用,静态上下文(如静态方法)中无效。

  • 构造函数调用规则:若子类构造未显式调用 super(),编译器会自动插入 super()(调用父类无参构造)。若父类无无参构造,则必须显式指定参数。

  • 访问层级限制:super 只能直接访问父类的成员,无法跳过父类访问更高祖先类的成员(如祖父类)。

  • 与 this 的区别:this 指向当前对象,而 super 强制指向父类部分,二者可结合使用(如 super.method() 调用父类方法后,再用 this 操作子类数据)。

3. 常见错误场景
  • 错误示例:在静态方法中使用 super

    class Child extends Parent { static void test() { super.value; // 编译错误!静态上下文不能使用 super }}
  • 错误示例:super() 未放在构造方法第一行

    class Child extends Parent { Child() { System.out.println("Child init"); super(); // 编译错误!super() 必须在第一行 }}
总结

super 是 Java 继承机制中实现子类与父类交互的关键字,主要用于解决命名冲突、复用父类逻辑及初始化继承关系。正确使用 super 能提升代码可读性和可维护性,但需严格遵守其语法和作用域规则。