Java 中的 super
关键字:深入解析与最佳实践
简介
在 Java 编程中,super
关键字是一个强大且重要的工具,它为类之间的继承关系提供了强大的支持。通过 super
关键字,我们可以在子类中引用父类的成员,包括方法、属性等,从而实现代码的复用和扩展。本文将详细介绍 super
关键字的基础概念、使用方法、常见实践以及最佳实践,帮助读者深入理解并高效使用这一关键字。
目录
- 基础概念
- 使用方法
- 调用父类的构造方法
- 访问父类的成员变量
- 调用父类的成员方法
- 常见实践
- 方法重写时调用父类方法
- 子类构造方法中调用父类构造方法
- 最佳实践
- 合理使用
super
避免代码重复 - 注意
super
调用的位置和顺序
- 合理使用
- 小结
- 参考资料
基础概念
在 Java 中,super
关键字主要用于在子类中引用父类的成员。当子类继承父类时,子类可以拥有父类的属性和方法,同时也可以对这些属性和方法进行重写。在某些情况下,我们需要在子类中明确地引用父类的成员,这时就可以使用 super
关键字。super
关键字可以用于以下三个主要场景:
- 调用父类的构造方法。
- 访问父类的成员变量。
- 调用父类的成员方法。
使用方法
调用父类的构造方法
在子类的构造方法中,我们可以使用 super()
来调用父类的构造方法。super()
必须是子类构造方法中的第一条语句。
class Parent {
public Parent() {
System.out.println("Parent constructor is called.");
}
}
class Child extends Parent {
public Child() {
super(); // 调用父类的无参构造方法
System.out.println("Child constructor is called.");
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
}
}
访问父类的成员变量
当子类和父类拥有同名的成员变量时,我们可以使用 super
关键字来访问父类的成员变量。
class Parent {
int num = 10;
}
class Child extends Parent {
int num = 20;
public void printNumbers() {
System.out.println("Parent num: " + super.num);
System.out.println("Child num: " + this.num);
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.printNumbers();
}
}
调用父类的成员方法
当子类重写了父类的方法时,我们可以使用 super
关键字来调用父类的原始方法。
class Parent {
public void display() {
System.out.println("This is the Parent class.");
}
}
class Child extends Parent {
@Override
public void display() {
super.display(); // 调用父类的 display 方法
System.out.println("This is the Child class.");
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.display();
}
}
常见实践
方法重写时调用父类方法
在方法重写时,有时候我们需要在子类的方法中保留父类方法的部分功能,这时可以使用 super
关键字调用父类的方法。
class Animal {
public void makeSound() {
System.out.println("Some generic sound.");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
super.makeSound(); // 调用父类的 makeSound 方法
System.out.println("Woof!");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound();
}
}
子类构造方法中调用父类构造方法
在子类的构造方法中,通常需要调用父类的构造方法来初始化父类的成员变量。
class Vehicle {
protected String brand;
public Vehicle(String brand) {
this.brand = brand;
System.out.println("Vehicle constructor is called.");
}
}
class Car extends Vehicle {
private int numDoors;
public Car(String brand, int numDoors) {
super(brand); // 调用父类的构造方法
this.numDoors = numDoors;
System.out.println("Car constructor is called.");
}
public void displayInfo() {
System.out.println("Brand: " + brand + ", Num of doors: " + numDoors);
}
}
public class Main {
public static void main(String[] args) {
Car car = new Car("Toyota", 4);
car.displayInfo();
}
}
最佳实践
合理使用 super
避免代码重复
在子类中,如果需要使用父类的部分功能,应该优先考虑使用 super
关键字调用父类的方法,而不是重复编写相同的代码。这样可以提高代码的复用性和可维护性。
注意 super
调用的位置和顺序
在子类的构造方法中,super()
必须是第一条语句。如果忘记调用 super()
,Java 编译器会自动插入一个无参的 super()
调用。因此,在父类没有无参构造方法时,必须显式地调用父类的有参构造方法。
小结
super
关键字是 Java 中一个非常重要的特性,它为子类和父类之间的交互提供了强大的支持。通过 super
关键字,我们可以调用父类的构造方法、访问父类的成员变量和调用父类的成员方法。在实际编程中,合理使用 super
关键字可以避免代码重复,提高代码的复用性和可维护性。
参考资料
- 《Effective Java》