pepsi2008 2009-06-09 22:32
浏览 368
已采纳

关于继承,请解释下原因

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 已经解释清楚了 我去查了虚拟机规范 这个应该是最小作用域的体现

  • 写回答

17条回答 默认 最新

  • wanghaolovezlq 2009-06-22 15:01
    关注

    朋友,问题要自动关闭啦,结分哦,

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(16条)

报告相同问题?

悬赏问题

  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考