当父类型引用指向子类型对象会导致程序存在编译阶段绑定和运行阶段绑定两个不同的状态,这种机制可以成为多态机制. 向上转型:子类型-->父类型,又称为自动类型转换. 向下转型:父类型-->子类型,又称为强制类型转换.


//Animal.java
package qw;
public class Animal {
	public void move()
	{
		System.out.println("动物在移动");
	}
	public void eat() {
		System.out.println("动物在吃");
	}
}

//Bird.java
package qw;
public class Bird extends Animal{
	public void fly()
	{
		System.out.println("小鸟在飞");
	}
	public void eat() {
		System.out.println("小鸟在吃东西");
	}
}

//Cat.java
package qw;
public class Cat extends Animal{

	public void move()
	{
		System.out.println("猫在移动");
	}
	public void catchMouse()
	{
		System.out.println("猫在捉老鼠");
	}
}

//Test.java
package qw;
public class Test {
	public static void main(String[] args) {
		Animal a1 = new Animal();
		a1.move();
		
		//向上转型(子对象向父对象转型),a2使用的是继承的方法,可使用方法覆盖父类继承下来的方法.
		//1,编译阶段编译器检查a2这个引用的数据类型为Animal,由于Animal.class字节码当中有move()方法
		//所以编译通过了,这个阶段成为静态绑定
		//2,在程序运行阶段,由于JVM堆内存真实存在的对象是Cat对象,所以一定调用的是Cat对象的move()方法,这个过程
		//称为动态绑定
		//3.无论Cat类有没有重写方法,运行阶段调用的一定是Cat类的move()方法,因为JVM堆内存中真实存在的对象是Cat对象.
		Animal a2 = new Cat();
		a2.move();
		a2.eat();
		
		//如果想访问子对象特有的方法,需强制换成子对象,即向下转型(父对象向子对象转型)
		if(a2 instanceof Cat) {
			Cat a3 = (Cat)a2;
			a3.catchMouse();
		}
		else {
			Bird a3 = (Bird) a2;
			a3.fly();
		}
	}
}

运行结果:

特点:无论是向上转型还是向下转型,两种类型之间一定要有继承关系,且具有面向抽象编程的特性,. 多态作用:降低程序的耦合度,提高程序的拓展力.