引言
在前面的文章中,我们介绍了继承的相关概念(Java进阶篇之继承的概念),在Java继承机制中,super关键字是一个重要的工具,用于访问父类的属性和方法,特别是在子类覆盖了父类的成员时。通过使用super
,子类可以调用父类的构造方法,访问父类的成员变量和方法,这在继承层次中至关重要。本文将深入探讨super
关键字的使用方式及其相关注意事项。
文章目录
一、super关键字的基本概念
super关键字用于引用父类对象,可以在以下几种场景中使用:
- 调用父类的构造方法:使用
super()
可以调用父类的构造方法,这是构造子类对象时初始化父类的一种方式。 - 访问父类的属性:在子类中,如果成员变量与父类同名,可以通过
super
来访问父类的成员变量。 - 调用父类的方法:子类可以通过
super
调用父类被重写的方法。
二、调用父类的构造方法
在子类的构造方法中,super()
必须是第一条语句,用于调用父类的构造方法。默认情况下,子类的构造方法会自动调用父类的无参构造方法,如果需要调用父类的有参构造方法,需要显式地使用super(参数)
。
class Parent {
String name;
Parent(String name) {
this.name = name;
System.out.println("Parent constructor called");
}
}
class Child extends Parent {
int age;
Child(String name, int age) {
super(name); // 调用父类的构造方法
this.age = age;
System.out.println("Child constructor called");
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child("John", 18);
}
}
输出:
Parent constructor called
Child constructor called
在这个例子中,Child
类的构造方法通过super(name)
调用了Parent
类的构造方法,从而实现了对父类属性的初始化。
三、访问父类的属性
在子类中,如果存在与父类同名的成员变量,可以使用super.变量名
来访问父类的变量。
class Parent {
String name = "ParentName";
}
class Child extends Parent {
String name = "ChildName";
void printName() {
System.out.println("Parent name: " + super.name); // 访问父类的name
System.out.println("Child name: " + this.name); // 访问子类的name
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.printName();
}
}
输出:
Parent name: ParentName
Child name: ChildName
通过super.name
,我们可以在Child
类中访问Parent
类的name
属性,避免了与子类name
属性的冲突。
四、调用父类的方法
在子类中重写父类的方法后,可以使用super.方法名()
来调用父类的原始方法,这在需要保留父类部分功能的同时扩展新功能时非常有用。
class Parent {
void display() {
System.out.println("Parent Display");
}
}
class Child extends Parent {
@Override
void display() {
super.display(); // 调用父类的display方法
System.out.println("Child Display");
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.display();
}
}
输出:
Parent Display
Child Display
在这个例子中,Child
类重写了Parent
类的display
方法,并通过super.display()
调用了父类的方法,实现了方法的扩展。
五、super关键字的注意事项
重要注意事项:
- super必须在子类构造方法的第一行:在子类构造方法中调用
super()
时,它必须是第一条语句,否则会导致编译错误。 - 不能使用super调用父类的私有方法或属性:
super
只能访问父类的公共(public)和受保护(protected)成员,无法访问父类的私有(private)成员。 - 避免与this混淆:
super
用于访问父类的成员,而this
用于访问当前类的成员。两者的使用场景不同,需注意区分。
六、知识结构图解
以下是关于super
关键字的知识结构图解:
七、总结
super
关键字在Java的继承机制中扮演着重要的角色,它允许子类访问和调用父类的属性和方法,特别是在子类重写了父类的成员时。通过合理使用super
,开发者可以在子类中保留父类的功能,并在此基础上进行扩展。掌握super
关键字的用法对于理解Java的继承机制至关重要。在下一篇文章中,我们将继续深入探讨Java继承中的重写和Java中重载的区别以及其他重要概念,帮助你更好地掌握Java的高级特性,敬请期待!