OverridingPrivate op = op2 是向上转型, keen1982(keen)说的是对的,但是怎么解释op去调用了OverridingPrivate 的private final void f() 呢 应该动态绑定于OverridingPrivate2 即应该调用 OverridingPrivate2 中的 public final void f(),但是执行结果偏偏就不是这样啊,谁能来解释这个问题啊:(
to mlovex(史吹真悟) OverridingPrivate op = op2;中op = op2表名op为OverridingPrivate2类型,由OverridingPrivate op将op转型为OverridingPrivate,那既然op已经是OverridingPrivate型别,这个时候op为什么不能调用OverridingPrivate中的私有方法呢?也就是说转型后的op 它到底是什么?
这么说可能有些不直接建议你去试试 随便写一个类A 在写一个私有方法a () 然后再换个地方(别在A中就行) new 一个A类型的事例 然后调用a()方法 看看啥效果~~
OverridingPrivate op = op2; op 是一个指向OverridingPrivate的引用,实质对象为OverridingPrivate2的对象。 动态型别判定机制必须要保证程序在编译期的正确性。 op.f()在编译期肯定就出错了,因为它看起来要调用的一定是OverridingPrivate的f()
私有函数是无法继承(和重写的!)
只属于父类里的方法!protected 以及public的函数才可以继承(和重写)!
所以不必用private!
OverridingPrivate op = op2 和WithFinals wf = op2; ; 这句话op 和 wf 是向上转型还是向下转型!!!!!
OverridingPrivate2 是从OverridingPrivate继承过来的,拥有OverridingPrivate的所有方法,通俗就是OverridingPrivate2只可能比OverridingPrivate大,不可能小!!!
是不是这样啊??????我的看法,也许是错!!!!!
OverridingPrivate2 中的 public final void f(),但是执行结果偏偏就不是这样啊,谁能来解释这个问题啊:(
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; 这两句根本不合理的!!!!!也可以是没有意义的!!!把多态观念都抛开,你父类的能调用子类中的方法马?
//!op.f(); ----------------------------------- 行1
//! op.g();
调用的都是父类的方法 但是因为是private的 没调用权限 所以报错
OverridingPrivate op = op2;中op = op2表名op为OverridingPrivate2类型,由OverridingPrivate op将op转型为OverridingPrivate,那既然op已经是OverridingPrivate型别,这个时候op为什么不能调用OverridingPrivate中的私有方法呢?也就是说转型后的op 它到底是什么?
难道你的理解 是 所有OverridingPrivate类型的实例 都能调用OverridingPrivate类中的私有方法???这就是你对private的理解 ?
op 是一个指向OverridingPrivate的引用,实质对象为OverridingPrivate2的对象。
动态型别判定机制必须要保证程序在编译期的正确性。
op.f()在编译期肯定就出错了,因为它看起来要调用的一定是OverridingPrivate的f()
这样的话,执行该方法其实跟运行时型别判定没有什么关系的。
因为父类根本就没有整个方法,当然编译期就wrong了
因为多态是在继承重写才有它的价值(即动态绑定),所以没有继承重写也就没有多态,理解一点了吧:)
跟多态没关系 父类的那个方法是 final 而且private的 子类根本不能继承 更谈不上重写所以
//!op.f(); ----------------------------------- 行1
//! op.g();
调用的都是父类的方法 但是因为是private的 没调用权限 所以报错OverridingPrivate op = op2;
op 是一个指向OverridingPrivate的引用,实质对象为OverridingPrivate2的对象。
动态型别判定机制必须要保证程序在编译期的正确性。
op.f()在编译期肯定就出错了,因为它看起来要调用的一定是OverridingPrivate的f()况且,父类中为final或者private的方法,在之类中覆写同样的方法,其实相当于添加了新方法。
这样的话,执行该方法其实跟运行时型别判定没有什么关系的。
因为父类根本就没有整个方法,当然编译期就wrong了 mlovex(史吹真悟) ( ) : dropship(飞翔) ( ) 信誉:115 他俩的是正解!