别的我没看,OverridingPrivate的f()的方法权限怎么是private。

解决方案 »

  1.   

    这是因为OverridingPrivate的f()的方法不想给OverridingPrivate2 中的复写啊
      

  2.   

    final()就可以了,private没必要。这么编译肯定会错了。编译的时候检查的还是你OverridingPrivate的权限,一看你权限是private,就不会让你通过编译了。
      

  3.   

    我是这样理解:
    私有函数是无法继承(和重写的!)
    只属于父类里的方法!protected 以及public的函数才可以继承(和重写)!
      

  4.   

    一般来说,只要用到final就可以了,final已经达到无法继承的效果!
    所以不必用private!
      

  5.   

    关键是程序没有报错,因为OverridingPrivate op = op2;中op 向上转型了
      

  6.   

    我有想法!!!
    OverridingPrivate op = op2 和WithFinals wf = op2;  ; 这句话op 和 wf 是向上转型还是向下转型!!!!!
    OverridingPrivate2 是从OverridingPrivate继承过来的,拥有OverridingPrivate的所有方法,通俗就是OverridingPrivate2只可能比OverridingPrivate大,不可能小!!!
    是不是这样啊??????我的看法,也许是错!!!!!
      

  7.   

    OverridingPrivate op = op2 是向上转型, keen1982(keen)说的是对的,但是怎么解释op去调用了OverridingPrivate 的private final void f() 呢 应该动态绑定于OverridingPrivate2 即应该调用
    OverridingPrivate2  中的  public final void f(),但是执行结果偏偏就不是这样啊,谁能来解释这个问题啊:(
      

  8.   

    方法声明为private,static,final以后编译器会认为是静态绑定,并非动态绑定,就这么简单。
      

  9.   

    to  angues1980(石头心) 你说的对啊,但是你到是说说OverridingPrivate op = op2 中的op 我们就不能调用OverridingPrivate2 中的 public final void f() 和  public void g() 方法呢??
      

  10.   

    我晕了听我说: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();    -----------------------------------   行1
        //! op.g();
        // Same here:
        WithFinals wf = op2;
        //! wf.f();
        //! wf.g();
      }
    } ///:~中OverridingPrivate op = op2;    WithFinals wf = op2;  这两句根本不合理的!!!!!也可以是没有意义的!!!把多态观念都抛开,你父类的能调用子类中的方法马?
      

  11.   

    to  keen1982(keen) 能否说详细些啊  “你父类的能调用子类中的方法马?”OverridingPrivate op = op2; 中op 是父类的话为什么不能调用自己的private final void f() 方法呢?
      

  12.   

    同意thincterii(thincterii)这个说法
      

  13.   

    跟多态没关系 父类的那个方法是 final  而且private的 子类根本不能继承 更谈不上重写所以
    //!op.f();    -----------------------------------   行1
      //! op.g();
    调用的都是父类的方法 但是因为是private的  没调用权限 所以报错
      

  14.   

    to mlovex(史吹真悟) 
    OverridingPrivate op = op2;中op = op2表名op为OverridingPrivate2类型,由OverridingPrivate op将op转型为OverridingPrivate,那既然op已经是OverridingPrivate型别,这个时候op为什么不能调用OverridingPrivate中的私有方法呢?也就是说转型后的op 它到底是什么?
      

  15.   

    我晕 ~
    难道你的理解 是  所有OverridingPrivate类型的实例 都能调用OverridingPrivate类中的私有方法???这就是你对private的理解 ?
      

  16.   

    这么说可能有些不直接建议你去试试  随便写一个类A 在写一个私有方法a ()   然后再换个地方(别在A中就行) new 一个A类型的事例 然后调用a()方法  看看啥效果~~
      

  17.   

    OverridingPrivate op = op2;
    op 是一个指向OverridingPrivate的引用,实质对象为OverridingPrivate2的对象。
    动态型别判定机制必须要保证程序在编译期的正确性。
    op.f()在编译期肯定就出错了,因为它看起来要调用的一定是OverridingPrivate的f()
      

  18.   

    况且,父类中为final或者private的方法,在之类中覆写同样的方法,其实相当于添加了新方法。
    这样的话,执行该方法其实跟运行时型别判定没有什么关系的。
    因为父类根本就没有整个方法,当然编译期就wrong了
      

  19.   

    虽然是这样声明,op和op2可以同时指向一个OverridingPrivate2对象,但是编译器永远只把op看成一个OverridingPrivate对象,所以即使你将OverridingPrivate类里面的f方法注销掉,调用op.f()也不可能调用到OverridingPrivate2类里面的f方法,是不会编译通过的。
    因为多态是在继承重写才有它的价值(即动态绑定),所以没有继承重写也就没有多态,理解一点了吧:)
      

  20.   

    帖子:
    跟多态没关系 父类的那个方法是 final  而且private的 子类根本不能继承 更谈不上重写所以
    //!op.f();    -----------------------------------   行1
      //! op.g();
    调用的都是父类的方法 但是因为是private的  没调用权限 所以报错OverridingPrivate op = op2;
    op 是一个指向OverridingPrivate的引用,实质对象为OverridingPrivate2的对象。
    动态型别判定机制必须要保证程序在编译期的正确性。
    op.f()在编译期肯定就出错了,因为它看起来要调用的一定是OverridingPrivate的f()况且,父类中为final或者private的方法,在之类中覆写同样的方法,其实相当于添加了新方法。
    这样的话,执行该方法其实跟运行时型别判定没有什么关系的。
    因为父类根本就没有整个方法,当然编译期就wrong了 mlovex(史吹真悟) ( ) : dropship(飞翔) ( ) 信誉:115 他俩的是正解!