在Java中,重写(Overriding)是面向对象编程中的一个概念,它是指子类重新定义了父类的方法。重写方法必须具有相同的方法名、参数列表以及返回类型。重写也被称为方法重写或者方法覆盖。
一、
重写的主要目的是:
- 使子类能够根据需要改变方法的行为。
- 覆盖父类的方法,以便实现子类特有的逻辑。
重写的规范:
- 在继承中存在
- 子类重写父类的方法(private方法不能被重写)
- 方法头不能变,只能重写方法体中的内容(逻辑)
- 方法头不能变:如修饰符、参数列表、方法名、返回值类型
-
静态方法不能被重写:只有实例方法(非静态方法)可以被重写。静态方法属于类本身,而不是类的实例,因此不能被继承或重写。
-
final方法不能被重写:如果父类中的方法被声明为final,那么子类无法重写该方法。
以下是一个代码示例:
class Animal {
void speak() {
System.out.println("The animal speaks.");
}
}
class Dog extends Animal {
@Override
void speak() {
System.out.println("The dog barks.");
}
}
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Dog();
myAnimal.speak(); // 输出:The dog barks.
}
}
在这个例子中,Dog
类重写了 Animal
类的 speak
方法。当我们创建一个 Dog
类的实例,并将其向上转型为 Animal
类型时,调用 speak
方法将执行 Dog
类的实现,这就是重写的效果。
二、
重写和重载的区别:
- 定义不同:重载是定义相同的方法名,参数不同;重写是子类重写父类的方法。
- 范围不同:重载是在一个类中,重写是子类与父类之间的。
- 多态不同:重载是编译时的多态性,重写是运行时的多态性。
- 返回不同:重载对返回类型没有要求,重写要求返回类型与被重写方法的返回类型相同或是其子类。
- 参数不同:重载的参数个数、参数类型、参数顺序可以不同,重写要求父子方法参数必须相同。
- 修饰不同:重载对访问修饰没有特殊要求,重写访问修饰符的限制一定要大于被重写方法的访问修饰符。