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

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
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.mzph.cn/pingmian/1214.shtml

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

相关文章

2.Vue简介

Vue简介 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,V…

【网站项目】“最多跑一次”小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

【一竞技DOTA2】双冠王N0tail将发布新书自传《性格胜过天赋》

1、近日Ti双冠王N0tail,在个人推特上宣布将发布自己的自传《性格胜过天赋》。N0tail职业生涯豪夺两届Ti冠军,700万美元个人生涯奖金亦是电竞史最高的传奇选手。 “经过许多年的努力和收到的大量请求,我将发布我的自传新书《性格胜过天赋》&am…

C++ 核心编程 - 引用

文章目录 2.1 引用的基本使用2.2 注意事项2.3 引用作函数参数2.4 引用作函数返回值2.5 引用的本质2.6 常量引用 2.1 引用的基本使用 作用&#xff1a; 给变量起别名&#xff0c;语法为 数据类型 &别名 原名 int main(){int a 100;int &b a;cout << "a …

特征值eigenvalue与特征向量eigenvector

特征值&#xff0c;特征向量概念 在线性代数中&#xff0c;对于一个给定的线性变换A&#xff0c;他的特征向量v经过这个线性变换的作用之后&#xff0c;得到的新向量仍然与原来的 v v v保持在同一条直线上。但长度或方向也许会改变。即&#xff1a; A v Av Av λ v \lambda…

戒烟生活记录

今天是2024年4月15日&#xff0c;从大前天也就是12号下班后&#xff0c;吃的有一点饱&#xff0c;就感觉身体及其难受&#xff0c;气短呼吸不上&#xff0c;我查了后可能是心脏的问题&#xff0c;并且晚上睡觉有一种呼吸不上&#xff0c;憋气的感觉&#xff0c;然后我就又开始决…

强化网络安全防线,您的等级保护措施到位了吗?

在这个信息化飞速发展的时代&#xff0c;网络安全已经成为我们每个人都需要关注的问题。无论是企业还是个人&#xff0c;我们的工作和生活都越来越依赖于网络。确保网络环境的安全&#xff0c;防止信息泄露和网络攻击&#xff0c;已经成为了一项至关重要的任务。等级保护制度作…

如何做一个优秀的系统工程师?

一、背景 做好一个优秀系统工程师的关键在于其在产品开发生命周期中对需求分析的有效把握与运用&#xff0c;这个过程直接影响到系统的整体架构设计、规格参数的明确设定以及业务流程的深度挖掘与优化。需求分析不仅是理解用户实际问题的核心环节&#xff0c;更是界定系统开发…

无限滚动分页加载与下拉刷新技术探析:原理深度解读与实战应用详述

滚动分页加载&#xff08;也称为无限滚动加载、滚动分页等&#xff09;是一种常见的Web和移动端应用界面设计模式&#xff0c;用于在用户滚动到底部时自动加载下一页内容&#xff0c;而无需点击传统的分页按钮。这种设计旨在提供更加流畅、连续的浏览体验&#xff0c;减少用户交…

Go语言中通过数据对齐降低内存消耗和提升性能

数据对齐是一种安排数据分配方式以加速 CPU 访问内存的方法。 不了解这个概念会导致额外的内存消耗甚至性能下降。 要了解数据对齐的工作原理&#xff0c;让我们首先讨论没有它会发生什么。假设我们分配两个变量&#xff0c;一个 int32 类型的 &#xff08;32 B&#xff09; 和…

docker-compose 安装MongoDB续:创建用户及赋权

文章目录 1. 问题描述2. 分析2.1 admin2.2 config2.3 local 3. 如何连接3.解决 1. 问题描述 在这一篇使用docker-compose创建MongoDB环境的笔记里&#xff0c;我们创建了数据库&#xff0c;但是似乎没有办法使用如Robo 3T这样的工具去连接数据库。连接的时候会返回这样的错误&…

Redis:报错Creating Server TCP listening socket *:6379: bind: No error

错误&#xff1a; window下启动redis服务报错&#xff1a; Creating Server TCP listening socket *:6379: bind: No error 原因&#xff1a; 端口6379已被绑定&#xff0c;应该是因为上次未关闭服务 解决&#xff1a; ①依次输入命令&#xff1a; redis-cli.exe &#xff08…

RAG与LLM本身知识存在冲突时,大模型如何抉择?

原文&#xff1a;https://arxiv.org/pdf/2404.10198.pdf 引言 在人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;因其强大的语言理解和生成能力而备受关注。然而&#xff0c;这些模型在处理特定问题时可能会产生错误信息&#xff0c;即所谓的“幻觉”&…

【Redis(4)】Redis主从复制模式配置示例

Redis的三种高可用方案对比参考上一篇博客&#xff1a;深入理解Redis三种高可用方案&#xff0c;以做出明智的选择&#xff0c;下面要探讨的是三种方案其中的一种。 在构建高性能的缓存系统时&#xff0c;Redis以其卓越的性能和简单性成为了首选。本文将探讨Redis主从复制的工…

给c++小白的教程6:顺序结构

顺序结构&#xff0c;即代码从上往下顺序运行的结构。 一天&#xff0c;老师给赫炎出了道题:给定a,b,c,d四个整数&#xff0c;算出(ab)*c/d的值 这可难不倒学霸赫炎&#xff0c;但是你会用c来解决他吗&#xff1f; 首先要打出基础代码: #include<bits/stdc.h> using …

springcloud第4季 springcloud-alibaba之sentinel

一 sentinel介绍 1.1 sentinel作用 sentinel是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障服务的稳定性。 1.2 组成部分 sen…

基于人工智能的机动车号牌检测与推理系统v1.0

基于人工智能的机动车号牌检测与推理系统v1.0代码重构与实现。 目前整合3中现有算法&#xff0c;并完成阶段性改造&#xff0c;包括【传统方法检测车牌&#xff0c;SVM推理字符】、【YOLO方法检测车牌&#xff0c;SVM推理字符】、【YOLO方法检测车牌&#xff0c;CNN推理字符】&…

2024年第16周技术复盘

嗨~&#xff0c;我是小路&#xff0c;努力向上生长的前端开发工程师。以下是技术复盘的内容。 本杰明富兰克林曾说&#xff1a;“知识就是力量&#xff0c;而回顾则是保持这种力量的关键。”&#xff0c;第一次看到这话时&#xff0c;感觉脑海像被刺了一针似的&#xff0c;因为…

FPGA - 基于自定义AXI FULL总线的PS和PL交互

前言 在FPGA - ZYNQ 基于Axi_Lite的PS和PL交互中&#xff0c;介绍了基于基于AXi_Lite的PL和PS交互&#xff0c;接下来构建基于基于Axi_Lite的PS和PL交互。 AXI_GP、AXI_HP和AXI_ACP接口 首先看一下ZYNQ SoC的系统框图&#xff0c;如下图所示。在图中&#xff0c;箭头方向代表…

OpenHarmony 蓝牙相关API用法

介绍 本示例通过使用蓝牙低功耗心率服务&#xff0c;展示蓝牙相关API用法。实现了以下几点功能&#xff1a; 发现具有特定服务的设备。连接到设备。发现服务。发现服务的特征、如何读取给定特征的值、为特征设置通知等。 相关概念 BLE扫描&#xff1a;通过BLE扫描接口实现对…