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


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

相关推荐
WaaTong1 分钟前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
m0_743048441 分钟前
初识Java EE和Spring Boot
java·java-ee
AskHarries3 分钟前
Java字节码增强库ByteBuddy
java·后端
小灰灰__23 分钟前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
夜雨翦春韭26 分钟前
Java中的动态代理
java·开发语言·aop·动态代理
程序媛小果1 小时前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
追风林1 小时前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
芒果披萨1 小时前
El表达式和JSTL
java·el
duration~2 小时前
Maven随笔
java·maven
zmgst2 小时前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql