博主简介:
CSDN 博主,架构师,13年开发经验。专注于Java、嵌入式开发、前端技术以及微信小程序等技术领域,致力于分享相关项目经验和技术实践。发布的内容面向在校大学生,或者对技术感兴趣的同学,旨在帮助大家打好基础,掌握核心技术和实践能力。
在这里,您将找到从零开始的Java编程教程、实用的嵌入式开发技巧、前沿的前端框架应用以及微信小程序开发的相关实践。通过实际项目的演示与分析,帮助大家理解复杂的技术概念,并学会如何将这些知识应用到真实开发中。
希望通过这个平台,与大家一起交流,共同成长! 如果你有兴趣讨论技术或加入我的学习圈子,可以关注我,我会定期更新分享经验,我的微信号:RJ_xiaohui 。
Java中的super关键字用于引用直接父类的对象,并且与Java中的继承相关。
假设在子类和父类中有一个同名的实例变量或方法。
JVM如何知道你指的是父类的还是子类的?这时你可以使用super关键字来引用父类的变量、方法或构造函数。
上述讲解的内容可能对于初学者理解有困难,因为还缺少后续java中继承相关的知识,因此请你了解就可以。但是本节的每一个示例代码请务必动手实操,并正确编译运行,把结果和我们给出的结果对照,如果有问题欢迎在评论区留言互动,也可以加博主的联系方式询问。
我们在本节中,重点是学习super关键词。
让我们接下来通过多个案例来理解。
一.super和成员变量
我们可以通过 super.变量名 来引用父类的变量。
让我们通过示例来看一下
请你最好亲自动手在代码编辑器idea中正确并完整编写如下代码,并运行,看结果是否和我们给出的一样。这是学习编程最佳而又有趣的方式。
父类Person中有一个变量name。
子类Employee中也有一个同名变量name。
在子类中,使用super.name来引用父类Person的name变量,因为没有其他方法可以访问父类的name变量。
package org.arpit.java2blog;
// 定义父类 Person
public class Person {
String name; // 父类的 name 变量
public Person() {
// 构造函数中打印信息
System.out.println("Calling Person constructor");
name = "Default"; // 为父类的 name 变量赋值
}
}
// 定义子类 Employee,继承自 Person
class Employee extends Person {
String name; // 子类的 name 变量
int age; // 子类的 age 变量
public Employee() {
// 构造函数中打印信息
System.out.println("Calling Employee class constructor");
this.name = "Martin"; // 为子类的 name 变量赋值
}
public void printName() {
// 使用 super.name 访问父类的 name 变量
System.out.println("Printing default name from person class : " + super.name);
}
public static void main(String args[]) {
Employee e1 = new Employee(); // 创建子类对象
e1.printName(); // 调用 printName 方法
}
}
运行以上代码后,输出如下:
Calling Person constructor
Calling Employee class constructor
Printing default name from person class : Default
如您所见,我们使用super.name在Employee类的printName()方法中打印了来自Person类的name变量。
上述调用过程如下图所示:
二.super和构造函数
super关键字可以用来调用直接父类的构造函数。
请注意,super必须是子类构造函数中的第一条语句。
示例:
package org.arpit.java2blog;
// 定义父类 Person
public class Person {
String name;
public Person(String name) {
this.name = name; // 为父类的 name 变量赋值
System.out.println("Calling Person Parameterized constructor");
}
}
// 定义子类 Employee,继承自 Person
class Employee extends Person {
int age;
public Employee(String name) {
super(name); // 调用父类的带参数构造函数
System.out.println("Calling Employee class constructor");
}
public static void main(String args[]) {
Employee e1 = new Employee("John"); // 创建子类对象并传递参数
System.out.println("Employee's name: " + e1.getName()); // 打印子类对象的 name
}
}
运行以上代码后,输出如下:
Calling Person Parameterized constructor Calling Employee class constructor Employee's name: John
如您所见,我们使用super关键字从Employee类调用了Person的构造函数。
上述代码调用的过程示意图表示如下:
三.super和成员方法
super关键字可以用来调用父类的方法。
在方法重写的情况下,super可以用来专门调用父类的方法。
示例:
package org.arpit.java2blog;
// 定义父类 Person
public class Person {
String name;
public Person() {
System.out.println("Calling Person constructor");
name = "Default"; // 为父类的 name 变量赋值
}
public void printName() {
// 打印父类的 name 变量
System.out.println("Printing default name from person class : " + this.name);
}
}
// 定义子类 Employee,继承自 Person
class Employee extends Person {
String name; // 子类的 name 变量
int age; // 子类的 age 变量
public Employee() {
// 构造函数中打印信息
System.out.println("Calling Employee class constructor");
this.name = "Martin"; // 为子类的 name 变量赋值
}
public void printName() {
super.printName(); // 调用父类的 printName 方法
System.out.println("Printing name from Employee class : " + this.name); // 打印子类的 name 变量
}
public static void main(String args[]) {
Employee e1 = new Employee(); // 创建子类对象
e1.printName(); // 调用 printName 方法
}
}
运行以上代码后,输出如下:
Calling Person constructor
Calling Employee class constructor
Printing default name from person class : Default
Printing name from Employee class : Martin
如您所见,我们通过super.printName()从Employee类调用了Person类的方法。
上述代码调用的过程用图表示如下
四.思考一个问题
如果子类没有与父类相同的方法名,该怎么办?
如果子类没有与父类相同的方法名,则无需使用super关键字,方法会直接从父类继承。
示例:
package org.arpit.java2blog;
// 定义父类 Person
public class Person {
String name;
public Person() {
System.out.println("Calling Person constructor");
name = "Default"; // 为父类的 name 变量赋值
}
public void printNameSuperClass() {
// 打印父类的 name 变量
System.out.println("Printing default name from person class : " + this.name);
}
}
// 定义子类 Employee,继承自 Person
class Employee extends Person {
String name; // 子类的 name 变量
int age; // 子类的 age 变量
public Employee() {
// 构造函数中打印信息
System.out.println("Calling Employee class constructor");
this.name = "Martin"; // 为子类的 name 变量赋值
}
public void printName() {
printNameSuperClass(); // 调用父类的 printNameSuperClass 方法
System.out.println("Printing name from Employee class : " + this.name); // 打印子类的 name 变量
}
public static void main(String args[]) {
Employee e1 = new Employee(); // 创建子类对象
e1.printName(); // 调用 printName 方法
}
}
运行以上代码后,输出如下:
Calling Person constructor
Calling Employee class constructor
Printing default name from person class : Default
Printing name from Employee class : Martin
如您所见,我们没有使用super调用printNameSuperClass(),程序仍然可以正常运行。
以上就是本节中讲述的Java中super关键字的全部内容!如果这篇文章对你有帮助,不要忘了点赞、收藏哦!同时欢迎在评论区分享你在开发中遇到的有趣案例或者疑问,我会尽快解答~每天都会更新最新的Java干货知识,关注我,不错过任何精彩内容!你的支持是我持续创作的动力,转发给需要的小伙伴,一起探索Java的世界吧!