精通 Java 方法重写:实战示例、核心规则与 super 关键字
精通 Java 方法重写
通过实战示例、关键规则和强大的 super 关键字,深入探索 Java 方法重写。
上周我们讲了继承 —— 这一 OOP 核心特性让子类继承父类的属性和行为。现在深入方法重写 —— 子类为父类已定义的方法提供自己的实现。
示例 1:基础方法重写
class Animal { public void displayInfo() { System.out.println("I am an animal."); } } class Dog extends Animal { @Override public void displayInfo() { System.out.println("I am a dog."); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.displayInfo(); } }
输出:
I am a dog.
此片段中,Animal 和 Dog 均声明 displayInfo()。当 Dog 实例调用它时,运行的是子类实现,演示了重写。
注意 @Override 注解。它告诉编译器该方法意在替换父类版本;若签名不匹配,编译器报错。虽非强制,但它是防止意外错误的最佳实践。
Java 重写规则
- 方法名、返回类型和参数列表在两个类中必须完全一致。
- final 或 static 方法不能被重写。
- 父类中的抽象方法必须由具体子类重写。
使用 super 调用父类方法
重写后还能调用父类方法吗?完全可以 —— 使用 super 关键字。
示例 2:利用 super
class Animal { public void displayInfo() { System.out.println("I am an animal."); } } class Dog extends Animal { public void displayInfo() { super.displayInfo(); System.out.println("I am a dog."); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.displayInfo(); } }
输出:
I am an animal. I am a dog.
此处 Dog 先通过 super 调用 Animal.displayInfo(),再添加自己的消息。
记住,构造器不被继承,所以不存在“构造器重写”。但子类可用 super() 调用父类构造器 —— 详见 Java super 关键字 指南。
重写时的访问级别
重写方法的可见性可以不同,但只能扩大访问权限。
若父类方法是 protected,子类可声明为 protected 或 public,但不能是 private。
示例 3:改变可见性
class Animal { protected void displayInfo() { System.out.println("I am an animal."); } } class Dog extends Animal { public void displayInfo() { System.out.println("I am a dog."); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.displayInfo(); } }
输出:
I am a dog.
因为 public 比 protected 提供更宽访问,重写合法。
重写抽象方法
抽象类常声明无方法体的方法。任何具体子类必须提供实现,否则编译器报错。我们将在后续教程深入讲解抽象类。
java
- 精通 Java 运算符:类型、语法与实战示例
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 注解类型完全指南:预定义、自定义与元注解
- Java String length() 方法:获取字符串长度(示例)
- 精通 Java String.indexOf():定位子字符串与实战示例
- Java String.charAt() 详解:语法、返回类型、异常与实战示例
- 精通 Java String compareTo():语法、用例与实战示例
- Java String.contains() 方法:检查子字符串是否存在(实战示例)
- 精通 Java String.endsWith():检查字符串后缀(示例)
- Java 字符串替换大全:replace()、replaceAll() 与 replaceFirst() 详解