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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夜班心桥 中级黑马   /  2015-3-20 00:07  /  724 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class StaticTest
  2. {
  3.         {
  4.                 System.out.println("constructor code block: " + this.name +", age: " + this.age);
  5.         }
  6.        
  7.         private String name = "lisi";
  8.         private static int age = 34;



  9.         StaticTest(String name, int age)
  10.         {
  11.                 this.name = name;
  12.                 this.age = age;
  13.                 System.out.println("constructor, name: " + this.name + ", age: " + this.age );
  14.         }
  15.        
  16.         StaticTest(){
  17.                 System.out.println("default constructor... name: " + name + ", age :" + age);
  18.         }
  19.        
  20.         static
  21.         {
  22.                 System.out.println("static code block: " + age);
  23.         }

  24.        
  25. }

  26. class StaticDemo2
  27. {
  28.         public static void main(String[] args)
  29.         {
  30.                 StaticTest st = new StaticTest("zs", 20);

  31.                 StaticTest st1 = new StaticTest();
  32.         }
  33. }
复制代码
结果如下所示:
static code block: 34
constructor code block: null, age: 34
constructor, name: zs, age: 20
constructor code block: null, age: 20
default constructor... name: lisi, age :20


由打印结果得知:
首先执行静态代码块,因为它随着类的加载而加载进方法区中,至于静态代码块和静态成员变量age执行顺序是,会按照他们在类中定义的先后顺序来先后加载进来,如果把静态代码块放在StaticTest中的第一行,这时候会编译失败,找不到变量age。
然后会执行构造代码块,它会先于构造器执行。由输出结果的第二行name为null得知,执行构造器的时候,非静态成员的默认初始化已经执行完毕,但是它的显示初始化还未执行。
最后执行构造方法。这时候,通过构造方法的参数,对成员变量赋值已经完成。
还可以得知:无论创建多少次对象,静态代码块只执行一次,而构造函数随着new对象的次数增加,创建几次对象,就执行几次构造方法。

1 个回复

倒序浏览
执行构造代码块的时候,非静态成员默认初始化已经完毕,但它的显示初始化还未执行。不是执行构造器的时候,上面写错了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马