Java 中的 super 关键字

2025年3月23日 | 阅读 7 分钟

Java 中的 super 关键字是一个引用变量,用于引用直接父类对象。

每当你创建子类实例时,父类的实例都会被隐式创建,并通过 super 引用变量进行引用。

super 关键字的优点

以下是使用 Java 中的 super 关键字的优点:

  1. 简化构造函数链: super() 调用确保父类构造函数在子类构造函数之前执行,从而在继承层次结构中保持正确的初始化。
  2. 访问被覆盖的方法: 即使子类覆盖了父类的方法,它也允许子类调用父类的方法。这对于在不完全覆盖的情况下扩展功能很有用。
  3. 访问隐藏的字段: 它提供了对子类字段可能隐藏的父类字段的访问,这些字段的名称与子类字段相同。
  4. 代码重用: 通过调用父类的方法或构造函数,它促进了代码的重用并减少了冗余。
  5. 维护层次关系: 它保持并利用继承的层次结构,使代码更易于组织和管理。

Java super 关键字的用法

  1. super 可用于引用直接父类的实例变量。
  2. super 可用于调用直接父类的方法。
  3. super() 可用于调用直接父类的构造函数。

1) super 用于引用直接父类的实例变量。

我们可以使用 super 关键字来访问父类的数据成员或字段。如果父类和子类具有相同的字段,则使用它。

文件名: Main.java

示例

编译并运行

输出

black
white

在上面的示例中,Animal 和 Dog 类都有一个共同的属性 color。如果我们打印 color 属性,默认情况下它会打印当前类的颜色。要访问父类属性,我们需要使用 super 关键字。

2) super 可用于调用父类方法

super 关键字也可用于调用父类的方法。如果子类包含与父类相同的方法,则应使用它。换句话说,当一个方法被覆盖时,它就会被使用。

文件名: Main.java

示例

编译并运行

输出

eating...
barking...

在上面的示例中,Animal 和 Dog 类都有 eat() 方法。如果我们在 Dog 类中调用 eat() 方法,默认情况下它会调用 Dog 类的 eat() 方法,因为局部方法具有优先权。

要调用父类方法,我们需要使用 super 关键字。

3) super 用于调用父类的构造函数

super 关键字也可用于调用父类的构造函数。让我们看一个简单的例子

文件名: Main.java

示例

编译并运行

输出

animal is created
dog is created

注意:如果构造函数中没有 super() 或 this(),编译器会自动在每个类构造函数中添加 super()。

正如我们所知,如果不存在构造函数,编译器会自动提供默认构造函数。但是,它还将 super() 作为第一个语句添加。

super 关键字的另一个示例是编译器隐式提供 super()。

文件名: Main.java

示例

编译并运行

输出

animal is created
dog is created

Super 关键字的实际应用

让我们看看 super 关键字的实际应用。这里,Emp 类继承了 Person 类,因此 Person 的所有属性都将默认被 Emp 继承。为了初始化所有属性,我们从子类中使用父类构造函数。通过这种方式,我们正在重用父类构造函数。

文件名: Main.java

示例

编译并运行

输出

1 ankit 45000

Super 关键字的特点

  • 调用父类构造函数

当我们创建一个子类对象时,Java 会自动调用父类的构造函数。如果我们想显式调用父类构造函数,我们可以使用 super()。这通常是为了确保在子类开始初始化之前,父类已正确初始化。

  • 调用父类方法

如果父类中的某个方法在子类中被覆盖,子类仍然可以使用 super.methodName() 调用父类版本的该方法。当子类想要扩展或为方法添加额外功能,但仍需要使用父类的原始功能时,这很有用。

  • 访问父类字段

如果父类和子类都有同名的变量(字段),super 允许子类访问父类版本的字段。这有助于避免两个变量之间的混淆,并清楚地表明我们引用的是父类中的变量。

  • 构造函数中的第一条语句

当使用 super() 调用父类构造函数时,它必须是子类构造函数中的第一条语句。它确保在子类开始自己的初始化之前,父类已得到初始化。

  • 不能在静态上下文中使用

super 关键字不能在静态方法或静态变量中使用。这是因为静态方法和变量属于类本身,而不是特定的对象。由于 super 指的是对象的父类,因此不允许在静态上下文中使用它。

  • 不总是必需的

如果父类的方法在子类中没有被覆盖,我们就不需要使用 super 来调用父类的方法。当调用方法时,子类会自动调用父类的方法。


Super 关键字选择题

1. 下列哪项是使用 super 关键字调用超类构造函数的正确方法?

  1. super();
  2. super.class();
  3. superclass();
  4. super.constructor();
 

答案:A)

解释: super() 调用用于调用超类构造函数。


2. 何时应使用 super 关键字调用超类方法?

  1. 在子类中覆盖方法时
  2. 在子类中定义新方法时
  3. 创建超类实例时
  4. 定义静态方法时
 

答案:A)

解释: super 关键字用于在子类中覆盖超类方法时调用它,以扩展或修改其行为。


3. 在哪种情况下使用 super 关键字来访问超类变量?

  1. 当超类变量名被子类变量遮蔽时
  2. 当超类变量是私有的
  3. 当子类无权访问超类变量时
  4. 初始化静态变量时
 

答案:A)

解释: super 用于访问被同名子类变量遮蔽的超类变量。


4. 子类构造函数中 super 关键字的主要目的是什么?

  1. 确保超类得到正确初始化
  2. 调用子类构造函数
  3. 在子类中定义新方法
  4. 覆盖超类方法
 

答案:A)

解释: 子类构造函数中 super 关键字的主要目的是确保在执行子类构造函数之前,超类得到正确初始化。


5. 关于 super 关键字,下列哪项陈述是正确的?

  1. 它只能在静态方法中使用
  2. 可用于访问超类的私有成员
  3. 它用于引用直接父类对象
  4. 可用于在子类中定义新变量
 

答案:C)

解释: super 关键字用于引用直接父类对象,从而允许访问其方法和变量。