主题
  • 默认模式
  • 浅蓝色模式
  • 淡绿色模式
  • 深夜模式

Java Super 关键字

在 Java 的面向对象编程中,super 关键字用于引用父类的成员,包括成员变量 (属性)、方法和构造方法。借助 super,子类可以访问和调用父类中被隐藏或重写的成员,从而实现对父类功能的扩展和复用。

super 关键字主要有以下三种用途:

  • 访问父类成员变量:当子类中存在与父类同名的成员变量时,可以通过super访问父类中被隐藏的成员变量。
  • 调用父类方法:若子类重写了父类的方法,仍可通过super调用父类中的原始实现。
  • 调用父类构造方法:在子类的构造方法中,可以使用super调用父类的构造方法,且该语句必须位于子类构造方法的第一行。

Java Super 使用演示实例图


Super 主要用途

下面通过几个示例来演示super关键字的具体用法:

1. 访问父类的成员变量

当子类中定义了与父类同名的成员变量时,直接访问该成员变量将引用子类自身的成员变量。如果需要访问父类中的同名成员变量,必须通过super关键字的super.value进行显式调用。以下是具体演示实例:

java
复制
class Website {
    protected String websiteName = "教程网站";
}

class Kaicz extends Website {
    private String websiteName = "开创者教程";

    public void printWebsiteNames() {
        System.out.println("子类name: " + name);          // 输出:教程网站
        System.out.println("父类name: " + super.name);    // 输出:开创者教程
    }
}

执行上面的程序后,运行结果:

子类name: 教程网站
父类name: 开创者教程

在上面的代码中,Website 类定义了一个名为websiteName的成员变量,子类Kaicz也定义了一个同名的成员变量。

当我们在Kaicz类的方法printWebsiteNames()中访问websiteName时,默认引用的是子类的成员变量。如果需要访问父类的成员变量,则必须使用 super.websiteName

2. 调用父类的方法

当子类通过重写(Override)来定义与父类同名的方法时,若仍需调用父类中的原始方法实现,可以使用super关键字进行显式调用。这种方式在子类需要扩展而非完全替代父类功能时尤为有用。以下是具体演示实例:

java
复制
class Website {
    public void websiteName() {
        System.out.println("网站为教程网站!");
    }
}

class Kaicz extends Website {
    @Override
    public void websiteName() {
        super.websiteName(); // 先调用父类的websiteName方法
        System.out.println("本网站为开创者教程!");
    }
}

执行上面的程序后,运行结果:

网站为教程网站!
本网站为开创者教程!

在上面的代码中,Website 类定义了一个名为websiteName()的方法。子类Kaicz通过重写该方法,提供了自己的实现。

3. 调用父类的构造函数

在子类的构造函数中,可以使用super关键字调用父类的构造函数。这在父类有参数的构造函数时尤为重要,因为子类必须显式调用父类的构造函数来初始化从父类继承的成员变量。以下是具体演示实例:

java
复制
class Website {
    private String websiteName;

    public Website(String websiteName) {
        this.websiteName = websiteName;
        System.out.println("Website 构造函数被调用");
    }
}

class Kaicz extends Website {
    private String websiteUrl;

    public Kaicz(String websiteName, String websiteUrl) {
        super(websiteName); // 必须放在第一行
        this.websiteUrl = websiteUrl;
        System.out.println("Kaicz 构造函数被调用");
    }
}

执行上面的程序后,运行结果:

Website 构造函数被调用
Kaicz 构造函数被调用

在上面的代码中,Website 类定义了一个带有参数的构造函数。子类Kaicz的构造函数通过super(websiteName)调用了父类的构造函数,以确保父类的成员变量得到正确初始化。


Super 与 This 的区别

superthis都是 Java 中的关键字,但它们在用途和指代对象上有本质区别:

  • this:指代当前对象的引用,主要用于访问当前对象的成员变量和方法,也可以在构造器中调用本类的其他构造方法。
  • super:指代父类对象的引用,主要用于访问父类中被覆盖的方法、被隐藏的成员变量,以及在子类构造器中显式调用父类的构造方法。

总结来说,this 用于引用当前类的成员,而 super 用于引用父类的成员。它们在面向对象编程中分别扮演着不同的角色,帮助开发者更好地管理类之间的关系和继承结构。



评论区 0
发表评论