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;所做的事情就是把苹果当成水果了
------解决方案--------------------