java如何重写
重写方法的基本概念
在Java中,重写(Override)是指子类重新定义父类中已有的方法。重写允许子类提供特定于自身的实现,同时保持方法签名(方法名、参数列表和返回类型)与父类一致。重写是多态性的一种体现。
重写的规则
方法重写必须遵循以下规则:

- 子类方法的名称、参数列表和返回类型必须与父类方法完全相同。
- 访问修饰符不能比父类方法的访问修饰符更严格(例如,父类方法是
protected,子类方法可以是protected或public,但不能是private)。 - 子类方法不能抛出比父类方法更宽泛的检查异常(checked exception)。
- 如果父类方法是
final或static,则不能重写。
重写的示例代码
以下是一个简单的重写示例:
class Animal {
public void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
myDog.makeSound(); // 输出: Dog barks
}
}
使用@Override注解
在子类方法上添加@Override注解是一个良好的实践。它可以帮助编译器检查方法是否正确地重写了父类方法。如果方法签名不匹配,编译器会报错。

重写与重载的区别
重写(Override)与重载(Overload)是不同的概念:
- 重写发生在父子类之间,方法签名必须相同。
- 重载发生在同一个类中,方法名相同但参数列表不同。
动态绑定与重写
Java通过动态绑定(运行时多态)实现重写。在运行时,JVM根据对象的实际类型调用相应的方法。例如:
Animal myAnimal = new Dog();
myAnimal.makeSound(); // 调用的是Dog类的makeSound方法
注意事项
- 重写方法时,子类方法的返回类型可以是父类方法返回类型的子类(协变返回类型)。
- 不能重写
private方法,因为private方法对子类不可见。 - 静态方法不能被重写,但可以隐藏(通过声明相同的静态方法)。






