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


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

相关推荐
挺菜的7 分钟前
【算法刷题记录(简单题)003】统计大写字母个数(java代码实现)
java·数据结构·算法
掘金-我是哪吒1 小时前
分布式微服务系统架构第156集:JavaPlus技术文档平台日更-Java线程池使用指南
java·分布式·微服务·云原生·架构
亲爱的非洲野猪1 小时前
Kafka消息积压的多维度解决方案:超越简单扩容的完整策略
java·分布式·中间件·kafka
wfsm1 小时前
spring事件使用
java·后端·spring
微风粼粼2 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
缘来是庄2 小时前
设计模式之中介者模式
java·设计模式·中介者模式
rebel2 小时前
若依框架整合 CXF 实现 WebService 改造流程(后端)
java·后端
代码的余温3 小时前
5种高效解决Maven依赖冲突的方法
java·maven
慕y2743 小时前
Java学习第十六部分——JUnit框架
java·开发语言·学习
paishishaba3 小时前
Maven
java·maven