public class Father {
private int i = 1;
public void p(){
System.out.println(this.i);
}
}
public class Son extends Father {
private int i = 10;
public void q(){
System.out.println(this.i);
}
}
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Son son = new Son();
son.p();
}
}
输出为1 是什么原因呢?
[b]问题补充:[/b]
我DEBUG过this this的值是子类的对象,却没有去得到子类的成员变量 所以才会有了这个简单的问题 希望大家帮我解答
[b]问题补充:[/b]
我在Father类里写了个方法
public void s(){
System.out.println(this.getClass().getName());
}
结果为Son,证明this确实是子类的对象
[b]问题补充:[/b]
[quote]Son的内存地址空间其实是有两个变量i,一个是从父类继承来的,一个是自己声明的,
[/quote]
这个事理解的
[quote]
当调用父类的方法时,此时的进入的堆栈地址空间是父类的地址空间
[/quote]
这个怎么保证??或者怎么实现??我看了《深入JVM》 好像没有解释
[b]问题补充:[/b]
[quote]输出为1的原因
Java语言规定:任何一个子类的构造方法都必须调用其父类的构造方法,而且调用负累构造方法的语句必须是在子类构造方法的第一条语句,其格式为:
super(调用参数列表);
“super(调用参数列表)”就会调用父类的相应构造方法。如果在程序中没有显示写上调用父类构造方法的语句,则Java在编译和执行时会在子类构造方法的第一条语句前自动地隐式地添加调用不含任何参数的父类构造方法语句。所以在调用子类的构造之前,系统会调用其父类的构造方法。因此,上述例子中输出结果第一句是“1”.
[/quote]
你没看明白我的意思。。。。。。其实 lovewhzlq 已经解释清楚了 我去查了虚拟机规范 这个应该是最小作用域的体现