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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 侯国奇 于 2013-2-20 12:56 编辑

静态代码块、构造代码块都进行哪些初始化操作?在设计中常用吗?

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 鼓励一下

查看全部评分

8 个回复

倒序浏览
静态代码块是给类进行初始化的,构造代码块是给对象进行初始化的,后面的问题我也太清楚,对不住呀,我只知道这些。见谅。
回复 使用道具 举报
静态代码块是随着类的加载而执行的,只执行一次。是给类进行初始化的。而构造代码块是给对象进行统一初始化的,主要是给不同对象的共性进行初始化。在对象的初始化过程中,当类文件加载后就会执行静态代码块给类初始化,而构造代码块是要等对象建立后给对象进行初始化的。

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
下面的代码能直观的显示出静态代码块、构造代码块、构造函数的执行顺序。作用楼上的已经说了

  1. class person
  2. {
  3.         //静态代码块先执行,构造代码块执行,构造函数执行
  4.         person()
  5.         {
  6.                 System.out.println("构造函数 3!");
  7.         }
  8.         static
  9.         {
  10.                 System.out.println("静态代码块 1");
  11.         }
  12.        
  13.         {
  14.                 System.out.println("构造代码块 2");
  15.         }
  16.        
  17.        
  18. }
  19. class personDemo2
  20. {
  21.         public static void main(String[] args)
  22.         {
  23.                 person p =new person();
  24.         }
  25. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
给你举个静态代码块和构造代码块的例子:
  1. public class Test
  2. {
  3.     public static void main(String[] args)  
  4.     {
  5.                  new Student();
  6.         }

  7. }

  8. class Person
  9. {

  10.         static
  11.         {
  12.                 System.out.println("Person static block!");
  13.         }

  14.         {
  15.                 System.out.println("Person 构造代码块执行!");
  16.         }

  17.         public Person()
  18.         {
  19.                 System.out.println("Person 构造函数执行!");
  20.         }
  21. }

  22. class Student extends Person
  23. {
  24.         static
  25.         {
  26.                 System.out.println("Student static block!");
  27.         }

  28.         {
  29.                 System.out.println("Student 构造代码块执行!");
  30.         }

  31.         public Student()
  32.         {
  33.                 //super()默认调用父类不带参数的构造函数
  34.                 System.out.println("Student 构造函数执行!");
  35.         }


  36. }

  37. //---------- 运行Java程序 ----------
  38. //Person static block!
  39. //Student static block!
  40. //Person 构造代码块执行!
  41. //Person 构造函数执行!
  42. //Student 构造代码块执行!
  43. //Student 构造函数执行!
复制代码
首先,初始化块总是在构造函数之前执行,在新建子类对象时,先执行最顶层父类的初始化块,依次向下执行其父类的初始化块,开始执行其父类的构造器……最后才执行该类的初始化块和构造器,返回该类的对象。
其次,静态初始化块是类相关的,系统在类初始化阶段执行静态初始化块,而不是在创建对象时才执行。因此静态代码块总是比普通初始化块先执行。
所以上个例子,new出来一个子类的对象,首先加载父类和子类,固Person和Stsudent的静态代码块依次先执行,类加载后,调用Student()构造器,默认调用super(),而普通构造代码块先于构造器执行,所以先调用Person的构造代码块,再调用Person构造器,之后就是Student的构造代码块和Student构造器。。

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
王钊 发表于 2013-2-20 10:34
给你举个静态代码块和构造代码块的例子:首先,初始化块总是在构造函数之前执行,在新建子类对象时,先执行 ...

学习了。。。
回复 使用道具 举报
静态代码块,主要是对类变量进行初始化操作,类变量属于java类本身,只有当程序初始化该java类时才会为该类的类变量分配内存空间,并执行初始化。java虚拟机对一个java类只初始化一次,因此java程序每运行一次,系统只为类变量分配一次内存空间,执行一次初始化。
构造代码块,主要是对实例变量进行初始化。实例变量可以在三个地方进行初始化,第一,定义实例变量时指定初始化值。第二,非静态初始化块中对实例变量指定初始值。第三,构造方法中初始化实例变量。第一种或第二种最先获得执行。   但是当你使用javap -c 类名。分析代码,就会发现,三种初始化作用都一样。经编译器处理后,第一种和第二中的赋值语句都将合并到构造方法中(第一种和第二种的赋值语句位于构造方法自身代码的前面)。
回复 使用道具 举报
王钊 发表于 2013-2-20 10:34
给你举个静态代码块和构造代码块的例子:首先,初始化块总是在构造函数之前执行,在新建子类对象时,先执行 ...

谢了,又补充了父类与子类关于初始化块的知识了!
回复 使用道具 举报
请问这个的结果是什么:
public class StaticCode {
        public static void main(String[] args) {
                Code code1 = new Code();
               
                Code code2 = new Code();
        }

}
class Code{
        {
                System.out.println("普通的代码块...");
        }
       
        static{
                System.out.println("静态代码块...");
        }
       
        public Code(){
                System.out.println("构造方法...");
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马