静态代码块、匿名代码块、构造器的执行顺序

很多人不了解一个类中有静态代码块、匿名代码块、构造器,当创建一个类的对象的时候,这三个的执行顺序是怎么样的,下面就解决问题

public class Test{
    public static void main(String [] args){
    //创建对象
        My my = new My();
    }
}

//创建一个类,包含静态代码块、匿名代码块、构造器
class My{
    //静态代码块
    static {
        System.out.println("静态代码块执行了");
    }
    //匿名代码块
    {
        System.out.println("匿名代码块执行了");
    }
    //无参构造方法
    My(){
        System.out.println("无参构造方法执行了");
    }
}
//执行结果
静态代码块执行了
匿名代码块执行了
无参构造方法执行了

从执行结果可以看出执行顺是:静态代码块 => 匿名代码块 => 构造器

但是很多人可能不知道原因,那我阐述我的见解

原因

Java虚拟机先将类加载进内存,会经历加载->验证->准备->解析->初始化,在初始化阶段时,JVM会先将被static修饰的代码逐一执行,所以就会先执行静态代码块,而匿名代码块在创建对象的时候就会自动执行,并且在构造器之前执行

注意

静态代码块是类一加载就执行,永久只执行一次,JVM在加载类之前会检查该类是否被加载过,如果没有加载过,那么就对该类进行加载,同时会执行初始化静态变量、执行静态代码块,如果已经被加载了,那么就不会对该类进行加载,从而也不会初始化该类,当使用该类的时候,直接使用。

public class Test3{

    public static void main(String [] args){
        //创建了两个My对象
        My my = new My();
        My my1 = new My();
    }
}

class My{

    //静态代码块
    static {
        System.out.println("静态代码块执行了");
    }
    //匿名代码块
    {
        System.out.println("匿名代码块执行了");
    }
    My(){
        System.out.println("无参构造方法执行了");
    }
}
//输出结果
静态代码块执行了
匿名代码块执行了
无参构造方法执行了
匿名代码块执行了
无参构造方法执行了

通过以上可知,被static修饰会被逐一执行,那么就可知以下代码的执行的输出顺序

public class Test{

    public static void main(String [] args){
        My my = new My();
    }
}

class My{
    static int a = add(1,2);
    //静态代码块
    static {
        System.out.println("静态代码块执行了");
    }
    //匿名代码块
    {
        System.out.println("匿名代码块执行了");
    }
    My(){
        System.out.println("无参构造方法执行了");
    }

    public static int add(int a , int b){
        System.out.println("调用了静态方法");
        return a+b;
    }
}
//输出结果
调用了静态方法
静态代码块执行了
匿名代码块执行了
无参构造方法执行了

你学会了吗?

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值