假定有一个类定义如下:

package com.zhang;

public final class Girl {
    // static代码块1
    private static String sex = "female";
    // 成员方法代码块1
    private String name = "anonymous";
    
    // static代码块2
    static {
        System.out.println("static1");
    }
    
    // 成员方法代码块3
    public Girl() {
        System.out.println("constructor");
    }
    
    // static代码块3
    static {
        System.out.println("static2");
    }
    
    // 成员方法代码块2
    private int age = 18;
}

第一次加载类,并创建该类对象时,静态变量、成员变量的初始化顺序,静态代码的执行顺序是怎样的?

创建一个类对象,如果该类没有初始化,则先初始化该类(执行 clinit 方法),然后执行构造函数(init 方法),具体就是先执行 class 文件中的 static 代码块,然后再执行构造函数代码块。观察上面类的 class 文件 static 代码块:

可以看出,static 代码块内容就是,把 static 语句按顺序搜集起来,static 变量赋值也是 static 语句,伪代码如下:

static {
    sex = "female";
    System.out.println("static1");
    System.out.println("static2");
}

构造函数代码块:

对应的伪代码如下:

public Girl() {
<init> name
= "anonymous"; age = 18; System.out.println("constructor"); }

首先执行 <init> 方法,即按顺序收集构造函数外部的语句,然后再执行构造函数内的语句。

posted on 2018-04-20 09:53  偶尔发呆  阅读(657)  评论(0编辑  收藏  举报