this就是一个STChild 这样写就比较清楚了:
STChild x=this;((STParent)x).getWealth();
这时应该是STChild的getWealth()被调用(override)((STGrandParent)this).getWealth();
这时仍然应该是STChild的getWealth()被调用(override)
对于field,是“hide",所以
System.out.println(((STParent)this).wealth); 是10000.0
wealthSystem.out.println(((STGrandParent)this).wealth); 是5000.0 super指向”直接父类“,所以
System.out.println(super.wealth); 是10000.0
STChild x=this;((STParent)x).getWealth();
这时应该是STChild的getWealth()被调用(override)((STGrandParent)this).getWealth();
这时仍然应该是STChild的getWealth()被调用(override)
对于field,是“hide",所以
System.out.println(((STParent)this).wealth); 是10000.0
wealthSystem.out.println(((STGrandParent)this).wealth); 是5000.0 super指向”直接父类“,所以
System.out.println(super.wealth); 是10000.0
在 Java 的类中,所有的没有申明为 final 的函数都是 “虚”的,一个子类对象的指针(在 Java 中应该说成是“句柄”)无论怎么转换成一个基类的指针,他所引用一般函数都是子类中覆盖过的函数。在 Java 中一个子类只可以执行他直接继承的父类的函数,使用方法是使用 super 关键字。一个类中的代码是没有办法调用他直接继承的父类的上一级父类的成员函数的。
在 Java 的类中,所有的没有申明为 final 的instance函数都是 “虚”的
Child-200000.0
Parent-100000.0
Child-200000.0
Child-200000.0 //那为什么是Child-200000.0 ,它是这句((STGrandParent)this).getWealth();输入的,我感觉应是GrandParent-50000.0 怎么和((STParent)this).getWealth();调用的是同一个,不明白?
200000.0
100000.0
100000.0
50000.0
public class father
{
public int foo()
{
return 1;
} public int bar()
{
return foo() * 5;
}
}public class son extends father
{
public int foo()
{
return 2;
}
}在调用 new son().bar() 的时候, Instance scope 已经转换成father了。 这也就是为什么我们需要abstract这个关键字的原因: 和C++的纯虚函数一样。 至于Member variable, 则他的Scope是跟着Class Instance走的, 并没有一个VTable. 所以他在GrandFather的Scope里。
好啊!
这也就是为什么我们需要abstract这个关键字的原因。
似乎这么说:
这也就是abstract method必须被在 子类中实现的原因了。
谢谢
Patrick_DK(疾风摩郎) !
lovesnoopy(洋葱头)
hushuo(小鬼魂)
hahaha88(忧郁的眼神,稀嘘的胡子喳)
Zhakrin()