java方法如何改写
方法重写的基本概念
方法重写(Override)是面向对象编程中多态性的重要体现,允许子类重新定义父类中已有的方法。重写后的方法需满足以下条件:
- 方法名、参数列表、返回类型必须与父类方法一致(返回类型在Java 5+支持协变类型)。
- 访问修饰符不能比父类更严格(如父类为
protected,子类可为public,但不能为private)。 - 父类方法若被
final或static修饰,则不能被重写。
重写与重载的区别
- 重写(Override):子类对父类方法的重新实现,要求方法签名完全一致。
- 重载(Overload):同一类中方法名相同但参数列表不同,与继承无关。
实际代码示例
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"); // 重写父类方法
}
}
子类Dog重写了Animal的makeSound()方法,调用时将执行子类逻辑。
使用@Override注解
添加@Override注解可显式声明方法为重写,编译器会检查是否符合重写规则,避免拼写错误或签名不匹配的问题。
动态绑定机制
Java通过动态绑定(运行时多态)决定调用哪个方法。例如:
Animal myDog = new Dog();
myDog.makeSound(); // 输出 "Dog barks",实际调用子类方法
访问父类被重写的方法
通过super关键字可调用父类方法:
class Dog extends Animal {
@Override
public void makeSound() {
super.makeSound(); // 先调用父类方法
System.out.println("Dog barks");
}
}
协变返回类型
Java 5+支持返回类型为子类类型:
class Animal {
public Animal getInstance() { return new Animal(); }
}
class Dog extends Animal {
@Override
public Dog getInstance() { return new Dog(); } // 返回类型为Dog
}
异常处理规则
- 重写方法不能抛出比父类方法更宽泛的受检异常(如父类抛出
IOException,子类不能抛出Exception)。 - 非受检异常(
RuntimeException)无此限制。
静态方法不能被重写
若父类方法为static,子类同名方法实际为隐藏(Hide),而非重写。调用时取决于引用类型:

class Parent {
static void show() { System.out.println("Parent"); }
}
class Child extends Parent {
static void show() { System.out.println("Child"); }
}
Parent obj = new Child();
obj.show(); // 输出 "Parent",因为静态方法绑定到类而非实例






