为什么要使用多态性,以及对多态的浅层次理解

创建了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("猫在跑步");
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值