黑马程序员技术交流社区

标题: 构造代码块和静态代码块的问题 [打印本页]

作者: 胡峰    时间: 2013-3-27 20:28
标题: 构造代码块和静态代码块的问题
本帖最后由 田磊阳 于 2013-3-27 21:46 编辑

构造代码块和静态代码块在内存中是怎么运行的.有什么区别?   
作者: 我手心里的宝    时间: 2013-3-27 20:54
静态代码块,是在类在加载边运行,是对类进行初始化的
构造代码块是对类创建的所有对象进行初始化的
当类中的构造方法以重载的形式存在时,并且有共同成员变量或共同的方法时,可以通过构造代码块对其进行初始化;这样可以减少代码的重复
静态代码块只运行一次,二构造代码块,每次new对象都会执行


作者: 田磊阳    时间: 2013-3-27 21:06
本帖最后由 田磊阳 于 2013-3-27 21:09 编辑

这个怎么来说呢,因为静态代码块和构造代码块之间没有什么关系。

简单的说一下他俩个的区别吧:

1、静态代码块:它是随着类的的加载而执行,类一加载静态代码块就会执行,并且只执行一次
2、构造代码块:是用于给对象进行初始化,对象一建立,构造代码块就会运行
3、所以静态代码块比构造代码块先执行,构造代码块比构造函数先执行;

用代码解释一下吧:
  1. class StaticCode{
  2. int num=9;
  3. //建立构造函数
  4. StaticCode(){
  5.   System.out.println("b");
  6. }
  7. //下面建立静态代码块
  8. static{
  9.   System.out.println("a");
  10. }
  11. //下面建立构造代码块
  12. {
  13.   System.out.println("c"+this.num);
  14. }
  15. //在建立一个show()
  16. public static void show(){
  17.   System.out.println("show  run");
  18. }
  19. }
  20. class Demo{
  21. public static void main(String[] args){
  22.   new StaticCode();
  23.   
  24. }
  25. }


  26. 输出结果:
  27. a
  28. c9
  29. b

  30. 看一下这个顺序:先是静态代码块,然后是构造代码块,然后是构造函数,从new StaticCode();可以看出,对象一建立,就迅速执行了这些程序。具体在内存是怎么运行的,和创建对象是差不多的,关键就是执行顺序,掌握好执行顺序就好了。
复制代码

作者: 刘海陆    时间: 2013-3-27 21:23
静态代码块:随着类的的加载而执行,类一但加载,静态代码块就会执行,且只能执行一次。
构造代码块:用于给对象进行初始化的,每new一次,构造代码块就会执行一次。
详细的 看毕老师的java基础的第6天的视频,老师讲的很详细。
作者: 田磊阳    时间: 2013-3-27 21:30
刘海陆 发表于 2013-3-27 21:23
静态代码块:随着类的的加载而执行,类一但加载,静态代码块就会执行,且只能执行一次。
构造代码块:用于 ...

嗯嗯,视频课里有讲解
作者: 刘海陆    时间: 2013-3-27 21:33
田磊阳 发表于 2013-3-27 21:30
嗯嗯,视频课里有讲解

给个分吧 ,大大的版主呀!!
作者: 田磊阳    时间: 2013-3-27 21:40
刘海陆 发表于 2013-3-27 21:33
给个分吧 ,大大的版主呀!!

回答的比较简练···下次回答详细一点,让楼主更加明白,加油~(已给分)
作者: 刘海陆    时间: 2013-3-27 21:41
田磊阳 发表于 2013-3-27 21:40
回答的比较简练···下次回答详细一点,让楼主更加明白,加油~(已给分) ...

嗯嗯,好的,我以后回答一定详细点,谢谢版主了哈!
作者: 米腾达    时间: 2013-3-27 21:49
从内存角度来说的话,程序在内存中一般分为代码段、数据段、堆栈段。代码段就是用来存放代码的,在java中也就是编译后的.class文件,存入代码段内存后的代码不执行,像你说的构造代码块和静态代码块在内存中都是存放在代码段内存中的,只是在创建对象时,这两段代码的调用次序和调用时间不同罢了。在JVM中代码段内存叫方法区。




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