文章目录
-
- [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
关键字的理解有所帮助。
🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏\