super 关键字用于不同的情况。在开始这篇文章之前,我们鼓励你学习 Java 中的继承,这样理解会更透彻。
![Java 中的 super 关键字 - 1]()
Java 中的 super 关键字是什么?
super 是一个关键字,可用于调用超类的重写方法,以及引用超类的隐藏字段。为何使用以及何时使用 super 关键字?
Java super 关键字有三种明确的用法。- 当子类也有与父类同名的数据成员时,访问父类的数据成员。
- 调用子类中父类的默认或参数化构造方法。
- 如果子类有重写方法,则调用子类中的父类方法。
示例 1 — 访问父类的数据成员
示例 1 说明如何在 Car 类型的子类中访问 Vehicle 类的属性或数据成员。请确保运行下面的代码片段来更好地理解这一点。
class Vehicle {
String name = "vehicle";
}
class Car extends Vehicle {
String name = "car";
public void printMyName() {
System.out.println(name);
}
public void printParentName() {
// use super keyword to access
// parent's data member / attribute
System.out.println(super.name);
}
public static void main(String[] args) {
Car myCar = new Car();
System.out.print("My Car's Name: ");
myCar.printMyName();
// printing the parent's name
// using the super keyword
System.out.print("My Parent Vehicle's Name: ");
myCar.printParentName();
}
}
输出
我的小汽车名称:小汽车
我的父类车辆的名字:车辆
示例 2 — 在子类中访问父类的构造方法
显式调用 super() 可以访问子类中父类的默认或参数化构造方法。下面是参数化构造方法的示例。父类即 Shape 类的构造方法在子类即 Triangle 类中调用(使用 super())以设置属性。运行下面的程序以测试自己的输出。
public class Shape {
String name;
public Shape(String n) {
System.out.println("Shape() parameterized constructor called!");
name = n;
}
}
class Triangle extends Shape {
int sides = 3;
String color;
public Triangle(String n, String c) {
// The super keyword calls the parameterized
// constructor of the parent (Shape) with
// 'n' as a parameter
super(n);
System.out.println("Triangle() parameterized constructor called!");
this.color = c;
}
public static void main(String[] args) {
Triangle myTriangle = new Triangle("Triangle Alpha", "Yellow");
System.out.println(myTriangle.name);
System.out.println(myTriangle.color);
}
}
输出
已调用 Shape() 参数化构造方法!
已调用 Triangle() 参数化构造方法!
三角形 Alpha
黄色
快速挑战:使用默认的构造方法重新设计上面的程序来测试你的学习成果。此外了解 super() 与 super(arg) 的差异。
示例 3 — 在子类中访问父类的重写方法
示例 3 说明了如何访问同时在子类定义的父类的方法。下面程序中的父类 Sound 定义了一个方法 voice().。子类 Drum 也有一个同名的方法,即 voice()。这意味着方法 voice 被子类重写。运行下面的程序,了解在子类中使用父类的方法是 super 关键字是怎样必不可少。
public class Sound {
public void voice() {
System.out.println("Play sound!");
}
}
class Drum extends Sound {
public void voice() {
System.out.println("Play drums!");
}
public void play() {
// The super keyword calls the
// voice() method of the parent
super.voice();
voice();
}
public static void main(String[] args) {
Drum myDrum = new Drum();
myDrum.play();
}
}
输出
已调用 Shape() 参数化构造方法!
已调用 Triangle() 参数化构造方法!
三角形 Alpha
黄色

GO TO FULL VERSION