java方法如何重写
Java方法重写的基本概念
方法重写(Override)是面向对象编程中多态性的重要体现,指子类重新定义父类中已有的方法。重写的方法必须与被重写方法具有相同的方法签名(名称、参数列表)和返回类型。
方法重写的规则
子类重写父类方法时需遵循以下规则:
- 方法名、参数列表必须完全相同
- 返回类型可以是父类方法返回类型的子类(协变返回类型)
- 访问修饰符不能比父类更严格(public > protected > default > private)
- 不能抛出比父类方法更宽泛的检查型异常
class Animal {
public void move() {
System.out.println("动物可以移动");
}
}
class Dog extends Animal {
@Override
public void move() {
System.out.println("狗可以跑和走");
}
}
@Override注解的作用
使用@Override注解可以显式声明方法重写,编译器会检查该方法是否确实重写了父类方法。如果不符合重写规则,编译器会报错。
class Cat extends Animal {
@Override // 明确表示这是重写方法
public void move() {
System.out.println("猫会跳");
}
}
不能重写的情况
以下情况不能实现方法重写:
- 父类中声明为final的方法
- 父类中声明为static的方法(实际是隐藏而非重写)
- 父类的私有方法(private修饰)
重写与重载的区别
方法重写与方法重载(Overload)不同:
- 重写发生在继承关系中,要求方法签名相同
- 重载发生在同一类中,要求方法名相同但参数列表不同
- 重写是多态的表现,重载是编译时多态
class Calculator {
// 方法重载示例
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }
}
动态绑定机制
Java通过动态绑定实现方法重写的多态特性。在运行时,JVM会根据实际对象的类型调用相应的方法实现,而非引用变量的类型。
Animal myDog = new Dog();
myDog.move(); // 输出"狗可以跑和走",而非父类方法
协变返回类型
Java5开始支持重写方法的返回类型可以是父类方法返回类型的子类,这称为协变返回类型。

class Fruit {}
class Apple extends Fruit {}
class Basket {
Fruit getFruit() { return new Fruit(); }
}
class AppleBasket extends Basket {
@Override
Apple getFruit() { return new Apple(); }
}






