java学习笔记
在java中super关键字的作用
本 文 目 录
在面向对象编程的世界里,继承是一个强大的概念,它允许我们扩展现有类的功能,创建新的类。在Java中,super
关键字在继承的上下文中扮演着至关重要的角色。它提供了一种机制,使得子类能够访问和调用其父类的成员,包括构造方法、字段和方法。本文将深入探讨super
关键字的定义、目的、使用场景,并与this
关键字进行对比,最后通过代码案例加以说明。
super关键字的定义与目的
super
是Java中的一个特殊关键字,它代表了当前对象的直接父类。这个关键字的主要目的是为了解决子类和父类之间可能存在的命名冲突,并确保父类的正确初始化。通过super
,我们可以在子类中显式地调用父类的构造方法、访问父类的变量和方法,即使它们与子类中的同名成员存在冲突。
使用场景
super
关键字的使用场景主要包括以下几个方面:
- 调用父类构造方法:在子类的构造方法中,我们可以使用
super
来调用父类的构造方法,确保父类的初始化代码得以执行。 - 访问父类成员:当子类和父类有同名的字段或方法时,
super
可以用来访问父类的成员,而不是子类的。 - 方法覆盖:在子类中重写父类的方法时,如果需要调用父类的方法,可以使用
super
关键字。
与this关键字的对比
this
和super
都是Java中的引用类型,但它们的用途和指向不同。this
代表当前对象的引用,用于访问当前类的成员和方法,而super
则是指向父类的引用。以下是this
和super
的对比表格:
特性 | this | super |
---|---|---|
指向 | 当前对象 | 父类对象 |
用途 | 访问当前类的成员和方法 | 访问父类的成员和方法 |
构造方法中 | 调用其他构造方法 | 调用父类构造方法 |
成员变量冲突 | 无法直接访问父类变量 | 访问父类变量 |
方法冲突 | 无法直接调用父类方法 | 调用父类方法 |
核心类与方法
在Java中,每个类都有一个隐式定义的super
,它指向父类。当创建一个子类对象时,父类的构造方法会被自动调用,除非显式地使用super
关键字指定另一个构造方法。此外,如果子类中定义了一个与父类同名的方法,这个方法会覆盖(覆盖)父类的方法,这时可以使用super
关键字来调用父类的原始方法。
代码案例
案例1:调用父类构造方法
class Parent {
Parent(String name) {
System.out.println("Parent constructor called with name: " + name);
}
}
class Child extends Parent {
Child(String name, String childName) {
super(name); // 调用父类构造方法
System.out.println("Child constructor called with childName: " + childName);
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child("FamilyName", "ChildName");
}
}
在这个案例中,Child
类在构造方法中使用super
关键字调用了Parent
类的构造方法,并传递了一个参数。当运行这段代码时,会先打印父类的构造消息,然后是子类的消息。
案例2:访问父类成员
class Parent {
String name = "ParentName";
void displayName() {
System.out.println("Name in Parent: " + name);
}
}
class Child extends Parent {
String name = "ChildName";
void displayName() {
System.out.println("Name in Child: " + this.name); // 访问子类成员
super.displayName(); // 调用父类方法
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child("ChildName", "ParentName");
child.displayName();
}
}
在这个案例中,尽管Child
类和Parent
类都有名为name
的字段,但它们是独立的。Child
类中的displayName
方法使用this
关键字来访问子类自己的name
字段,并通过super.displayName()
调用父类的同名方法,使用super
来访问父类的成员。
通过这两个案例,我们可以看到super
关键字在实际编程中的应用,它使得子类能够与父类进行交互,无论是在构造方法的调用还是在成员的访问上。这种机制是Java面向对象编程中不可或缺的一部分,它为代码的复用和扩展提供了强大的支持。