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()"); } }