假定有一个类定义如下:
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> 方法,即按顺序收集构造函数外部的语句,然后再执行构造函数内的语句。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步