您的位置:首页 > 编程语言 > Java开发

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

2012-07-05 17:26 344 查看
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()");
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: