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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周朝 中级黑马   /  2013-4-18 19:49  /  1441 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 周朝 于 2013-4-18 21:12 编辑
  1. class TestFlow{
  2. public static void main(String[] args)
  3. {
  4. ZI z=new ZI();
  5. }
  6. }
  7. class FU
  8. {

  9. static{
  10. System.out.println("父类静态代码块");
  11. }
  12. {
  13. System.out.println("父类构造代码块");
  14. }
  15. public static void show(){
  16. System.out.println("父类静态方法");
  17. }
  18. public void speak(){
  19. System.out.println("父类一般方法: ");
  20. }

  21. FU(){
  22. System.out.println("父类构造方法");
  23. }
  24. }
  25. class ZI extends FU
  26. {
  27. static{
  28. System.out.println("子类静态代码块");
  29. }
  30. public static void show(){
  31. System.out.println("子类静态方法");
  32. }
  33. public void speak(){
  34. System.out.println("子类一般方法");
  35. }
  36. {
  37. System.out.println("子类构造代码块");
  38. }
  39. ZI(){
  40. System.out.println("子类构造方法");
  41. }
  42. }
复制代码
麻烦大家看下这段代码
1.说一下这段代码的输出结果
2.文字性的描述下:子父类中类.父类静态代码块,子类静态代码块,父类构造代码块,子类构造代码块,父类构造函数,子类构造函数的顺序

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

4 个回复

倒序浏览
输出结果:父类静态代码块
子类静态代码块
父类构造代码块
父类构造方法
子类构造代码块
子类构造方法
原因如下:
1、首先类一加载class TestFlow,就加载静态代码块,
因为静态代码块随类的加载而加载,依次执行
(1)static{
System.out.println("父类静态代码块");
}
输出:父类静态代码块
(2)static{
System.out.println("子类静态代码块");
}
输出:子类静态代码块
2、执行main函数
ZI z=new ZI();
调用子类构造函数,
调用子类构造函数前,应先 调用父类构造函数,
因为构造代码块是从构造方法里抽出来的,和构造方法差不多,
所以可以想象把构造代码块放在构造方法里依次执行
执行:
(1){
System.out.println("父类构造代码块");
}
输出:父类构造代码块
(2)FU(){
System.out.println("父类构造方法");
}
输出:父类构造方法
(3){
System.out.println("子类构造代码块");
}
输出:子类构造代码块
(4)ZI(){
System.out.println("子类构造方法");
}
输出:子类构造方法
回复 使用道具 举报
乘鱼飞 发表于 2013-4-18 20:26
输出结果:父类静态代码块
子类静态代码块
父类构造代码块

还是有点不解!
1. 构造代码块是从构造函数抽出来的,是什么意思?
2.调用子类构造函数然后调用父类构造函数,是因为子类构造函数里边有super()吗?
回复 使用道具 举报
本帖最后由 乘鱼飞 于 2013-4-18 21:10 编辑

{
System.out.println("父类构造代码块");
}

FU(){
System.out.println("父类构造方法");
}
如上两个代码块实际上可以写成下面的代码块

FU(){
System.out.println("父类构造代码块");
System.out.println("父类构造方法");
}
举例如:
FU_1(){
System.out.println("父类构造代码块");
}
FU(){
System.out.println("父类构造代码块");
System.out.println("父类构造方法");
}
有重复的
这时可抽取
{
System.out.println("父类构造代码块");
}作为代码块
代码块可使程序更简洁
调用子类无参构造函数时,
子类总是先执行顶级父类构造函数,
子类如果需要调用父类有参构造函数时,
需要使用super(参数列表);调用.
super(参数列表);必须放在子类构造函数中的最前面
回复 使用道具 举报
乘鱼飞 发表于 2013-4-18 21:04
{
System.out.println("父类构造代码块");
}

恩谢谢了!:lol
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马