Static静态代码块以及各代码块之间的执行顺序

文章目录

    • 代码块的分类
    • 1、静态代码块(也叫静态块、静态初始化块)
    • 2、构造代码块(也叫构造初始化块)
    • 3、代码块(又叫普通代码块、初始化块)
    • 执行顺序的代码测试
    • 继承中各代码块的执行顺序

前言
在Java中,Static静态代码块、构造代码块、普通代码块、构造函数的执行顺序是一个java学习者必须掌握的基础,本篇博客旨在让大家能清除了解它们之间的执行顺序。

代码块的分类

基本上代码块分为三种:Static静态代码块、构造代码块、普通代码块

代码块执行顺序静态代码块——> 构造代码块 ——> 构造函数——> 普通代码块

继承中代码块执行顺序:父类静态块——>子类静态块——>父类代码块——>父类构造器——>子类代码块——>子类构造器

1、静态代码块(也叫静态块、静态初始化块)

Java静态代码块中的代码会在类加载JVM时运行,且只被执行一次,也就是说这些代码不需要实例化类就能够被调用。一般情况下,如果有些代码必须在项目启动的时候就执行的时候,就需要使用静态代码块,所以静态块常用来执行类属性的初始化!

关于Static静态代码块的五个小结点

1、Java静态代码块中的代码会在类加载JVM时运行,且只被执行一次
2、静态块常用来执行类属性的初始化
3、静态块优先于各种代码块以及构造函数,如果一个类中有多个静态代码块,会按照书写顺序依次执行
4、静态代码块可以定义在类的任何地方中除了方法体中【这里的方法体是任何方法体】
5、静态代码块不能访问普通变量

针对4中描述静态代码块不能存在任何方法体中的原因其实也是很简单,由于普通方法是通过加载类,然后new出实例化对象,通过对象才能运行这个方法,而静态代码块只需要加载类之后就能运行了。对于静态方法,在类加载的时候,静态方法也已经加载了,但是我们必须要通过类名或者对象名才能访问,也就是说相比于静态代码块,静态代码块是自己主动运行的,而静态方法是被动调用运行的。不管是哪种方法,我们需要明确静态代码块的存在在类加载的时候就自动运行了,而放在不管是普通方法还是静态方法中,都是不能自动运行的。

针对5中描述静态代码块不能访问普通变量,原因同样简单。普通变量是被实例对象调用的,静态代码块中都不存在其实例对象,谈何调用变量?

Static静态代码块使用格式

static{..............
}
123

2、构造代码块(也叫构造初始化块)

听这名字就知道和构造方法离不开!没错,但是还是和构造方法有着本质区别,我们都知道,没个方法中都可以有很多构造方法,每创建一个对象其构造方法就执行一个,而一个构造方法可以创建N个对象,构造方法就比较“高冷”了,而构造代码块就比较“舔狗”了,只要该类实例了一个对象,构造代码就执行一次,利用每次创建对象的时候都会提前调用一次构造代码块特性,所以它可以做统计创建对象的次数功能。当然构造代码块用的相对少!

构造代码块小结

1、构造代码块在创建对象时被调用,每次创建对象都会调用一次
2、构造代码块优先于构造函数执行,同时构造代码块的运行依赖于构造函数
3、构造代码块在类中定义

针对2中的“依赖”可理解为如果不实例化对象(也就是不执行构造方法),构造代码块是不会执行的!

3、代码块(又叫普通代码块、初始化块)

代码块小结

1、普通代码块定义在方法体中
2、普通代码块与构造代码块的格式一致都是{}
3、普通代码块与构造代码块唯一能直接看出的区别是构造代码块是在类中定义的,而普通代码块是在方法体中定义的

执行顺序的代码测试

以上已经讲得差不多了,开始上代码了!

