static静态代码块

本文详细探讨了Java中static静态代码块和实例初始化块的区别,主要体现在执行顺序和次数上。静态代码块在类加载时执行,而实例初始化块在创建对象时伴随构造方法执行。讲解了构造方法、静态代码块、实例初始化块的执行顺序,并通过示例解释了静态变量和静态初始化块的执行规则。同时,提到了JVM加载流程中的静态成员和静态初始化块的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

static静态代码块
public class Person {

    // 静态代码块:在类加载时候执行静态代码块,只会执行一次
    static {
        System.out.println("Person.static initializer");
    }

    // 实例初始化块,每次调用构造方法之前首先调用实例初始化块
    {
        System.out.println("Person.instance initializer");
    }

    public Person() {
        System.out.println("Person.Person");
    }
}

public void test1() {
    Person person1 = new Person();
    Person person2 = new Person();
}

输出顺序为:

Person.static initializer

Person.instance initializer

Person.Person

Person.instance initializer

Person.Person

注意区分静态代码块和实例初始化块的区别,主要体现在执行顺序和执行次数上,静态代码块在类加载的时候执行,因为类只加载一次,所以静态代码块只执行一次,实例初始化块在每次new对象的时候调用构造方法之前被执行,而且每当new一个对象就要执行一次。

静态代码块、实例初始化块、构造方法的执行顺序依次为:静态代码块---->实例初始化块---->构造方法


vpublic class Test{
    static int cnt = 6;
    static{
        cnt += 9;
    }


    public static void main(String[] args){
        System.out.println(“cnt =+ cnt);
    }


    static{
        cnt /=3;
    };
}

cnt的值是(A)

A、 cnt=5

B、 cnt=2

C、 cnt=3

D、 cnt=6

注意,静态初始化块,静态变量这两个是属于同一级别的,是按代码写得顺序执行的! 而不是先执行静态变量后执行静态初始化块!这是错的。举例:

public class Test {  
   static {
      cnt = 6;
   }
   static int cnt = 100;
   public static void main(String[] args) {
      System.out.println("cnt = " + cnt);
      // 最后输出是50,如果按照错误说法就应该是3
      // 按顺序执行就是cnt=6--->cnt=100---->cnt = 100/2 = 50.
   }
   static {
      cnt /= 2;
   }
}

问题:为什么cnt变量的声明放在了后面不报错?JVM加载流程

执行静态变量、静态代码块之前,首先扫描类里面所有的静态变量赋值为默认值cnt=0;


(1)父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。

(2)子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。

(3)父类实例成员和实例初始化块,按在代码中出现的顺序依次执行。

(4)执行父类构造方法。

(5)子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。

(6)执行子类构造方法。

public class Person {
    private static User1 user1 = new User1();
    private User2 user2 = new User2();

    // 静态代码块:在类加载时候执行静态代码块,只会执行一次
    static {
        System.out.println("Person.static initializer");
    }

    // 实例初始化块,每次调用构造方法之前首先调用实例初始化块
    {
        System.out.println("Person.instance initializer");
    }

    public Person() {
        System.out.println("Person.Person");
    }
}

public class Student extends Person{
    private static User3 user3 = new User3();
    private  User4 user4 = new User4();

    static {
        System.out.println("Student.static initializer");
    }

    {
        System.out.println("Student.instance initializer");
    }

    public Student() {
        super();
        System.out.println("Student.Student");
    }
}

User1.User1

Person.static initializer

User3.User3

Student.static initializer

User2.User2

Person.instance initializer

Person.Person

User4.User4

Student.instance initializer
Student.Student


在这里插入图片描述

输出结果为:CBB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值