在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() 方法,但是每个子类都以自己的方式实现了该方法,所以输出结果不同。
综上所述,方法的覆盖是指同名方法在子类中重新定义,优先执行子类中的方法;而方法的重写则是指子类中重新编写一个与父类方法名称、参数列表和返回类型均相同的方法,具有多态性。