黑马程序员技术交流社区

标题: 对构造函数,静态代码块执行顺序的验证 [打印本页]

作者: 王亚运    时间: 2012-10-27 09:44
标题: 对构造函数,静态代码块执行顺序的验证
本帖最后由 王亚运 于 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.     }
复制代码
执行结果

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

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


谢谢~~

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



作者: 周万谋    时间: 2012-10-27 10:09
我的理解是:
首先,先明确类的执行顺序:
当new一个类时,类先加载到内存中;
会加载并执行静态代码块;
在堆内存中开辟空间、分配内存地址;
接下来会在堆内存中建立对象的特有属性并默认初始化;
然后会加载对属性的显示赋值;对对象的构造代码块初始化;对对象的构造函数初始化;最后将内存地址赋值给栈内存中的引用变量。
明白了类的加载顺序,再根据你的代码ExB继承ExA,new ExB()就会先加载父类,按照上面的类加载步骤应该O了吧
作者: 刘学宾    时间: 2012-10-27 10:22
构造函数,构造代码块,静态代码块的执行顺序:
首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。


作者: 种生祥    时间: 2012-10-27 10:22

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

作者: 刘学宾    时间: 2012-10-27 10:51
刘学宾 发表于 2012-10-27 10:22
构造函数,构造代码块,静态代码块的执行顺序:
首先执行父类静态的内容,父类静态的内容执行完毕后,接着 ...

嘿嘿,这也是从别人那里看到的,资源共享,对你有帮助就好。
作者: 种生祥    时间: 2012-10-27 12:04
在线时间没什么用。。。。。
作者: 种生祥    时间: 2012-10-27 12:49
。。。。。虚的
作者: 王亚运    时间: 2012-10-27 13:05
种生祥 发表于 2012-10-27 12:49
。。。。。虚的


只是好奇。。
这些帐号的作用。。
作者: 任雷彬    时间: 2012-10-27 13:59
1,静态代码块是随着类的加载而加载,是对类进行初始化,,所以最先执行。但是存在子父类继承时,父类的静态代码块要先于子类先执行。
即   父类--静态代码块
     子类--静态代码块
2,构造代码块和构造函数是对对象进行初始化。构造代码块是对所有的对象进行初始化,构造函数是对应的对象进行初始化。但是存在子父类继承时,父类的构造代码块和构造函数要先于子类先执行。
即是    父类--非静态代码块
        父类--构造函数
        子类--非静态代码块
3,最后,子类对象建立,new ExB();  调用其构造函数初始化,所以最后执行
        子类--构造函数





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