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

news2024/9/21 5:41:34

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

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

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

博客目录

    • 一.实验测试
      • 1.final static 修饰
      • 2.仅 static 修饰
      • 3.调整下顺序
      • 4.仅 final 修饰
    • 二.测试总结
      • 1.详细总结
      • 2.精简总结

在这里插入图片描述

一.实验测试

1.final static 修饰

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 修饰

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.调整下顺序

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 修饰

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

image-20240421110453773

从执行结果可以看到,在执行构造方法之前,会先执行非 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 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1611916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字时代的智慧演奏

数字化时代,工业不再是孤独的机器运转,而是演绎着一场智能与数据的华丽交响。无数智能节点的联动,数据的涌动,成为工业的新活力,同时也是创新的源泉。 工业互联网将每个机器、设备连接在一起,打破了原本独立…

【数据结构练习题】堆——top-k问题

♥♥♥♥♥个人主页♥♥♥♥♥ ♥♥♥♥♥数据结构练习题总结专栏♥♥♥♥♥ ♥♥♥♥♥上一章:【数据结构练习题】二叉树(1)——1.相同的树2.另一颗树的子树3.翻转二叉树4.平衡二叉树5.对称二叉树♥♥♥♥♥ 文章目录 1.top-k问题1.1问题描述1.2思路分析1.3绘图分析…

simulink中怎么使用solve函数?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

Sulley入门教学——简介、安装(Win7、VMware)

1、简介 Sulley 是由 Pedram Amini 和 Aaron Portnoy 开发的开源工具。它以 Python 编写,可以轻松地在不同平台上部署和使用。Sulley 提供了一个灵活且功能强大的框架,允许用户定义协议消息的结构、字段类型、边界条件和模糊测试策略。用户可以使用 Sul…

第三方应用类---Phpmyadmin 后台 Getshell 操作

免责声明:本节仅做技术交流学习. 目录 什么是Phpmyadmin? getshell前提条件: 详细步骤: 1-搜集到开放phpmyadmin的web,然后访问进去 2-执行SQL命令查看是否开启了读写权限 3-开启了读写权限-->继续 没有开读写权限--->鸡鸡 4-有读写权限之后,执行SQL语句导出文件…

解析 IP(IPv4)地址

IPv 4 地址 一、组成二、IPv4 的分类三、子网掩码四、特殊的地址五、私有 IP 地址六、全局 IP 地址七、私有 IP 地址和全局 IP 地址的关系八、广播地址九、网络地址十、IP 地址个数计算十一、查看电脑的 IP 地址(window)十二、手动设置电脑的 IP 地址 为…

第二篇:阿里为什么要禁用Java内置线程池?自定义线程池参数如何设置?

线程池基本概念不清楚的请移步:第一篇:Java中的线程池介绍(阿里为什么要禁用Java内置线程池?自定义线程池参数如何设置?)-CSDN博客 Java中为我们提供了内置线程池,为什么阿里却要严令禁止使用呢…

Python 数据结构和算法实用指南(一)

原文:zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者:飞龙 协议:CC BY-NC-SA 4.0 前言 数据结构和算法是信息技术和计算机科学工程学习中最重要的核心学科之一。本书旨在提供数据结构和算法的深入知识,以及编程…

kkFileView 任意文件上传致远程代码执行漏洞复现(QVD-2024-14703)

0x01 产品简介 kkFileView 是使用 spring boot 搭建的文件文档在线预览解决方案,支持主流办公文档的在线预览。 0x02 漏洞概述 2024年4月,互联网上披露kkFileView远程代码执行漏洞情报,攻击者可利用该漏洞上传恶意文件,获取操作系统权限。该漏洞利用简单,建议受影响的客…

【Linux开发 第六篇】Linux常用命令知识

常用命令知识 关机和重启用户管理用户组运行级别帮助指令文件目录类时间日期类搜索查找类压缩和解压类 关机和重启 shutdown -h now //立刻进行关机 shutdown -h 1 “1分钟后进行” //一分钟后进行关机 并向登录Linux的各个用户发送字符串 shutdown -r now //现在重新启动…

网络安全产品---态势感知EDR

态势感知 what SA,Situational Awareness 是对一定时间和空间内的环境元素进行感知,并对这些元素的含义进行理解,最终预测这些元素在未来的发展状态。 why 安全防护思想已经从过去的被动防御向主动防护和智能防护转变。如果不做到主动防御…

git工具简单使用

文章目录 git上传克隆README.gitignore常用指令冲突 git 进行版本控制的版本控制器。安装git yum install -y git 配置git git config --global user.email "youexample.com" 告诉git你的邮箱是什么?最好输入你的gitee的注册邮箱git config --global …

哈尔滨等保测评综述

​ 定级是网络安全等级保护的首要环节和关键环节,可以梳理各行业、各部门、各单位的等级保护对象类型、重要程度和数量等基本信息,确定分级保护的重点。定级不准,系统备案、建设、整改、等级测评等后续工作都会失去意义,等级…

无人机--行业生命周期分析

行业生命周期:无人机行业生命周期还相对较短,但已经经历了多个阶段的发展。从最初的军用无人机,到近年来民用无人机和商业无人机的快速发展,无人机行业正逐渐走向成熟阶段。未来随着技术的不断进步和应用领域的不断拓展,无人机行业…

浅析ARM Contex-CM3内核架构

目录 概述 1. Cortex-M3类型MCU 1.1 MCU 架构 1.2 实时性系统概念 1.3 处理器命名法 1.4 MCU的一些知识 2. Cortex-M3 概览 2.1 Cortex-M3综述 2.2 寄存器组 2.3 操作模式和特权极别 2.4 内建的嵌套向量中断控制器 2.5 存储器映射 2.6 总线接口 2.7 存储器保护单元…

9.列表渲染

列表渲染 我们可以使用 v-for 指令基于一个数组来渲染一个列表。v-for 指令的值需要使用 item in items 形式的特殊语法&#xff0c;其中 items 是源数据的数组&#xff0c;而 item 是迭代项的别名 <template><div><p v-for"item in names">{{ it…

Adobe Acrobat PDF 2024

Adobe Acrobat PDF 2024正式发布&#xff01;支持Windows和macOS系统&#xff0c;新界面做了轻微调整。 下载地址 Windows客户端&#xff1a;https://www.123pan.com/s/f43eVv-GKZKd.html macOS客户端&#xff1a;https://www.123pan.com/s/f43eVv-PKZKd.html

项目总结报告(Word)+项目总结汇报(PPT)

项目总结报告&#xff08;Word&#xff09;项目总结汇报&#xff08;PPT&#xff09; 1 引言 1.1 编写目的 1.2 背景 1.3 范围 1.4 参考资料 2 项目工作成果 2.1 交付给用户的产品 2.2 交付给研发中心的产品 2.2.1 代码部分 2.2.2 文档部分 2.3 需求完成情况与功能及性能符合性…

Adobe Lightroom Classic v13.2 (macOS, Windows) - 桌面照片编辑

Adobe Lightroom Classic v13.2 (macOS, Windows) - 桌面照片编辑 Acrobat、After Effects、Animate、Audition、Bridge、Character Animator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、Lightroom Classic、Media Encoder、Photoshop、Premiere Pro、Adobe XD…

JS学习归纳8

这是JS基础学习的最后一部分&#xff0c;我们介绍一下简单数据类型和复杂数据类型。 一、 简单数据类型和复杂数据类型 如果有个变量我们以后打算存储为对象&#xff0c;暂时没想好放啥&#xff0c; 这个时候就给 null 1. 简单数据类型 是存放在栈里面 里面直接开辟一个空间存…