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()

解决方案 »

  1.   

    应该是调用父类方法 方法前面加final 吧
      

  2.   

    LZ看错了吧,书上第269WithFinals ,OverridingPrivate 类中g()都是pirvate的,作者想说明的是private方法肯定是final的。我的书是:<Think in Java Third Edition>,英文版,机械工业出版社 ISBN 7-111-13165-7/TP.2951
      

  3.   

    楼上的  这个了解  我就是想实现op.g()函数输出结果为OverridingPrivate.g()
    就是如何实现多态
      

  4.   

    请问怎么重载啊??让它输出OverridingPrivate.g()
     我想如果你让OverridingPrivate2输出OverridingPrivate的东西,那Java的多态就出问题了 
    你对多态好像还没完全明白 ,要不就是我还没完全明白,如果你是从C++转过来的,要把习惯改变一下.
      

  5.   

    你在程序里写的是上转,子类的对象直接转成父类,调用的时候还是调用子类的方法,输出的自然是子类的结果.实现多态应该是比较父类的对象和子类对象输出的结果,也就是说你应该直接创建一个OverridingPrivate的实例,然后看它的输出结果
      

  6.   

    请问怎么重载啊??让它输出OverridingPrivate.g()
     我想如果你让OverridingPrivate2输出OverridingPrivate的东西,那Java的多态就出问题了 
    你对多态好像还没完全明白 ,要不就是我还没完全明白,如果你是从C++转过来的,要把习惯改变一下.     OverridingPrivate op = op2;
        // But you can't call the methods:
        //! op.f();
        op.g();//怎么不能重载g()函数.
    我这里的op是OverridingPrivate类型 怎么不能输出OverridingPrivate类型的g函数  我是先学过C++的..
      

  7.   

    你的op是OverridingPrivate2的一个实例,而在程序里面要把它当成OverridingPrivate的实例来调用,所以调用的是OverridingPrivate2里面定义的方法.举个不是很恰当的例子,我有一个苹果,要把它当成水果来使,那么我要给它去皮的时候用的自然是苹果的去皮方法,而不是水果的,因为水果的去皮方法不会与苹果一样.同样的道理你想让op输出你所期望的结果应该是直接new出来,OverridingPrivate op = op2;所做的事情就是把苹果当成水果了
      

  8.   

    呵呵  果然是C++ 过来的  好好想想C++的多态如何实现 有语言要求的 ,估计你C++的多态就没理解好,当初我就是
      

  9.   

    楼上的  这个了解  我就是想实现op.g()函数输出结果为OverridingPrivate.g()
    就是如何实现多态
    -----
    必须要OverridingPrivate 的构造函数来创建对象
      

  10.   

    假设你的OverridingPrivate中 g()的方法是abstract的,你会怎么想 ?你 一个男生 穿衣服的行为是男装
    人 穿衣的行为是:找点东西罩着自己,楼出头 至于什么东西,随便(当然越适合自己越好, 千万别是连衣裙)你使用向上转型 从男生成为了一个人, 现在你穿衣难道真的就随便找点东西么? 简单说下多态的目的,还是这个比方:假设你班上有个 女生,和你一同参加一项活动, 之前需要打扮一下, 你两都花了一个小时的时间打扮, 但在穿衣这一行为上的结果绝对是不同的,否则就出笑话了 ,这就是多态, 让你和哪个女生都有一个方法: clothesing()  但你们的实现方式都不一样,但活动组织者不考虑这些,就让你们执行你们各自的clothesing(), 这对活动组织者很方便 ,同时结果和大家希望的一致 如果还理解不了 ,那你看完第七章再说吧 实在不行看看第八章的
      

  11.   

    首先我想说明一下,楼主的方式应该叫子类覆盖。
    只有类(static)方法或私有(private)方法才不会被子类覆盖,但是私有方法是不能被外部访问的。
    要实现楼主要求的只有类方法才行。子类覆盖的方法在运行时,子类实例不管被赋值给哪一级的父类对象,都会调用子类覆盖实现的逻辑。这就是继承多态性。
      

  12.   

    OverridingPrivate op = op2;已经把op2指向的对象赋给op了
    这时op虽然OverridingPrivate类型,但是用的是op2的类来实现的。
      

  13.   

    OverridingPrivate2 op2 = new OverridingPrivate2();
        op2.f();
        op2.g();
        // You can upcast:
        OverridingPrivate op = op2;
    虽然你把op2 向上转型到 OverridingPrivate 但在JAVA中op2实际指向的还是OverridingPrivate2
      

  14.   

    难道你没觉得Thinking in java写偏了
      

  15.   

    OverridingPrivate2 op2 = new OverridingPrivate2();
        op2.f();
        op2.g();
        // You can upcast:
        OverridingPrivate op = op2;
    这里OP其实还是OverridingPrivate2的对象空间,可参考多态性