/*
 * 多态
 * 1、多态是方法的多态,属性没有多态
 * 2、写程序的时候,想要调用运行时类型的方法,只能进行强制转换,否则无法通过编译器的检查
 * 3、两个没有关联的类进行转换,会报“ClassCastException”
 * 4、多态存在的三个必要条件:继承、方法重写、父类应用指向子类对象
 */

package py.sxt.com;

public class OOP_4_22_04_duotai {
	public static void main(String[] args) {
		//向上自动转型
		Animal ani = new Dog();
		//属性调用的时候,任然是父类的属性,属性没有多态
		System.out.println(ani.age);
		
		//运行时看对象,即父类引用指向子类对象
		animalCry(ani);
		
		//要调用对象的属性,就需要进行强制类型转化
		Dog dog = (Dog) ani;
		System.out.println(dog.age);
		
		System.out.println(dog instanceof Animal);
		System.out.println(ani instanceof Cat);
		System.out.println(ani instanceof Dog);
	}
	
	static void animalCry(Animal a) {
		a.shout();
	}
}

class Animal {
	int age = 10;

	public void shout () {
		System.out.println("叫了一声。。");
	}
}

class Dog extends Animal {
	int age = 28;

	@Override
	public void shout() {
		// TODO Auto-generated method stub
		System.out.println("汪汪汪。。。");
	}
	
	public void gnawBone () {
		System.out.println("我在肯肉骨头。。");
	}
}

class Cat extends Animal {
	int age = 18;
	
	@Override
	public void shout () {
		System.out.println("喵喵喵喵!");
	}
}