在上一章节中,我们讨论了超类和子类。如果一个类继承了来自其超类的方法,并且该方法没有被标记为 final
,则有机会重写该方法。
Java 方法重写的优点
方法重写的好处在于能够定义特定于子类类型的行为,这意味着子类可以根据需要实现超类的方法。从面向对象的角度来说,重写意味着覆盖现有方法的功能。
Java 方法重写
方法重写使我们能够实现运行时多态性,并用于编写已经在超类中定义的子类方法的具体定义。超类的方法和子类中重写的方法应该具有相同的声明签名,例如参数列表、类型和返回类型。
Java 方法重写的应用
以下是方法重写在 Java 中的两个重要用途:
-
-
方法重写用于编写子类方法的具体定义(这个方法被称为被重写的方法)。
Java 方法重写示例
让我们看一个例子:
class Animal {
public void move() {
System.out.println("Animals can move");
}
}
class Dog extends Animal {
public void move() {
System.out.println("Dogs can walk and run");
}
}
public class TestDog {
public static void main(String args[]) {
Animal a = new Animal();
Animal b = new Dog();
a.move();
b.move();
}
}
输出:
Animals can move
Dogs can walk and run
在上面的例子中,即使 b
是 Animal
的类型,它也会运行 Dog
类中的 move
方法。这是因为编译时检查的是引用类型,但是在运行时,JVM 会根据对象的实际类型决定运行哪个方法。
方法重写的规则
-
-
返回类型应该与超类中声明的被重写方法的返回类型相同或为其子类型。
-
访问级别不能比被重写的方法的访问级别更受限制。例如,如果超类中的方法被声明为
public
,则子类中的重写方法不能是 private
或 protected
。
-
-
-
声明为
static
的方法不能被重写,但可以被重新声明。
-
-
同一个包中的子类可以重写任何非
private
或非 final
的超类方法。
-
不同包中的子类只能重写声明为
public
或 protected
的非 final
方法。
-
重写的方法可以抛出任何未检查的异常,不管被重写的方法是否抛出异常。然而,重写的方法不应抛出新的或更广泛的已检查异常。重写的方法可以抛出更少或更窄的异常。
-
使用 super
关键字
当调用被重写方法的超类版本时,使用 super
关键字。
示例:使用 super
关键字
class Animal {
public void move() {
System.out.println("Animals can move");
}
}
class Dog extends Animal {
public void move() {
super.move();
System.out.println("Dogs can walk and run");
}
}
public class TestDog {
public static void main(String args[]) {
Animal b = new Dog();
b.move();
}
}
输出:
Animals can move
Dogs can walk and run