【JVM系列】关于静态块、静态属性、构造块、构造方法的执行顺序

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

一.实验测试

1.final static 修饰

apl 复制代码
public class Apple01 {
    static Apple01 apple = new Apple01(10);
    final static double price = 20;
    double result = 10;

    public Apple01(double discount) {
        System.out.println("price=" + price);
        System.out.println("result=" + result);
        result = price - discount;
        System.out.println("result===" + result);
    }

    public static void main(String[] args) {
        Apple01 apple1 = Apple01.apple;
    }
}

price=20.0

result=10.0

result===10.0

从执行结果可以看出,执行 apple 静态变量的时候, final static 修饰的 price 已经赋值为 20 了

2.仅 static 修饰

apl 复制代码
package com.xiaofei.antjvm.demo.base;

public class Apple01 {
    static Apple01 apple = new Apple01(10);
    static double price = 20;
    double result = 10;

    public Apple01(double discount) {
        System.out.println("price=" + price);
        System.out.println("result=" + result);
        result = price - discount;
        System.out.println("result===" + result);
    }

    public static void main(String[] args) {
        Apple01 apple1 = Apple01.apple;
    }
}

price=0.0

result=10.0

result===-10.0

从执行结果可以看出,答案是-10,还是比较差异的,主要是执行 apple 静态变量的时候 price 的初始值还是 0

3.调整下顺序

apl 复制代码
public class Apple02 {
    static double price = 20;
    double result = 10;
    static Apple02 apple = new Apple02(10);

    public Apple02(double discount) {
        System.out.println("price=" + price);
        System.out.println("result=" + result);
        result = price - discount;
        System.out.println("result===" + result);
    }

    public static void main(String[] args) {
        Apple02 apple1 = Apple02.apple;
    }
}

price=20.0

result=10.0

result===10.0

从执行结果可以看出,static 修饰的 price 和 apple 级别都是静态变量,谁在前面谁先执行

4.仅 final 修饰

apl 复制代码
public class Apple03 {
    static double price = 20;
    final static double price1 = 20;
    final double price2 = 20;
    double result = 10;
    static Apple03 apple = new Apple03(10);
    static double price3 = 20;
    double result1 = 10;
    final double price4 = 20;

    public Apple03(double discount) {
        System.out.println("price=" + price);
        System.out.println("price1=" + price1);
        System.out.println("price2=" + price2);
        System.out.println("price3=" + price3);
        System.out.println("price4=" + price4);
        System.out.println("result=" + result);
        System.out.println("result1=" + result1);
        result = price - discount;
        System.out.println("result===" + result);
    }

    public static void main(String[] args) {
        Apple03 apple1 = Apple03.apple;
    }
}

price=20.0

price1=20.0

price2=20.0

price3=0.0

price4=20.0

result=10.0

result1=10.0

result===10.0

从执行结果可以看到,在执行构造方法之前,会先执行非 static 方法(final 修饰的变量和普通变量,同等级)

二.测试总结

1.详细总结

  1. 当类被加载时,会首先执行静态代码块和静态变量的初始化。静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关,且静态变量或静态方法中如果调用构造方法,可以把构造当做一个普通方法来看,但会先执行一遍代码块。
  2. 接着,会执行父类的静态代码块和静态变量初始化。
  3. 然后,执行子类的静态代码块和静态变量初始化,
  4. 实例化父类时,会先执行父类的实例变量初始化,然后执行父类的构造方法
  5. 实例化子类时,会先执行子类的实例变量初始化,然后执行子类的构造方法
  6. 在构造方法执行之前,会先执行非静态代码块。每被实例化一次,就会被执行一次。
  7. 最后,执行构造方法。如果构造方法体的第一行是 this 语句,则会调用相应的 this 语句所指的构造方法。如果构造方法体的第一行是 super 语句,则会调用相应的父类的构造方法。如果构造方法体的第一行既不是 this 语句也不是 super 语句,则会隐式调用 super(),即其父类的默认构造方法。

2.精简总结

  1. 类加载时,执行静态代码块和初始化静态变量。执行顺序跟代码顺序一致。
  2. 类实例化时,初始化变量、执行代码块、执行构造。其中初始化变量和代码块的顺序跟代码顺序一致。执行构造是在最后。
  3. 实例化子类时,会先调用父类的构造方法。调用构造方法之前,会先执行该类的代码块。
  4. 类只会加载一次。
  5. 静态变量或静态方法中如果调用构造,可以把构造当做一个普通方法来看。但会先执行一遍代码块

觉得有用的话点个赞 👍🏻 呗。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

相关推荐
刘大猫.1 小时前
Arthas dashboard(当前系统的实时数据面板)
jvm·arthas·dashboard·当前系统的实时数据面板·dashboard命令·arthas命令
longlongqin3 小时前
JVM 内存结构?
jvm
Joeysoda12 小时前
Java数据结构 时间复杂度和空间复杂度
java·开发语言·jvm·数据结构·学习·算法
18你磊哥12 小时前
java重点学习-JVM组成
java·开发语言·jvm
蜜桃小阿雯14 小时前
JAVA开源项目 校园美食分享平台 计算机毕业设计
java·jvm·spring boot·spring cloud·intellij-idea·美食
longlongqin15 小时前
JIT(即时编译)技术
jvm
ZachOn1y21 小时前
Java 入门指南:JVM(Java虚拟机)—— 双亲委派模型(Parent Delegation Model)
java·jvm·后端·java-ee·团队开发·个人开发
寻求出路的程序媛1 天前
JVM —— 类加载器的分类,双亲委派机制
java·jvm·面试
深鱼~1 天前
【JVM】垃圾回收机制|死亡对象的判断算法|垃圾回收算法
jvm
Lill_bin1 天前
JVM内部结构解析
jvm·后端·spring cloud·微服务·云原生·ribbon