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


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

相关推荐
东北甜妹16 分钟前
Redis Cluster 操作命令
java·开发语言
消失的旧时光-194335 分钟前
Spring Boot 核心机制之 @Conditional:从原理到实战(一次讲透)
java·spring boot·后端
石榴树下的七彩鱼39 分钟前
智能抠图 API 接入实战:3 行代码实现图片自动去背景(Python / Java / PHP / JS)
java·图像处理·人工智能·python·php·api·抠图
知兀42 分钟前
【Result类】(使用/不使用<T> data的情况);自带静态方法、纯数据类;
java·开发语言
Seven9743 分钟前
【从0到1构建一个ClaudeAgent】协作-自主Agent
java
洋不写bug1 小时前
Java线程(三):线程执行顺序问题、可重入锁、加锁操作解析,死锁解决
java·开发语言
lifallen1 小时前
Flink Source / Sink Exactly-Once 边界分析
java·大数据·flink
xyyaihxl1 小时前
将 vue3 项目打包后部署在 springboot 项目运行
java·spring boot·后端
0xDevNull2 小时前
Spring Boot 3.x 整合 Nacos 全栈实战教程
java·spring boot·nacos
落木萧萧8252 小时前
MyBatisGX 示例工程:CRUD + 关联查询完整演示
java·后端