- class StaticTest
- {
- {
- System.out.println("constructor code block: " + this.name +", age: " + this.age);
- }
-
- private String name = "lisi";
- private static int age = 34;
- StaticTest(String name, int age)
- {
- this.name = name;
- this.age = age;
- System.out.println("constructor, name: " + this.name + ", age: " + this.age );
- }
-
- StaticTest(){
- System.out.println("default constructor... name: " + name + ", age :" + age);
- }
-
- static
- {
- System.out.println("static code block: " + age);
- }
-
- }
- class StaticDemo2
- {
- public static void main(String[] args)
- {
- StaticTest st = new StaticTest("zs", 20);
- StaticTest st1 = new StaticTest();
- }
- }
复制代码 结果如下所示:
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对象的次数增加,创建几次对象,就执行几次构造方法。
|