Java 中 this 和 super 的区别

4 Aug 2025 | 7 分钟阅读

在 Java 中,“super”和“this”关键字对于与类和对象进行交互至关重要。除了引用类成员之外,它们还有助于管理继承。Java 还提供了 this() 和 super() 构造函数,它们在构造函数的上下文中被使用。

this 关键字和 this() 构造函数

this 关键字

它是 Java 中的一个保留关键字,用于引用类的当前实例。它是一个引用变量,通过该变量调用方法。此关键字的其他用法包括:

  • 它引用当前类的实例变量。
  • 它(隐式地)调用当前类的方法。
  • 我们可以将其作为参数传递给方法和构造函数调用。
  • 它从方法中返回当前类的实例。

this() 构造函数

在 Java 中,this() 是一个特殊的构造函数调用,在同一类中的另一个构造函数中使用,用于调用另一个构造函数。它有助于构造函数链,使我们能够重用初始化逻辑并减少冗余。

  • 它必须是构造函数中的第一条语句。
  • 它只能在构造函数中使用,不能在方法中使用。
  • 它有助于从一个重载构造函数调用另一个。

示例:this 关键字和 this() 构造函数的用法

示例

编译并运行

输出

We are inside the parameterized constructor.
The value of y = 10
We are inside the default constructor.
The value of x = 5
Inside Main

this 关键字的用法

  • 关于实例变量:区分具有相同名称的局部变量和实例变量是有益的。
  • 调用另一个构造函数:我们可以使用 this() 关键字在同一类中的一个构造函数中调用另一个构造函数。
  • 调用当前类的方法:能够调用同一类的方法而不显式创建对象,这被称为“调用当前类的方法”。
  • 返回当前对象:它允许我们从方法中获取类的当前实例。
  • 将当前对象作为参数提供:它有助于将当前对象作为参数传递给另一个构造函数或方法。

super 关键字和 super() 构造函数

super 关键字

用于调用基类方法或变量的保留关键字称为 super 关键字。我们不能将 super 关键字用作标识符。super 关键字不仅用于引用基类实例,还用于引用静态成员。

注意:super 关键字不能直接用于访问静态方法或变量。静态上下文有不同的处理方式。

super() 构造函数

super() 是在子类构造函数中用于调用其超类的构造函数的特殊调用。它确保在子类添加自己的功能之前超类得到正确初始化。始终是子类构造函数中的第一条语句——Java 不允许在其他任何地方。

注意:如果我们没有显式编写 super() 构造函数,JVM 会自动插入对超类无参数构造函数的调用,除非我们使用带参数的特定构造函数。

  • 如果超类没有无参数构造函数,我们必须使用带参数的 super()。
  • 我们不能在同一个构造函数中使用 this() 和 super()——它们都必须是第一条语句。

示例:super 关键字和 super() 构造函数的用法

示例

编译并运行

输出

The cat is of color white
The cat is of color Brown
The eyes of the cat are blue.
Inside Main

解释

在上面的示例中,我们定义了 Animal、Cat 和 Main 类。Cat 类继承自 Animal 类,Main 类继承自 Cat 类。在 Main 类中,我们定义了 Main 类构造函数 as Main()。在构造函数中,我们调用了 super() 类构造函数,它调用其父类 Cat 的构造函数。

当第二条语句执行时,程序的流程跳转到 Animal 类以访问其数据成员的值。访问后,流程返回到 Cat 类构造函数并打印结果。之后,最后一条语句执行并打印当前类的变量值。

执行完 Cat 类中的最后一条语句后,流程返回到 Main 类的构造函数并执行剩余的语句。

完成 Main 方法的执行后,流程返回到 main() 方法并执行剩余的语句。

注意:为了使用 super(),我们必须确保它是类构造函数中的第一条语句。我们可以使用它仅引用父类构造函数。

super 关键字的用法

  • 访问父类变量:当子类包含与父类同名的变量时,super 有助于访问父类的变量。
  • 调用父类方法:当子类覆盖了其父类的一个方法时,super 允许调用父类的该方法版本。
  • 调用父类构造函数:从子类构造函数中,可以使用 super() 调用父类构造函数。
  • 区分父类和子类的成员:当父类和子类的成员名称相同时,这样做很有益。
  • 增强代码可重用性:通过使用 super,我们可以重用父类的功能,而不是在子类中复制代码。

this 和 super 关键字的区别

下表描述了 this 和 super 之间的关键区别

thissuper
this 关键字代表类的当前实例。它代表父类的当前实例。
为了调用当前类的默认构造函数,我们可以使用 this 关键字。为了调用父类的默认构造函数,我们可以使用 super 关键字。
它可以从静态上下文引用。这意味着它可以从静态上下文中调用。它不能从静态上下文引用。这意味着它不能从静态上下文中调用。
我们可以使用它来访问当前类的成员变量和成员函数。我们可以使用它来访问父类或超类的成员变量和成员函数。
它解决了范围模糊问题。访问被覆盖的成员或调用超类构造函数。

this() 和 super() 构造函数之间的区别

this() 构造函数super() 构造函数
它调用当前类的构造函数。super() 构造函数引用直接父类的构造函数。
它用于调用当前类的构造函数。它用于调用父类的方法。
它可以在参数化构造函数中的任何位置使用。它始终是子类构造函数中的第一行。
它可以作为参数传递给构造函数调用。它返回时不带参数。
它用于从方法中返回当前类的实例。它可以与实例成员一起使用。

Java this 和 super 选择题

1. 在 Java 中,this 关键字引用_______?

  1. 超类的对象
  2. 当前对象
  3. 静态引用
  4. 全局变量
 

答案 2)

解释:它是 Java 中的一个保留关键字,用于引用当前类的对象。它是一个引用变量,通过该变量调用方法。


2. 从以下陈述中,选择关于 this() 构造函数调用的正确陈述。

  1. 它可以用来调用超类构造函数
  2. 它可以在构造函数中的任何位置使用
  3. 它必须是构造函数中的第一条语句
  4. 它用于退出构造函数
 

答案 3)

解释:关于 this() 构造函数调用的正确陈述是,它用于调用同一类中的另一个构造函数。它必须是使用它的构造函数中的第一行。


3. 在 Java 中,super 关键字引用_______?

  1. 基接口
  2. 当前对象
  3. 当前对象的超类
  4. 静态方法
 

答案 3)

解释:在 Java 中,super 关键字引用当前对象的超类。


4. 以下哪项不是 this 关键字的有效用法?

  1. 调用当前类的方法。
  2. 调用当前类的构造函数。
  3. 将自身作为参数传递给另一个方法。
  4. 引用当前类的实例变量。
 

答案 4)

解释:在 Java 中,引用当前类的实例变量是 this 关键字的一个有效用法。


5. 在子类构造函数中,哪个关键字用于调用超类构造函数?

  1. super
  2. this
  3. 两者
  4. 以上都不是
 

答案 1)

解释:super 关键字用于在子类构造函数中调用超类构造函数。这确保了子类构造函数能够正确地初始化从超类继承的成员。


下一主题Java-copy-array