A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 晓风妮子 中级黑马   /  2013-4-20 12:14  /  1139 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 晓风妮子 于 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

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

6 个回复

倒序浏览
当new Zi(); 对象时,,它会首先找到父类的空参构造函数,父类中的空参构造函数又调用了show方法,编译时期他会编译父类的show 方法(如果你把父类的show删除会报编译异常),但 当运行时它就会找子类中有没有show();,如果有就执行子类中的show()(如果你把子类中的show删除,他就会运行父类的),num 是成员变量,成员变量分配在栈内存中,且初始值为0; 所以这段代码在执行时,并没有执行到int num =20;,,而只是在加载字节码文件时在栈内存中给num 开辟了一块初始值为0 的内存空间,不知道我这样说你懂了吗?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
构造代码块优先于构造函数,执行构造代码块的时候这是类里面还没有指向的对象,num当然为0

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
董维明 发表于 2013-4-20 12:30
当new Zi(); 对象时,,它会首先找到父类的空参构造函数,父类中的空参构造函数又调用了show方法,编译时期 ...

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

说的很好!! 以前对这个有点迷糊  现在明白了 谢谢哈
回复 使用道具 举报
如果问题解决了,请将问题分类改为“已解决”,谢谢
回复 使用道具 举报
边道坚 发表于 2013-4-20 22:59
说的很好!! 以前对这个有点迷糊  现在明白了 谢谢哈

不用客气
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马