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()
// 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()
就是如何实现多态
我想如果你让OverridingPrivate2输出OverridingPrivate的东西,那Java的多态就出问题了
你对多态好像还没完全明白 ,要不就是我还没完全明白,如果你是从C++转过来的,要把习惯改变一下.
我想如果你让OverridingPrivate2输出OverridingPrivate的东西,那Java的多态就出问题了
你对多态好像还没完全明白 ,要不就是我还没完全明白,如果你是从C++转过来的,要把习惯改变一下. OverridingPrivate op = op2;
// But you can't call the methods:
//! op.f();
op.g();//怎么不能重载g()函数.
我这里的op是OverridingPrivate类型 怎么不能输出OverridingPrivate类型的g函数 我是先学过C++的..
就是如何实现多态
-----
必须要OverridingPrivate 的构造函数来创建对象
人 穿衣的行为是:找点东西罩着自己,楼出头 至于什么东西,随便(当然越适合自己越好, 千万别是连衣裙)你使用向上转型 从男生成为了一个人, 现在你穿衣难道真的就随便找点东西么? 简单说下多态的目的,还是这个比方:假设你班上有个 女生,和你一同参加一项活动, 之前需要打扮一下, 你两都花了一个小时的时间打扮, 但在穿衣这一行为上的结果绝对是不同的,否则就出笑话了 ,这就是多态, 让你和哪个女生都有一个方法: clothesing() 但你们的实现方式都不一样,但活动组织者不考虑这些,就让你们执行你们各自的clothesing(), 这对活动组织者很方便 ,同时结果和大家希望的一致 如果还理解不了 ,那你看完第七章再说吧 实在不行看看第八章的
只有类(static)方法或私有(private)方法才不会被子类覆盖,但是私有方法是不能被外部访问的。
要实现楼主要求的只有类方法才行。子类覆盖的方法在运行时,子类实例不管被赋值给哪一级的父类对象,都会调用子类覆盖实现的逻辑。这就是继承多态性。
这时op虽然OverridingPrivate类型,但是用的是op2的类来实现的。
op2.f();
op2.g();
// You can upcast:
OverridingPrivate op = op2;
虽然你把op2 向上转型到 OverridingPrivate 但在JAVA中op2实际指向的还是OverridingPrivate2
op2.f();
op2.g();
// You can upcast:
OverridingPrivate op = op2;
这里OP其实还是OverridingPrivate2的对象空间,可参考多态性