下面的代码定义了一个Person类,在该类中给出同名不同参的feed方法。但是,假如参数为类类型,并且数量非常的大,那么这样的代码就显得臃肿,多态应运而生。

class Person{
	void feed(Cat c){
		c.eat();
	}
	void feed(Dog d){
		d.eat();
	}	
	//.....
}


class Cat{
	public void eat(){
		System.out.println("miao miao miao~");
	}

}

class Dog {
		public void eat(){
			System.out.println("wang wang wang~");
		}
}

class DuoTaiDemo2{
	public static void main(String[] args){
		Person p = new Person();
		p.feed(new Cat());
		p.feed(new Dog());
	}
}

使用多态后的代码:

class Person{
/* void feed(Cat c){ c.eat(); } void feed(Dog d){ d.eat(); } */
	void feed(Animal a){//Animal a = new Cat();
		a.eat();
		if(a instanceof Cat)
		{//还可以访问子类特有属性
			Cat c=(Cat)a;
			c.catchMouse();//向下转型,调用小猫抓老鼠
		}
	}
}

abstract class Animal{
//抽取出一般类的父类
	abstract void eat();
	
}

class Cat extends Animal{
	public void eat(){
		System.out.println("miao miao miao~");
	}
	public void catchMouse()
	{//小猫独有的抓老鼠属性~~
		System.out.println("miao miao miao~");
	}	

}

class Dog extends Animal{
		public void eat(){
			System.out.println("wang wang wang~");
		}
}

class DuoTaiDemo2{
	public static void main(String[] args){
/* Person p = new Person(); p.feed(new Cat()); p.feed(new Dog()); } */
		Person p = new Person();
		p.feed(new Cat());
		p.feed(new Dog());		
}
}