Java关键字 `super` 的骚操作

文章目录

    • [1. 调用父类构造方法](#1. 调用父类构造方法 "#1__21")
    • [2. 访问父类属性和方法](#2. 访问父类属性和方法 "#2__42")
    • [3. 创建父类引用](#3. 创建父类引用 "#3__71")
    • [4. 在接口中使用 super](#4. 在接口中使用 super "#4__super_98")
    • [5. 在 Lambda 表达式中使用 super](#5. 在 Lambda 表达式中使用 super "#5__Lambda__super_125")
    • [6. 异常处理](#6. 异常处理 "#6__154")
    • 结语

🎉欢迎来到Java学习路线专栏~Java关键字 super 的骚操作



Java 是一门广泛使用的面向对象编程语言,拥有丰富的特性和关键字来支持各种编程场景。其中,super 是一个关键字,用于在子类中引用父类的成员。虽然 super 的主要目的是调用父类的方法和属性,但它也有一些不太为人所知的骚操作,本文将介绍这些特殊用法。

1. 调用父类构造方法

super 最常见的用途是在子类构造方法中调用父类的构造方法。这通常发生在子类需要执行某些父类初始化操作时。以下是一个示例:

java 复制代码
class Parent {
    Parent() {
        System.out.println("父类构造方法");
    }
}

class Child extends Parent {
    Child() {
        super(); // 调用父类构造方法
        System.out.println("子类构造方法");
    }
}

这里,super() 调用了父类 Parent 的构造方法,确保在创建 Child 对象时会执行父类的初始化。

2. 访问父类属性和方法

super 还可以用于访问父类的属性和方法,即使在子类中存在相同名称的属性或方法。这种情况下,super 用于明确指示你要访问父类的成员。示例如下:

java 复制代码
class Parent {
    String name = "父类属性";

    void printInfo() {
        System.out.println("这是父类方法");
    }
}

class Child extends Parent {
    String name = "子类属性";

    void printInfo() {
        super.printInfo(); // 调用父类方法
        System.out.println("这是子类方法");
    }

    void accessParentAttribute() {
        System.out.println(super.name); // 访问父类属性
    }
}

Child 类的 printInfo 方法中,使用 super.printInfo() 明确调用了父类的 printInfo 方法。同样,super.name 用于访问父类的 name 属性。

3. 创建父类引用

super 还可以用于创建父类的引用,这对于多态和方法重写非常有用。例如:

java 复制代码
class Animal {
    void makeSound() {
        System.out.println("动物发出声音");
    }
}

class Dog extends Animal {
    void makeSound() {
        System.out.println("狗叫");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog(); // 使用父类引用指向子类对象
        myDog.makeSound(); // 调用的是子类的方法
    }
}

在这个示例中,myDog 是一个 Animal 类型的引用,但它指向一个 Dog 类的对象。通过这种方式,可以实现多态,调用适当的子类方法。

4. 在接口中使用 super

super 也可以在接口中使用,用于解决多重继承冲突。如果一个类实现了多个接口,而这些接口有相同方法签名的默认方法,编译器将不知道要调用哪个接口的方法。在这种情况下,super 可以用于明确指示要调用哪个接口的方法。以下是一个示例:

java 复制代码
interface Animal {
    default void makeSound() {
        System.out.println("动物发出声音");
    }
}

interface Vehicle {
    default void makeSound() {
        System.out.println("车辆发出声音");
    }
}

class Car implements Animal, Vehicle {
    @Override
    public void makeSound() {
        Vehicle.super.makeSound(); // 明确指定使用 Vehicle 接口的方法
    }
}

Car 类的 makeSound 方法中,使用 Vehicle.super.makeSound() 明确指示调用 Vehicle 接口的 makeSound 方法。

5. 在 Lambda 表达式中使用 super

Lambda 表达式通常用于实现函数式接口。在 Lambda 表达式中,super 关键字可以用于引用父类的成员或调用父类的方法。以下是一个示例:

java 复制代码
@FunctionalInterface
interface MyFunction {
    void myMethod();
}

class Parent {
    void sayHello() {
        System.out.println("Hello from parent");
    }
}

class Child extends Parent {
    void greet() {
        MyFunction func = () -> {
            super.sayHello(); // 在 Lambda 中使用 super 调用父类方法
            System.out.println("Hello from child");
        };
        func.myMethod();
    }
}

Child 类的 greet 方法中,Lambda 表达式 func 使用 super.sayHello() 调用了父类的 sayHello 方法。

6. 异常处理

在异常处理中,super 关键字可以用于调用父类的异常处理代码。这在子类覆盖父类方法时非常有用。以下是一个示例:

java 复制代码
class Parent {
    void performAction() throws MyException {
        // 一些可能抛出异常的代码
    }
}

class Child extends Parent {
    void performAction() throws MyException {
        try {
            super.performAction(); // 调用父类的异常处理代码
        } catch (MyException e) {
            // 处理子类特定的异常情况
        }
    }
}

Child 类的 performAction 方法中,使用 super.performAction() 调用了父类的异常处理代码,然后在 catch 块中处理子类特定的异常情况。

结语

Java 中的 super 关键字不仅用于调用父类的构造方法,还可以用于访问父类的属性和方法,创建父类引用,解决多重继承冲突,Lambda 表达式中使用以及异常处理。这些用法使得 super 成为 Java 面向对象编程中非常有用的工具之一。通过灵活运用 super,你可以更好地掌控和组织你的代码。希望本文对你加深对 Java 中 super 关键字的理解有所帮助。


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏\

相关推荐
一嘴一个橘子1 小时前
springmvc 全局异常处理【补充】
java
Wang's Blog1 小时前
Vibe Coding一人即团队系列35: 基于Claude Code的Spring Boot项目初始化实践
java·spring boot·后端
Dovis(誓平步青云)2 小时前
拍视频前先把镜头想清楚:做一个分镜取景辅助器
android·java·服务器·javascript·人工智能
AI人工智能+电脑小能手2 小时前
大白话说Java设计模式-45-解释器模式(源码剖析篇)
java·设计模式·解释器模式·源码分析·pattern·spel·javacc
吴声子夜歌2 小时前
Java——开发中通用的方法和准则(二)
java·开发语言·php
袁震2 小时前
HarmonyOS 应用包体积优化与上架自检实战:从 76.2MB 到 3.6MB
java·华为·性能优化·harmonyos
zcmodeltech2 小时前
反应装置模型控制系统设计与实现:多设备协同联动方案
java·网络·数据库·stm32·嵌入式硬件·能源·制造
码视野3 小时前
基于 Spring Boot + Vue3 的【城市地下燃气管网微泄漏感知与相邻地下空间燃爆预警中台】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端
2601_962071573 小时前
数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键
java·开发语言·数据库
梦想的旅途23 小时前
如何高效调用企业微信通讯录API管理组织架构
java·开发语言·企业微信