《java入门第一季》之面向对象(多态练习)

接下来经过一个例子,对多态问题加深印象:

猫狗案例。

/*
	多态练习:猫狗案例
*/
class Animal {
	public void eat(){
		System.out.println("吃饭");
	}
}

class Dog extends Animal {
	public void eat() {
		System.out.println("狗吃肉");
	}
	
	public void lookDoor() {
		System.out.println("狗看门");
	}
}

class Cat extends Animal {
	public void eat() {
		System.out.println("猫吃鱼");
	}
	
	public void playGame() {
		System.out.println("猫捉迷藏");
	}
}

class DuoTaiTest {
	public static void main(String[] args) {
		//定义为狗
		Animal a = new Dog();
		System.out.println(a);////Dog@1db9742
		a.eat();//狗吃肉
		System.out.println("--------------");
		//还原成狗
		Dog d = (Dog)a;//向下转型
		System.out.println(a);//Dog@1db9742
		System.out.println(d);//Dog@1db9742
		d.eat();//狗吃肉
		d.lookDoor();
		System.out.println("--------------");
		//变成猫
		a = new Cat();
		System.out.println(a);//重新分配地址,重新开辟内存空间Cat@106d69c
		d.eat();//狗的对象并没有发生变化。
		a.eat();
		System.out.println("--------------");
		//还原成猫
		Cat c = (Cat)a;
		System.out.println(a);//Cat@106d69c
		System.out.println(c);//Cat@106d69c
		c.eat();
		c.playGame();
		System.out.println("--------------");
		
		//演示错误的内容
		//Dog dd = new Animal();//动物是狗!错误!错误
		//Dog ddd = new Cat();//猫是狗!错误
		//ClassCastException
		//Dog dd = (Dog)a;//a已经属于猫了,不能强制把猫转换成狗
		a = new Dog();//可以重新分配内存空间,此时已经不再是以前的地址了,不是Dog@1db9742
		System.out.println(a);//再一次分配了新的内存空间Dog@52e922
	}
}	

//额外发现多态还有一个好处,定义一次引用类的变量a可以一直使用。

相信多态是什么,以及多态的使用方式一目了然。有问题在下面一起讨论。

原文地址:https://www.cnblogs.com/wanghang/p/6299856.html