think in java 第8章 多态

package think.in.exercise10;

/**
 * 								第8章 多态
 * @author Administrator
 *	输出结果表明 :
 *	Sub的对象,发生向上转型后,调用fistMethod()时,调用的是基类的fistMethod()方法。因为
 *	Sub类没有这个方法.在基类中的fistMethod()方法中,调用secondMethod()方法时又调用了
 *	子类Sub中的secondMethod()方法,而不是基类中的secondMethod()方法.
 *	结论:
 *		子类对象在发生向上转型后,该对象调用的方法,在子类中不存在,则调用基类的。
 *		若该方法存在于子类中,则调用子类的。
 *	动手:
 *		假设,子类对象没发生向上转型,下面执行的结果与向上转型执行的结果一样么?
 *		为什么?
 *		原因是:基类的方法firstMethod()是public的,子类在继承基类时,自动继承了该方法
 *		假如,基类firstMethod()方法是private的,则语法上就通不过.
 *		更奇妙的时,在基类中的firstMethod()方法中调用的secondMethod(),却是子类自己的方法
 *		而不是基类的secondMethod()方法.这与向上转型的调用是一致的。
 *	结论:
 *		无论是否发生向上转型,对复写方法的调用,都是多态调用;即调用对象自己的方法.
 *		这也是继承所要的结果,也是程序编写人员的意图。
 *
 *	提问:
 *		什么样的方法可以复写,什么样的方法不可复写,什么样的方法不存在复写		
 *		public, protected, 默认权限方法,可以复写
 *		final 方法不可以复写
 *		静态方法,private方法不存在复写
 */

class Base {
	public void firstMethod()
	{
		System.out.println("this is base.firstMethod()!");
		secondMethod();
	}
	public void secondMethod()
	{
		System.out.println("this is base.SecondMethond()!");
	}
}

class Sub extends Base {
	
	public void secondMethod()
	{
		System.out.println("this is Sub.SecondMethond()!");
	}
}

public class test {
	public static void main(String[]  args)
	{
		//向上转型 
		Base upCast = new Sub();
		upCast.firstMethod();
		//不向上转型
		Sub noCast = new Sub();
		noCast.firstMethod();
		
		/**
		 * 从复写(也叫复盖,复写)与多态
		 * 	首先: final修饰的方法不能复写
		 * 		即超类的方法用,final修饰后,在子类去复写它会编译会提示语法错误.
		 * 	其次: static或者private 修饰的方法,不存在复写
		 * 		即超类的方法用static或者private修饰的方法,在子类中可以存在与超类方法签名一样的方法
		 * 		但它们是只属于各自所在的类,而没有复写关系.
		 * 		并且,private方法,只能类的内部调用,对外部对象是隐藏的,也就不可能发生多态
		 *  最后:public或protected,或默认的包访问权限,修饰的方法(即普通方法)才能发生复写
		 * 		也就是说没有使用:final,static,private修饰的方法
		 * 		
		 *  多态:包括两个方面,即多种形态,和多个状态。前者是静止的,后者是动态的
		 * 		复写,导致代码的形式上的多态。
		 * 		运行时,根据条件的不同,产生状态上的多态,也即后期邦定。这里的条件是指那个类new出的对象
		 */
		
		System.out.println("====================================");
				
		SuperClass testObj = new SubClass();		
		testObj.StaticMethod();// 提示警告,表示用类来调用该方法,而不要用对象
		//testObj.privateMethod();//去掉这个注释提示编译错误
		
		testObj.defaultMethod();
		testObj.protectedMethod();
		testObj.publicMethod();
		
		/**
		 * 展示JAVA复写的缺陷(陷井)
		 * 
		 */
				
	}			
}


//======================================================================================
class SuperClass{
	final void  FinalMethod()
	{
		
	}
	public static void StaticMethod()
	{
		System.out.println("SuperClass.StaticMethod()");
	}
	private void privateMethod()
	{
		System.out.println("SuperClass.privateMethod()");
	}
	
	
	void defaultMethod()
	{
		System.out.println("SuperClass.defaultMethod()");
	}
	public void publicMethod()
	{
		System.out.println("SuperClass.publicMethod()");
	}
	protected void protectedMethod()
	{
		System.out.println("SuperClass.protectedMethod()");
	}
}
class SubClass extends SuperClass{
//提示不能复写超类的,final方法	
//	final void  FinalMethod()
//	{
//		
//	}
	public static void StaticMethod()
	{
		System.out.println("SubClass.StaticMethod()");
	}
	private void privateMethod()
	{
		System.out.println("SubClass.privateMethod()");
	}
	void defaultMethod()
	{
		System.out.println("SubClass.defaultMethod()");
	}
	public void publicMethod()
	{
		System.out.println("SubClass.publicMethod()");
	}
	protected void protectedMethod()
	{
		System.out.println("SubClass.protectedMethod()");
	}
}

  

posted on 2012-07-05 14:56  EarlyBird  阅读(316)  评论(0)    收藏  举报

导航