在Java中,我们经常会使用到方法的覆盖和重写,这两个概念非常相似,但却有一些本质的区别。
对于方法的覆盖,指的是在子类中重新定义父类中已经存在的同名方法。在子类对象调用该方法时,会优先执行子类中的该方法,而不是父类中的。这种行为也被称为覆盖或重载。
class Animal {
public void move() {
System.out.println("动物可以移动");
}
}
class Dog extends Animal {
public void move() {
System.out.println("狗可以跑和走");
}
}
public class TestDog {
public static void main(String args[]) {
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象
a.move(); // 执行 Animal 类的方法
b.move(); // 执行 Dog 类的方法
}
}运行以上程序,输出结果如下:
动物可以移动 狗可以跑和走
可以看到,虽然 Animal 对象和 Dog 对象都调用了 move() 方法,但是输出结果是不同的。这是因为通过 b.move() 调用的是子类 Dog 中的 move() 方法,而不是父类 Animal 中的 move() 方法。
而对于方法的重写,则指的是在子类中重新编写一个与父类方法名称、参数列表和返回类型均相同的方法。子类中的该方法具有所谓的多态性,因为该方法可以被用来替代其父类中的方法。这种行为也被称为覆写。
class Shape {
void draw(){
System.out.println("绘制形状");
}
}
class Rectangle extends Shape{
void draw(){
System.out.println("绘制矩形");
}
}
class Circle extends Shape{
void draw(){
System.out.println("绘制圆形");
}
}
public class TestShape{
public static void main(String args[]) {
Shape a = new Rectangle(); // 矩形
Shape b = new Circle(); // 圆形
a.draw(); // 执行的是 Rectangle 的 draw 方法
b.draw(); // 执行的是 Circle 的 draw 方法
}
}运行以上程序,输出结果如下:
绘制矩形 绘制圆形
可以看到,Shape 对象和其子类对象均调用了 draw() 方法,但是每个子类都以自己的方式实现了该方法,所以输出结果不同。
综上所述,方法的覆盖是指同名方法在子类中重新定义,优先执行子类中的方法;而方法的重写则是指子类中重新编写一个与父类方法名称、参数列表和返回类型均相同的方法,具有多态性。