super在java中的用法

super在java中的用法
最新回答
乱世浮尘

2021-01-15 02:51:27

super是Java中用于访问超类成员的关键词,主要用于在子类中引用或调用超类的成员(方法、变量或构造函数)。以下是其核心用法和注意事项:

1. super的三种主要用法(1) 调用超类方法
  • 语法:super.method_name(arguments)
  • 用途:在子类中调用被覆盖的超类方法。
  • 示例:class SuperClass { void show() { System.out.println("SuperClass show"); }}class SubClass extends SuperClass { @Override void show() { super.show(); // 先调用超类的show() System.out.println("SubClass show"); }}
(2) 访问超类变量
  • 语法:super.variable_name
  • 用途:当子类与超类存在同名变量时,通过super明确访问超类的变量。
  • 示例:class SuperClass { int value = 10;}class SubClass extends SuperClass { int value = 20; void printValues() { System.out.println(super.value); // 输出超类的value(10) System.out.println(this.value); // 输出子类的value(20) }}
(3) 调用超类构造函数
  • 语法:super(arguments)
  • 用途:在子类构造函数中初始化超类的状态,必须放在子类构造函数的第一行。
  • 示例:class SuperClass { SuperClass(int x) { System.out.println("SuperClass init: " + x); }}class SubClass extends SuperClass { SubClass() { super(100); // 调用超类带参数的构造函数 }}
2. 使用super的注意事项
  • 作用域限制

    super只能在子类的方法或构造函数中使用,不能在静态上下文(如静态方法)中使用。

    不能用于访问父接口的成员(接口成员默认是public,无需super)。

  • 访问权限

    无法通过super访问超类的私有成员(private成员对子类不可见)。

  • 编译错误场景

    若超类没有无参构造函数,且子类未显式调用super(arguments),会导致编译错误。

    调用不存在的超类方法或变量(如拼写错误)会引发编译错误。

3. 实际应用场景(1) 方法覆盖与扩展

子类覆盖超类方法时,可通过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是子类与超类交互的桥梁,用于明确调用超类的成员或构造函数。
  • 关键区别

    super()调用构造函数,this()调用同类其他构造函数。

    super访问超类成员,this访问当前对象成员。

  • 最佳实践:在覆盖方法时优先使用super复用逻辑,避免重复代码;在构造函数中合理使用super确保对象初始化顺序正确。

通过合理使用super,可以提升代码的可维护性和可读性,同时避免因成员遮蔽或初始化顺序导致的潜在问题。