super 关键字用于不同的情况。在开始这篇文章之前,我们鼓励你学习 Java 中的继承,这样理解会更透彻。

Java 中的 super 关键字是什么?

super 是一个关键字,可用于调用超类的重写方法,以及引用超类的隐藏字段。

为何使用以及何时使用 super 关键字?

Java super 关键字有三种明确的用法。
  1. 当子类也有与父类同名的数据成员时,访问父类的数据成员
  2. 调用子类中父类的默认或参数化构造方法
  3. 如果子类有重写方法,则调用子类中的父类方法
让我们借助例子来理解以上三种情况。

示例 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 黄色
Java 中的 super 关键字 - 1

结论

在这篇文章结束时,我们希望你能够了解 Java 中 super 关键字的工作原理。我们鼓励你通过实践来学习编码。因为实践是学习逻辑构建的最终关键。无论何时你遇到困难,这个帖子都会欢迎你。祝学习愉快!