假定有一个类定义如下:
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> 方法,即按顺序收集构造函数外部的语句,然后再执行构造函数内的语句。