Bootstrap

第8节:大三学姐的分享,一分钟搞懂Java中的super关键字

博主简介:
        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(),程序仍然可以正常运行。

以上就是本节中讲述的Javasuper关键字的全部内容!如果这篇文章对你有帮助,不要忘了点赞收藏哦!同时欢迎在评论区分享你在开发中遇到的有趣案例或者疑问,我会尽快解答~每天都会更新最新的Java干货知识,关注我,不错过任何精彩内容!你的支持是我持续创作的动力,转发给需要的小伙伴,一起探索Java的世界吧!

;