日期:2014-05-20  浏览次数:20714 次

Thinking in java 第6章一个问题
class   WithFinals   {
    //   Identical   to   "private "   alone:
private   final   void   f()   {
        System.out.println( "WithFinals.f() ");
    }
    //   Also   automatically   "final ":
    public   void   g()   {
        System.out.println( "WithFinals.g() ");
    }
}

class   OverridingPrivate   extends   WithFinals   {
private   final   void   f()   {
        System.out.println( "OverridingPrivate.f() ");
    }
public   void   g()   {
        System.out.println( "OverridingPrivate.g() ");
    }
}

class   OverridingPrivate2   extends   OverridingPrivate   {
public   final   void   f()   {
        System.out.println( "OverridingPrivate2.f() ");
    }
    public   void   g()   {
        System.out.println( "OverridingPrivate2.g() ");
    }
}

public   class   FinalOverridingIllusion   {
    public   static   void   main(String[]   args)   {
        OverridingPrivate2   op2   =   new   OverridingPrivate2();
        op2.f();
        op2.g();
        //   You   can   upcast:
        OverridingPrivate   op   =   op2;
        //   But   you   can 't   call   the   methods:
        //!   op.f();
        op.g();//怎么不能重载g()函数.
        //   Same   here:
        WithFinals   wf   =   op2;
        //!   wf.f();
          wf.g();

    }
}   ///:~

我想问的是怎么重载函数啊.我的op.g()函数输出结果还是OverridingPrivate2.g()
请问怎么重载啊??让它输出OverridingPrivate.g()

------解决方案--------------------
应该是调用父类方法 方法前面加final 吧
------解决方案--------------------
LZ看错了吧,书上第269WithFinals ,OverridingPrivate 类中g()都是pirvate的,作者想说明的是private方法肯定是final的。

我的书是: <Think in Java Third Edition> ,英文版,机械工业出版社 ISBN 7-111-13165-7/TP.2951
------解决方案--------------------
请问怎么重载啊??让它输出OverridingPrivate.g()
我想如果你让OverridingPrivate2输出OverridingPrivate的东西,那Java的多态就出问题了
你对多态好像还没完全明白 ,要不就是我还没完全明白,如果你是从C++转过来的,要把习惯改变一下.
------解决方案--------------------
你在程序里写的是上转,子类的对象直接转成父类,调用的时候还是调用子类的方法,输出的自然是子类的结果.实现多态应该是比较父类的对象和子类对象输出的结果,也就是说你应该直接创建一个OverridingPrivate的实例,然后看它的输出结果
------解决方案--------------------
你的op是OverridingPrivate2的一个实例,而在程序里面要把它当成OverridingPrivate的实例来调用,所以调用的是OverridingPrivate2里面定义的方法.举个不是很恰当的例子,我有一个苹果,要把它当成水果来使,那么我要给它去皮的时候用的自然是苹果的去皮方法,而不是水果的,因为水果的去皮方法不会与苹果一样.同样的道理你想让op输出你所期望的结果应该是直接new出来,OverridingPrivate op = op2;所做的事情就是把苹果当成水果了
------解决方案--------------------