Java 静态代码块和实例代码块

静态代码块的使用

示例一:

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. 实例代码块可能使用的场景,如果有多个构造函数,且多个构造函数前面的代码片段相同,可以考虑把这些相同的片段写到实例代码块中;

原文地址:https://www.cnblogs.com/homle/p/14181852.html