静态代码块的使用:
示例一:
public class StaticTest03{ static{ System.out.println("A"); } static{ System.out.println("B"); } public static void main(String[] args){ System.out.println("hello"); } static{ System.out.println("C"); } }
执行结果:
静态代码块优先于main方法执行,在类加载时执行,只执行一次(这一点不同于构造方法,不用在每次创建对象时执行);
静态代码块自上而下的执行
具体的业务中:
可以把记录日志的代码写到静态代码块中,只要时类加载了,记录类加载的信息
示例二:
public class StaticTest04{ static int i = 12; //静态变量 int j = 11; //实例变量,在调用构造方法时才会开辟内存空间 static{ System.out.println("i = " + i); //静态代码块可以直接访问静态变量,都是在类加载的时候执行; //System.out.println("j = " + j); //错误:无法从静态上下文中引用非静态 变量 j System.out.println("x = " + x); //错误: 非法前向引用 } static int x = 21; public static void main(String[] args){ System.out.println("main method"); } }
结论:
1. 静态代码块可以直接访问静态变量,都是在类加载时执行;
2. 静态代码不能直接访问实例变量,实例变量是在构造方法调用时开辟内存空间,和静态代码不在同一时期;
3. 静态代码块执行遵循自上而下的顺序执行,在静态代码块下的变量,不能直接访问;
实例代码块:
示例:
public class InstanceTest{ public static void main(String[] args){ new InstanceTest(); new InstanceTest(); new InstanceTest("str"); new InstanceTest("str"); } { System.out.println("实例代码块"); //实例代码块 } public InstanceTest(){ System.out.println("无参数构造函数"); } public InstanceTest(String a){ System.out.println("有参数构造函数"); } }
结论:
1. 实例代码块的格式是大括号内加代码片段;
2. 实例代码块在每次创建对象调用构造函数之前调用;
3. 实例代码块可能使用的场景,如果有多个构造函数,且多个构造函数前面的代码片段相同,可以考虑把这些相同的片段写到实例代码块中;