黑马程序员技术交流社区

标题: 关于继承,有段代码搞不懂啊 [打印本页]

作者: 晓风妮子    时间: 2013-4-20 12:14
标题: 关于继承,有段代码搞不懂啊
本帖最后由 晓风妮子 于 2013-4-21 11:31 编辑

class Fu {
Fu(){
  show();
}
void show(){
  System.out.println(".....Fu..show");
}
}
class Zi extends Fu{
int num=20;
{
  System.out.println("Zi构造代码块"+num);
}
Zi(){
  System.out.println("Zi构造函数"+num);
}
void show(){
  System.out.println(".....Zi..show"+num);
}
}
public class FuDemo{
public static void main(String[] args){
  new Zi();
}
}
运行结果是:
.....Zi..show0   //为什么这个地方出现了0,父类中不是没有定义num吗?为什么能编译过去呢?
Zi构造代码块20
Zi构造函数20

作者: 董维明    时间: 2013-4-20 12:30
当new Zi(); 对象时,,它会首先找到父类的空参构造函数,父类中的空参构造函数又调用了show方法,编译时期他会编译父类的show 方法(如果你把父类的show删除会报编译异常),但 当运行时它就会找子类中有没有show();,如果有就执行子类中的show()(如果你把子类中的show删除,他就会运行父类的),num 是成员变量,成员变量分配在栈内存中,且初始值为0; 所以这段代码在执行时,并没有执行到int num =20;,,而只是在加载字节码文件时在栈内存中给num 开辟了一块初始值为0 的内存空间,不知道我这样说你懂了吗?
作者: zn123_4    时间: 2013-4-20 14:34
构造代码块优先于构造函数,执行构造代码块的时候这是类里面还没有指向的对象,num当然为0
作者: 边道坚    时间: 2013-4-20 22:58
董维明 发表于 2013-4-20 12:30
当new Zi(); 对象时,,它会首先找到父类的空参构造函数,父类中的空参构造函数又调用了show方法,编译时期 ...

说的很好!! 以前对这个有点迷糊  现在明白了 谢谢哈
作者: 边道坚    时间: 2013-4-20 22:59
董维明 发表于 2013-4-20 12:30
当new Zi(); 对象时,,它会首先找到父类的空参构造函数,父类中的空参构造函数又调用了show方法,编译时期 ...

说的很好!! 以前对这个有点迷糊  现在明白了 谢谢哈
作者: 黄玉昆    时间: 2013-4-21 07:39
如果问题解决了,请将问题分类改为“已解决”,谢谢
作者: 董维明    时间: 2013-4-21 09:17
边道坚 发表于 2013-4-20 22:59
说的很好!! 以前对这个有点迷糊  现在明白了 谢谢哈

不用客气




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2