创建了Animal父类,并且创建Dog和Cat两个子类继承Animal父类,子类中分别重写了eat()与shout()方法
创建父类Animal类,提供eat()与shout()方法:
public class Animal{
public void eat(){
System.out.println("动物:进食");
}
public void shout(){
System.out.println("动物:叫");
}
}
创建Dog子类,继承父类Animal类,并重写eat()与shout()方法:
public class Dog extends Animal{
public void eat(){
System.out.println("狗吃骨头");
}
public void shout(){
System.out.println("汪!汪!汪!");
}
}
创建Cat子类,继承父类Animal类,并重写eat()与shout()方法:
public class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
public void shout(){
System.out.println("喵!喵!喵!");
}
}
创建测试类:
public class AnimalTest {
public static void main(String[] args) {
AnimalTest test = new AnimalTest();
test.func(new Dog()); //调用Dog对象引用数据类型
test.func(new Cat()); //调用Cat对象引用数据类型
}
public void func(Animal animal){
animal.eat();
animal.shout();
}
public void func(Dog dog){ //重载func()方法
dog.eat();
dog.shout();
}
public void func(Cat cat){ //重载func()方法
cat.eat();
cat.shout();
}
}
可以发现虽然Dog类与Cat类继承了Animal类,在编写测试类时,如果要实现Dog类中的方法,需要在func()传入Dog对象引用数组,然后再通过main()里边的对象调用到Dog类中方法,从而实现Dog类中的方法。只有Dog类与Cat类数量不多能操作,若是类到达一定数目,则代码冗余量巨大,多一个类就需要多写一个func()重载方法,极其繁琐。
于是可以引入多态的思想:
public class AnimalTest {
public static void main(String[] args) {
AnimalTest test = new AnimalTest();
test.func(new Dog());
test.func(new Cat());
}
public void func(Animal animal){//Animal animal = new Dog();
animal.eat();
animal.shout();
}
}
利用多态性,func方法形参可以直接传入Dog与Cat对象引用数据类型,当使用test.func(new Dog())时,相当于写了Animal animal = new Dog(),可以省去诸多重载方法。
同样是使用多态性,可以发现有的在方法里边又将animal强转为Cat类型,原因是若让父类animal对象去调用run()方法,发现会报错,因为run()方法是Cat类中特有的方法,父类Animal中没有,此时必须通过Animal向下转型成Cat子类对象后,才可以使用子类中特有的方法。通俗讲就是,子类中特有的方法,父类是没法调用的,要想通过多态传进的父类对象能调用子类方法,就必须向下转型为子类对象再去调用。
public class AnimalTest {
public static void main(String[] args) {
AnimalTest Cattest = new AnimalTest();
Cattest.func(new Cat());
}
public void func(Animal animal){//Animal animal = new Cat();
Cat cat = (Cat)animal;
cat.run();
}
}
Cat类中新增了特有方法run()方法:
public class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
public void shout(){
System.out.println("喵!喵!喵!");
}
public void run(){
System.out.println("猫在跑步");
}
}