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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 王亚运 于 2012-10-27 10:42 编辑
  1. public class ExA {  
  2. static {  
  3.         System.out.println("父类--静态代码块");  
  4.     }  
  5.   
  6.     public ExA() {  
  7.         System.out.println("父类--构造函数");  
  8.     }  
  9.   
  10.     {  
  11.         System.out.println("父类--非静态代码块");  
  12.     }  
  13.   
  14.     public static void main(String[] args) {  
  15.         new ExB();  
  16.     }  
  17. }  
  18.   
  19. class ExB extends ExA {  
  20.     static {  
  21.         System.out.println("子类--静态代码块");  
  22.     }  
  23.     {  
  24.         System.out.println("子类--非静态代码块");  
  25.     }  
  26.   
  27.     public ExB() {  
  28.         System.out.println("子类--构造函数");  
  29.     }
复制代码
执行结果

父类--静态代码块
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数

有哪位大神愿意讲下为什么。。
父类  和子类顺序为什


谢谢~~

+++++++++++
感谢楼下兄弟讲解


评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

8 个回复

倒序浏览
我的理解是:
首先,先明确类的执行顺序:
当new一个类时,类先加载到内存中;
会加载并执行静态代码块;
在堆内存中开辟空间、分配内存地址;
接下来会在堆内存中建立对象的特有属性并默认初始化;
然后会加载对属性的显示赋值;对对象的构造代码块初始化;对对象的构造函数初始化;最后将内存地址赋值给栈内存中的引用变量。
明白了类的加载顺序,再根据你的代码ExB继承ExA,new ExB()就会先加载父类,按照上面的类加载步骤应该O了吧

点评

很详细。。谢谢  发表于 2012-10-27 10:32

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
构造函数,构造代码块,静态代码块的执行顺序:
首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。

点评

谢谢。。 你说的子类默认调用父类的空参构造函数 是不是 每个子类的构造函数前隐藏的super()? 刚好看到毕老师的day07_06 谢谢哦  发表于 2012-10-27 10:37
『总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。』 一句惊醒。。  发表于 2012-10-27 10:35

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

回复 使用道具 举报

静态代码快:随着类的加载而执行,***只执行一次,并优先于主函数,只能访问静态成员和方法,不能访问非静态
构造代码快:优先于构造函数*执行,是给所有的对象进行统一初始化
静态代码快优先于构造代码快执行
父类子类执行顺序是根据你new的顺序

点评

谢谢。。 默默问句:在线时间是每天都挂着就可以有的?  发表于 2012-10-27 10:41
回复 使用道具 举报
刘学宾 发表于 2012-10-27 10:22
构造函数,构造代码块,静态代码块的执行顺序:
首先执行父类静态的内容,父类静态的内容执行完毕后,接着 ...

嘿嘿,这也是从别人那里看到的,资源共享,对你有帮助就好。
回复 使用道具 举报
在线时间没什么用。。。。。

点评

..... 有没有发现首页最右边板块的在线排行。。 牛人帐号。。  发表于 2012-10-27 12:44
回复 使用道具 举报
。。。。。虚的
回复 使用道具 举报
种生祥 发表于 2012-10-27 12:49
。。。。。虚的


只是好奇。。
这些帐号的作用。。
回复 使用道具 举报
1,静态代码块是随着类的加载而加载,是对类进行初始化,,所以最先执行。但是存在子父类继承时,父类的静态代码块要先于子类先执行。
即   父类--静态代码块
     子类--静态代码块
2,构造代码块和构造函数是对对象进行初始化。构造代码块是对所有的对象进行初始化,构造函数是对应的对象进行初始化。但是存在子父类继承时,父类的构造代码块和构造函数要先于子类先执行。
即是    父类--非静态代码块
        父类--构造函数
        子类--非静态代码块
3,最后,子类对象建立,new ExB();  调用其构造函数初始化,所以最后执行
        子类--构造函数

点评

我要是能给加技术就好了。。。 呵呵  发表于 2012-10-27 14:36
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马