think in java 第8章 多态 ------ 复盖私有方法的缺陷

package think.in.exercise10;
/**
 * 
 * @author Administrator
 *		think in java 第8章 多态
 *		复盖私有方法的缺陷
 */

public class PrivateOverride{		
	private void function()
	{
		System.out.println(" PrivateOverride.function()");				
	}

	public static void main(String[] args)
	{
		/**
		 * 陷井:
		 * 	子类方法与超类方法签名相同,超类方法是private的
		 * 	子类方法是public的 ,下面代码调用的是超类的方法,而不是子类的方法
		 * 令人担心结果:
		 * 	结果表示表明,当子类的public方法签名与超类的private方法签名相同时,
		 *  发生向上转型时,调用不到子类的public方法,而是超类的private方法
		 * 注意:
		 * 	test对象是在超类中创建的。若不是在超类中创建,则test.function();语法
		 * 	上是行不通的,因为function()方法是私有的,不能在类的外部调用.
		 *  所以那种令人担心的结果,在编译是就解决了,而不会引起运行时的混乱
		 *  
		 *  实际中,我们会经常在超类中创建子类对象吗?并让其发生向上转型吗?
		 *  一般情况应该 是,超类还没有写完,怎么可能在其中创建子类的对象呢?
		 *  除非有种可能是,修改超类引起的
		 *  
		 *  但下面的B部分多多少少还得引起注意,看下面的B部分
		 */
		PrivateOverride test = new Derived();//向上转型
		test.function();
		
		/**
		 * B部分
		 */
		BaseClass po = new DerivedClass();
		//po.proc();//这种调用方式语法上通不过,因为function()是私有的
		po.call(po);
	}
}
/**
 * 
 * @author Administrator
 *	继承上面的类
 */
class Derived extends PrivateOverride
{
	public void function()//方法签名与基类一样
	{
		System.out.println("Derived.function() ");
	}
}
/**
 * 				B部分
 * @author Administrator
 *
 */
class BaseClass {
	
	private void proc()
	{
		System.out.println("BaseClass.proc()");		
	}
	/**
	 * @param obj
	 * 	始终调用自己的私有方法,虽然proc方法和其子类方法签名一样
	 */
	public void call (BaseClass obj)
	{
		obj.proc();
	}	
}

class DerivedClass extends BaseClass{
	
	public void proc()
	{
		System.out.println("DerivedClass.proc()");		
	}
}

  

posted on 2012-07-05 17:26  EarlyBird  阅读(178)  评论(0编辑  收藏  举报

导航