我们先来看个例子:

public class Polymorphism  extends BaseClass{

	    public String book="轻量级j2ee教程";
	    
	    public void sub()
	    {
	    	System.out.println("子类的普通方法");
	    }
	    public void  test()
	    {
	    	System.out.println("子类覆盖父类的方法!");
	    }
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BaseClass base=new  BaseClass();
		System.out.println(base.book);
		base.test();
		base.base();
		
		Polymorphism subclass=new Polymorphism();
		System.out.println(subclass.book);
		subclass.test();
		subclass.sub();
		
		//test是上转型对象
		BaseClass test=new Polymorphism();

		//通过引用类型访问变量,只会访问到编译时类型定义的变量,而不会访问执行时定义的变量
		System.out.println(test.book);
		
		/**
		 * test对象的引用类型是BaseClass 但是执行类型是Polymorphism
		 * 编译阶段只能调用其编译类型所具备的方法,但是运行时则执行它运行时类型所具有的方法
		 */
		
		test.base();   //子类没有对应的方法(实际上子类已经继承了父类的base方法),直接调用父类的base方法
		test.test();   //子类有覆盖父类的test方法,执行时,直接调用子类的test方法
	}
}
class BaseClass
{
    public int book=6;
    public void base()
    {
    	System.out.println("父类的普通方法");
    }
    public void  test()
    {
    	System.out.println("父类被覆盖的方法!");
    }
}

执行结果:
6
父类被覆盖的方法!
父类的普通方法
轻量级j2ee教程
子类覆盖父类的方法!
子类的普通方法
6
父类的普通方法
子类覆盖父类的方法!

 从上面的例子可以看出:

对于上转型对象test这个引用类型而言:存在两种类型情况(1,编译时类型   2,运行时类型)

诚然:在编译时,test是BaseClass类型,但是在运行时test是Polymorphism 类型。

对于这种上转型变量而言:在编译的过程中,他只会调用BaseClass中的方法,但是运行时,他会调用Polymorphism 中的方法(包括从父类继承的方法)!

这种上转型,也是多态中的一种!

啥叫多态??

相同类型的变量,调用同意方法时呈现出不同的行为特征,这就会多态(最经常接触的就是:统一方法名,对应不同的参数个数或者参数类型)