静态代码块的执行方式和顺序
1、静态代码块格式:
static { 执行语句 }
特点:随着类的加载而执行,且只执行一次,并优先于主函数。用于给类初始化的。
2、执行顺序:
示例一
静态代码块随着类加载而加载
有多个静态代码块的,按代码块前后顺序加载
一个代码块,只执行一次。
package javastudy; class StaticCode1{ static{ //第4步。由第3步触发。 System.out.println("x"); } } public class StaticDemo2 { static{ //第1步。先加载主函数所在类,所以先加载并执行这段静态代码块。 System.out.println("y"); } public static void main(String[] args) { new StaticCode1(); //第3加载StaticCode1类。 new StaticCode1(); //不执行。静态代码块只执行一次 System.out.println("over"); //第5步。输出打印。 } static{ //第2步。多个静态代码块之前,按前后顺序执行 System.out.println("z"); } }
输出:
y
z
x
over
示例二
public class StaticDemo1 { public static void main(String[] args) { StaticDemo1 t1=new StaticDemo1(); //第2步,初始化构造函数,i=9 System.out.println(t1.i); //第3步,按顺序执行,9 speak(); //第4步,按顺序执行,调用静态函数 } static int i=1; //静态变量存到静态区域。 static void speak() //静态函数存到静态区域。调用时执行。 { System.out.println("a");; } static { //第1步,静态代码块随着类的加载,优先执行且只执行一次。i=3,i+3打印结果是4。 i=i+3; System.out.println(i); } public StaticDemo1(){ //构造方法,初始化时执行。 i=i+5; //i=9 System.out.println(i); } }
输出:
4
9
9
a
示例三
package javastudy; public class StaticDemo2 { public static void main(String[] args) { } static{ //随类加载就执行,不需要实例化 System.out.println("z"); } }
输出:
z
示例四
class StaticCode2{ StaticCode2(){ //没有调用。 System.out.println("aa"); } static{ //1 静态代码块先执行 System.out.println("x"); } { //2 对象的构造代码块。给对象初始化的。 System.out.println("cc"); } StaticCode2(int i){ //3 被调用 System.out.println("aa"); } public static void show(){ //静态方法,没有调用。 System.out.println("gogogo"); } } public class StaticDemo4 { public static void main(String[] args) { new StaticCode2(4); } }
输出:
x
cc
aa
示例五
public class StaticDemo5 { static int i=1; static{ System.out.println("a"); //第1步。a。且只执行一次 i++; //i=i+1,结果2 } public StaticDemo5(){ System.out.println("c"); //第2步。 i++; //i=i+1,结果3 } public static void main(String[] args) { StaticDemo5 t1=new StaticDemo5(); System.out.println(t1.i); //第3步。3 StaticDemo5 t2=new StaticDemo5(); //第4步。c。第二次创建实例。static静态代码块不执行。 System.out.println(t2.i); //第5步。又执行了一次StaticDemo5()构造函数。4 } }
输出:
a
c
3
c
4
创建第二个对象StaticDemo5 t2=new StaticDemo5()时,其实i已经先于对象存在于静态区域
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)