package com.gx.initializationblock;public class Initializationblock {int intA;int intB;public Initializationblock() {System.out.println("无参构造器00000000");}public Initializationblock(int a) {System.out.println("一个参数的构造器");}{intA = 10;intB = 15;System.out.println("构造初始化块11111");}{System.out.println("构造初始化块22222");}{System.out.println("构造初始化块33333");}//静态初始化块static {System.out.println("静态初始化块01010101");}static {System.out.println("静态初始化块0202020202");}public void method(){{System.out.println("普通初始化块");}}
}

测试demo

package com.gx.initializationblock;/* 初始化块一* 因为静态块是在类的初始化阶段完成的,* 因此在创建某个类的第二个对象时,该类的静态块就不会执行了* * 在单个类中,静态初始化块,初始化块,构造器* 多个类的继承中初始化块、静态初始化块、构造器的执行顺序
在继承中,先后执行父类A的静态块,父类B的静态块,最后子类的静态块,然后再执行父类A的非静态块和构造器,然后是B类的非静态块和构造器,最后执行子类的非静态块和构造器*/
public class Demo1 {public static void main(String[] args) {Initializationblock initializationblock = new Initializationblock();initializationblock.method();System.out.println("------------");//多打印几个对象的目的是:好看出Static静态代码块只执行一次!!!Initializationblock initializationblock2 = new Initializationblock(); //因为静态块是在类的初始化阶段完成的,因此在创建某个类的第二个对象时,该类的静态块就不会执行了initializationblock2.method();Initializationblock initializationblock3 = new Initializationblock();initializationblock3.method();}
}

打印结果

静态初始化块01010101
静态初始化块0202020202
构造初始化块11111
构造初始化块22222
构造初始化块33333
无参构造器00000000
普通初始化块
------------
构造初始化块11111
构造初始化块22222
构造初始化块33333
无参构造器00000000
普通初始化块
构造初始化块11111
构造初始化块22222
构造初始化块33333
无参构造器00000000
普通初始化块

得出结论:执行顺序静态代码块 > 构造代码块 > 构造函数 > 普通代码块

继承中各代码块的执行顺序

啥都不说了,直接撸代码:继承关系为 BaseThree——> BaseTwo——> BaseOne
BaseOne类

package com.gx.initializationblock;public class BaseOne {public BaseOne() {System.out.println("BaseOne构造器");}{System.out.println("BaseOne初始化块");System.out.println();}static {System.out.println("BaseOne静态初始化块");}}

BaseTwo类

package com.gx.initializationblock;public class BaseTwo extends BaseOne {public BaseTwo() {System.out.println("BaseTwo构造器");}{System.out.println("BaseTwo初始化块");}static {System.out.println("BaseTwo静态初始化块");}
}

BaseThree 类

package com.gx.initializationblock;public class BaseThree extends BaseTwo {public BaseThree() {System.out.println("BaseThree构造器");}{System.out.println("BaseThree初始化块");}static {System.out.println("BaseThree静态初始化块");}
}

测试demo2类

package com.gx.initializationblock;/*注:这里的ABC对应BaseOne、BaseTwo、BaseThree * 多个类的继承中初始化块、静态初始化块、构造器的执行顺序在继承中,先后执行父类A的静态块,父类B的静态块,最后子类的静态块,然后再执行父类A的非静态块和构造器,然后是B类的非静态块和构造器,最后执行子类的非静态块和构造器*/
public class Demo2 {public static void main(String[] args) {BaseThree baseThree = new BaseThree();System.out.println("-----");BaseThree baseThree2 = new BaseThree();}
}

运行结果

BaseOne静态初始化块
BaseTwo静态初始化块
BaseThree静态初始化块
BaseOne初始化块BaseOne构造器
BaseTwo初始化块
BaseTwo构造器
BaseThree初始化块
BaseThree构造器
-----
BaseOne初始化块BaseOne构造器
BaseTwo初始化块
BaseTwo构造器
BaseThree初始化块
BaseThree构造器

多个类的继承中初始化块、静态初始化块、构造器的执行顺序为:先后执行父类A的静态块,父类B的静态块,最后子类的静态块,然后再执行父类A的非静态块和构造器,然后是B类的非静态块和构造器,最后执行子类的非静态块和构造器【注:这里的ABC对应BaseOneBaseTwoBaseThree

结论:多个类的继承中初始化块、静态初始化块、构造器的执行顺序为:父类静态块——>子类静态块——>父类代码块——>父类构造器——>子类代码块——>子类构造器

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

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

相关文章

vue 组件 - 非单文件组件

一、定义组件 const school Vue.extend({name: xuexiao, // ----------------------------> 指定组件在开发者工具中显示的名字template: // ----------------------------> 模板<div>... 此处是结构</div>,data() { // ---------------------------->…

matlab安装好 启动总是闪退_在Ubuntu16.04下安装MATLAB2017b

1. 前言最近在折腾Ubuntu系统的高端机子&#xff0c;matlab这家伙的交互和可视化太方便了&#xff01;于是想在Linux下安装matlab&#xff0c;在各个版本中&#xff0c;matlab2017的性价比是非常高的&#xff0c;因此选择安装介个。阅读了很多帖子&#xff0c;综合找到几个靠谱…

vue 脚手架

一、 脚手架 初始 全局安装脚手架 npm i -g vue/cli切换到项目根目录&#xff0c;使用 vue create 项目名称 创建项目使用 npm run serve | yarn serve 启动项目 如果中途卡顿 使用 npm 淘宝镜像 npm config set registry --> https://registry.npm.taobao.orgvue 隐藏了…

这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析

前言 package com.jvm.classloader;class Father2{public static String strFather"HelloJVM_Father";static{System.out.println("Father静态代码块");} }class Son2 extends Father2{public static String strSon"HelloJVM_Son";static{Syste…

bigdecimal js 判断等于0_为啥阿里禁用BigDecimal的equals方法做等值比较

BigDecimal&#xff0c;相信对于很多人来说都不陌生&#xff0c;很多人都知道它的用法&#xff0c;这是一种java.math包中提供的一种可以用来进行精确运算的类型。很多人都知道&#xff0c;在进行金额表示、金额计算等场景&#xff0c;不能使用double、float等类型&#xff0c;…

脚手架 - ref

被用来给元素或子组件注册引用信息&#xff08;id的替代者&#xff09;应用在 html 标签上获取的是真实 DOM 元素&#xff0c;应用在组件标签上的是组件实例对象 VueComponent{}使用方式 (1). 打标识 <!-- 给真实 DOM 元素打标识 --> <h1 ref"xxx">...&…

git提交到github总是要输入密码_GitHub不为人知的秘密

本来想叫《GitHub骚操作》的&#xff0c;发现相关的文章已经有很多&#xff0c;而且和我本章要讲的内容完全不同&#xff0c;所以就换了这个也算贴切的标题。起因之前写过一篇文章《VM Manager 插件分享》&#xff0c;事后我发现有个地方不对劲&#xff01;看之前文章标题大家应…

MyBatis中大于号以及小于号的表达方式

mybatis使用的是xml格式的文件。使用>和<号的时候&#xff0c;会存在与xml的标签的规范冲突。 1.场景还原 在实际项目中&#xff0c;有很多需求需要通过设定一个具体的时间段来搜索或过滤所需的数据&#xff0c;今天笔者就mybatis中时间比较涉及到的大于&#xff0c;小于…

脚手架 - props

一、props — 让组件接收外部传过来的数据 传递数据 <Example name"xxx"/>接收数据 // 1. 只接收 props: [name]// 2. 接收并限制类型 props: {name: String }// 3. 接收、限制类型、必要性、默认值 props: {name: {type: String, // 类型required: true, /…

mybatis plus当月数据查询_Springboot+mybatis(plus)+druid多数据源

前言:我不太喜欢AOP读自定义注解来切换数据源.因为如果我一个业务里需要同时查2个数据源的数据而又不想把这个业务拆成2个方法的时候,就比较麻烦了.所以我打算根据package来扫描注入不同的DataSource.可能是我搜索的姿势不太对 , 资料比较少.也会碰到不少坑.所以记录一下.正文:…

mybatis里mapper.xml中SQL语句if语句嵌套if语句

为了实现一个sql可以根据条件不同实现sql语句的动态查询&#xff0c;所以在使用mybatis时&#xff0c;对应的mapper.xml的sql语句可以根据条件值的不同执行不同的sql语句&#xff0c; 最开始在我的where子句中我的if语句是这么写的&#xff1a; <where><if test"…

脚手架 mixin (混入)

可以把多个组件共用的配置提取成一个混入对象 使用方式&#xff1a; 定义混合 {data() {},methods() {}... }使用混合 // 1. 引入混合 import {hunhe1, hunhe2} from /..mixin/// 1. 在 main.js 中全局混入&#xff1a; Vue.mixin(hunhe1)// 2. 局部混入 mixins: [hunhe1]

ug冲模标准件库_昆山兴模lt;携手gt;武汉益模,打通冲模“智能设计+精益管理”的最后一道关卡...

武汉益模科技股份有限公司是国内领先的工业互联网及智能制造的解决方案提供商&#xff0c;为模具、装备、军工、汽车、家电及等有柔性化生产需求的工厂提供专业的智能设计/信息化管理/智能加工/数字化工厂等工业软件、工业机器人自动化以及智能装备&#xff0c;拥有麦格纳、安波…

SpringBoot 异常回滚 事务的使用___Springboot @Transactional 事务不回滚

Springboot中事务的使用&#xff1a; 1、启动类加上EnableTransactionManagement注解&#xff0c;开启事务支持&#xff08;其实默认是开启的&#xff09;。 2、在使用事务的public&#xff08;只有public支持事务&#xff09;方法&#xff08;或者类-相当于该类的所有public…

简述网络调研的作用_利用龙伯球透镜天线提升高铁4G网络覆盖

透镜天线&#xff0c;一种能够通过电磁波&#xff0c;将点源或线源的球面波或柱面波转换为平面波从而获得笔形、扇形或其他形状波束的天线。通过合适设计透镜表面形状和折射率 n&#xff0c;调节电磁波的相速以获得辐射口径上的平面波前。透镜天线吸收了许多光信息工程技术&…

脚手架 插件

一、定义插件 plugin.js --> export default{} --> install() --> // 全局过滤器 Vue.filter(myFilter, function (value) {return value.slice(0, 4); });// 全局指令 Vue.directive("fbind", {bind(element, binding) {element.value binding.value;},i…

SQLIntegrityConstraintViolationException: 异常解决

SQLIntegrityConstraintViolationException: Duplicate entry ‘xxx’ for key yyyzzz’异常解决 一. 异常现象 在做Java Web项目操作数据库添加数据的时候&#xff0c;突然发现曝出如下图所示异常&#xff1a; Caused by: java.sql.SQLIntegrityConstraintViolationExceptio…

scoped 样式

一、加不加 scoped &#xff1f; 加上之后&#xff0c;让样式在局部生效&#xff0c;防止冲突 <!-- a.vue --> <style lang"less" scoped> #bg-red {background-color: #f00; } </style>不加&#xff0c;相当于是定义的全局样式&#xff0c;每个…

一步怎么测量图片_测量不容易?15套测量仪器实操手册+自动计算表格,自学也可以...

测量不容易&#xff1f;15套测量仪器实操手册自动计算表格&#xff0c;自学也可以很多施工羡慕测量工资高&#xff0c;但是测量工资高也就意味着责任大&#xff0c;施工在休息的时候测量就下工地了&#xff0c;施工聚会的时候&#xff0c;测量在埋头苦算。如果施工想要干测量该…

controller的异常处理以及service层的事务控制___controller层 trycatch不影响service层抛出的异常

controller的异常处理以及service层的事务控制 最近写代码涉及到一些事务&#xff0c;上午终于把代码给理顺了&#xff0c;之前不太清楚在哪里做异常处理&#xff0c;导致代码遍地try-catch&#xff0c;相当难看。 还是基于controller-service-dao三层来写代码&#xff0c;从…