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 关键字的理解有所帮助。


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

相关推荐
神仙别闹2 分钟前
基于Java实现的(GUI)华容道小游戏
java·gui
JosieBook3 分钟前
【面试题】2025年百度校招Java后端面试题
java·开发语言·网络·百度
请你打开电视看看5 分钟前
观察者模式
java·观察者模式·设计模式
Mr.朱鹏7 分钟前
设计模式之策略模式-工作实战总结与实现
java·spring·设计模式·kafka·maven·策略模式·springbbot
计算机毕设指导610 分钟前
基于SpringBoot共享汽车管理系统【附源码】
java·spring boot·后端·mysql·spring·汽车·intellij idea
春风十里不如你95271 小时前
【设计模式】【行为型模式(Behavioral Patterns)】之责任链模式(Chain of Responsibility Pattern)
java·设计模式·责任链模式
小宋10211 小时前
实现Excel文件和其他文件导出为压缩包,并导入
java·javascript·excel·etl
guihong0041 小时前
JAVA面试题、八股文学习之JVM篇
java·jvm·学习
QQ_1154320311 小时前
基于Java+SpringBoot+Mysql在线简单拍卖竞价拍卖竞拍系统功能设计与实现九
java·spring boot·mysql·毕业设计·毕业源码·竞拍系统·竞拍项目