我理解java的多态

本文通过定义Animal基类及Dog、Cat派生类演示了Java中的多态性。具体介绍了如何通过向上转型和向下转型实现多态行为,以及如何在不了解具体对象类型的情况下,通过条件判断调用正确的对象方法。

/*
 * 父类Animal,定义了三个方法,
 * 其中eat(),scream()是等着
 * 被子类重写的,animalFun()
 * 是Animal自身的方法
 */
class Animal {
	public void eat() {
		System.out.println("我们吃各种各样的食物");
	}
	
	public void scream() {
		System.out.println("我们不会说人类的语言");
	}
	
	public void animalFun() {
		System.out.println("属于动物自已的方法");
	}
	
}	
/*
 * 定义Dog类,继承Animal类,重写父类中的
 * eat(),scream()方法,并有自已的dogFun()
 * 方法
 */
class Dog extends Animal {
	public Dog() {
		System.out.println("=============创建一个狗的对象=================");
	}
	
	@override
	public void eat() {
		System.out.println("狗喜欢骨头");
	}
	
	@override
	public void scream() {
		System.out.println("汪汪汪");
	}
	
	public void dogFun() {
		System.out.println("属于狗自已的方法");
	}
}
/*
 * 定义一个猫类和狗类一样
 */
class Cat extends Animal {
	public Cat() {
		System.out.println("=============创建一个猫的对象=================");
	}
	
	@override
	public void eat() {
		System.out.println("猫喜欢吃鱼");
	}
	
	@override
	public void scream() {
		System.out.println("喵喵喵");
	}
	
	public void catFun() {
		System.out.println("属于猫自已的方法");
	}
}

public class PolTest {
	public static void main(String[] args) {
		fun(new Cat());
		fun(new Dog());
				
	}
	
	/*
	 *=============创建一个狗的对象=================
	 * 狗喜欢骨头
	 * 汪汪汪
	 * 属于动物自已的方法
	 */
	public static void testUpCast() {
		//向上转型,把Dog当Animal用,只能调用Dog类中被重写了的方法
		Animal animal = new Dog();
		//调用的都是被重写的方法
		animal.eat();
		animal.scream();
		//可以调用Animal类本身的方法,无法调用Dog自身的方法
		animal.animalFun();
	}
	
	/*
	 * =============创建一个猫的对象=================
	 * 猫喜欢吃鱼
	 * 喵喵喵
	 * 属于猫自已的方法
	 * 属于动物自已的方法
	 */
	public static void testDownCast() {
		//向下转型前,必须有向上转型
		Animal animal = new Cat();
		//把Animal当Cat用,Cat又是继承于Animal,所以可以调用所有的方法
		//包括继承于父类的animalFun()方法
		Cat cat = (Cat)animal;
		cat.eat();
		cat.scream();
		cat.catFun();
		cat.animalFun();
	}
	
	/*
	 * 多态的一种应用,很多时候我们不知道传来的对象是什么,但是都是继承
	 * 于某一个父类,根据传入对象的不同,动态的执行相应的方法
	 * fun(new Cat());fun(new Dog());执行结果
	 * =============创建一个猫的对象=================
	 * 猫喜欢吃鱼
	 * 喵喵喵
	 * 属于猫自已的方法
	 * =============创建一个狗的对象=================
	 * 狗喜欢骨头
	 * 汪汪汪
	 * 属于狗自已的方法
	 */
	public static void fun(Animal animal) {
		animal.eat();
		animal.scream();
		//判断传入的是属于哪个对象的实例
		//执行属于自已的方法
		if(animal instanceof Dog) {
			Dog dog = (Dog)animal;
			dog.dogFun();
		}
		
		if(animal instanceof Cat) {
			Cat cat = (Cat)animal;
			cat.catFun();
		}
		
	}
}
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值