方法重写是Java实现多态的关键机制,要求子类方法与父类方法同名、同参数列表、同返回类型(或协变),且非private、static、final,需继承关系,配合@Override注解验证。

方法重写(Override)是 Java 中实现多态的关键机制,它允许子类提供父类中已定义方法的具体实现,从而改变该方法的行为。核心前提是:子类方法必须与父类被重写的方法具有相同的方法名、参数列表和返回类型(或协变返回类型),且访问权限不能更严格。
重写的前提条件
要成功重写一个方法,需同时满足以下几点:
- 方法必须是非 private、非 static、非 final 的——private 方法不可见,static 方法属于类而非对象,final 方法禁止重写
- 子类与父类之间必须存在继承关系(extends)
- 子类中的方法签名(方法名 + 参数类型 + 参数顺序)必须与父类完全一致
- 返回类型可以相同,或为父类返回类型的子类型(协变返回,Java 5 起支持)
- @Override 注解不是必须的,但强烈建议添加——它能帮助编译器检查是否真正构成重写,避免拼写错误或参数不匹配导致的意外重载
正确重写的典型写法
以一个简单的 Animal 和 Dog 类为例:
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: Woof!");
}
}
调用时:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Animal a = new Dog(); a.makeSound(); // 输出 "Dog barks: Woof!" —— 运行时决定调用子类重写后的方法
注意:即使变量声明为父类类型(Animal),只要实际对象是子类实例(new Dog()),就会执行子类重写后的方法——这就是动态绑定(运行时多态)。
常见陷阱与注意事项
重写容易出错的地方包括:
- 误把重写写成重载:比如在子类中加了不同参数的方法,那只是新增了一个重载方法,原父类方法仍存在且未被重写
- 访问修饰符缩小:父类方法是 protected,子类却写成 private 或 package-private(默认),编译报错
- 抛出更宽泛的异常:子类重写方法不能抛出比父类方法声明更宽泛的检查型异常(如父类 throws IOException,子类只能 throws FileNotFoundException 或不抛,不能 throws Exception)
- 静态方法无法被重写:如果父类和子类都有同名 static 方法,它们是各自独立的,调用取决于引用类型(不是运行时对象类型),这是“隐藏”而非重写
如何验证是否成功重写
最可靠的方式是:
- 加上 @Override 注解,编译通过即说明签名匹配、可重写
- 用父类引用指向子类对象,调用该方法,观察输出是否为子类逻辑
- 在 IDE 中将鼠标悬停在方法名上,通常会提示 “Overrides method in …”
不复杂但容易忽略细节,关键在于理解“签名一致”和“运行时绑定”这两个核心点。

















