class Father{
private int i = 70;
Father(){
// System.out.println("Inside father "+getClass().getName()+" construct!" + i);
// System.out.println(super.toString());
}
public void update(){
i ++;
System.out.println(getClass().getName() + ":" +i);
}
}
class Son extends Father{
public int i = 45;
Son(){
//System.out.println("Inside son "+getClass().getName()+" construct!" + i);
//System.out.println(super.toString());
// update();
// super.update();
}
}public class Grandson extends Son{
public int i = 20;
Grandson(){
// System.out.println("Inside grandson "+getClass().getName()+" construct!" + i);
// System.out.println(super.toString());
// update();
// super.update();
}
public static void main(String[] args){
Grandson suntest = new Grandson();
suntest.update();
}
}
private int i = 70;
Father(){
// System.out.println("Inside father "+getClass().getName()+" construct!" + i);
// System.out.println(super.toString());
}
public void update(){
i ++;
System.out.println(getClass().getName() + ":" +i);
}
}
class Son extends Father{
public int i = 45;
Son(){
//System.out.println("Inside son "+getClass().getName()+" construct!" + i);
//System.out.println(super.toString());
// update();
// super.update();
}
}public class Grandson extends Son{
public int i = 20;
Grandson(){
// System.out.println("Inside grandson "+getClass().getName()+" construct!" + i);
// System.out.println(super.toString());
// update();
// super.update();
}
public static void main(String[] args){
Grandson suntest = new Grandson();
suntest.update();
}
}
Grandson类的对象后调用超类father的update()方法
而打印i的时候程序到了Father的领域之中此时i是70,i++就是71getClass()在Grandson中重写了,所以是
Grandson:71
这个问题不应该这么简单的,我对C++类的内存模型比较熟悉,对JAVA类的内存模型不清楚,在网上查了很多也没有相关资料(不知道候捷老师能不能出一本<<深入浅出JAVA>>哈),方法应该是属于类的,不存在有哪个领域的问题,只存在隐藏this指针(static方法除外),suntest.update(); 其实在幕后应该是suntest.update(this); 而执行的具体方法应该是:
public void update(){
this.i ++;
System.out.println(getClass().getName() + ":" +this.i);
}
而正如getClass().getName()所示,this所指向的对象是Grandson,而不是Father,而字段是属于对象的,不属于类(static 除外,static成员变量是属于类的),所以说,this.i按理应该是Grandson隐藏父类的成员变量,在构造函数执行前被初始化成20!
说了这么多,不知说清楚没有?还望兄弟高人们指点迷津.
有哪位兄弟有确切的JAVA类内存模型也行.