覆盖是指父子类之间的关系,当子类继承父类中所有可能被子类访问的成员方法时,如果子类的方法名与父类的方法名相同,那么子类就不能继承父类的方法,此时称为子类的方法覆盖了父类的方法。覆盖体现了子类补充或者改变父类方法的能力,通过覆盖,可以使一个方法在不同的子类中表现出不同的行为。
下面通过一个具体的实例介绍如何实现方法的覆盖。
本实例主要实现定义一个动物类Animal及它的子类Bird,具体步骤如下:
(1)创建一个名称为Animal的类,在该类中声明一个成员方法cry(),具体代码如下:
public class Animal{
public Animal(){}
public void cry(){
System.out.println("动物发出叫声!");
}
}
(2)创建一个Animal类的子类Dog类,在该类中覆盖了父类的成员方法cry(),具体代码如下:
public class Dog extends Animal{
public Dog(){}
public void cry(){
System.out.println("狗发出汪汪的叫声!");
}
}
(3)创建一个Animal类的子类Cat类,在该类中覆盖了父类的成员方法cry(),具体代码如下:
public class Cat extends Animal{
public Cat(){}
public void cry(){
System.out.println("猫发出喵喵的叫音!");
}
}
(4)创建一个Animal类的子类Cattle类,在该类中不定义任何方法,具体代码如下:
public class Cattle extends Animal{}
(5)创建一个名称为Zoo的类,在该类的main() 方法中创建子类Bird的对象并为该对象分配内存,然后对象调用该类的成员方法,具体代码如下:
public class Zoo{
public static void main(String args[]){
Dog dog = new Dog();
System.out.println("执行dog.cry();语句时的输出结果:");
dog.cry();
Cat cat = new Cat();
System.out.println("执行cat.cry();语句时的输出结果:");
cat.cry();
Cattle cattle = new Cattle();
System.out.println("执行cattle.cry();语句时的输出结果:");
cattle.cry();
}
}
(6)运行本实例的结果如下:
[color=blue]执行dog.cry();语句时的输出结果:
狗发出汪汪的叫声!
执行cat.cry();语句时的输出结果:
猫发出喵喵的叫音!
执行cattle.cry();语句时的输出结果:
动物发出叫声![/color]
从上面的运行结果中可以看出,由于Dog类和Cat类都重载了父类的方法cry(),因此执行的是子类中的cry()方法,因为Cattle类没有重载父类的方法,所以执行的是父类中的cry()方法。
注意:
在进行方法覆盖时,需要注意一下内容:
●子类不能覆盖父类中声明为final或者static的方法。
●子类必须覆盖父类中声明为abstract的方法,或者子类也应该声明为abstract。
●子类覆盖父类中的同名方法时,子类的方法声明也必须和父类中被覆盖的方法声明一样。