淘先锋技术网

首页 1 2 3 4 5 6 7

在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() 方法,但是每个子类都以自己的方式实现了该方法,所以输出结果不同。

综上所述,方法的覆盖是指同名方法在子类中重新定义,优先执行子类中的方法;而方法的重写则是指子类中重新编写一个与父类方法名称、参数列表和返回类型均相同的方法,具有多态性。