类的加载顺序问题-demo展示

      面试的的时候经常会被问到包含静态代码块、实例代码块和构造器等代码结构的加载顺序问题,下面借用一个面试题,回顾一下类的代码加载顺序。

public class AooTest {public static void main(String[] args) {AooTest.f1();}static AooTest test1 = new AooTest();static {System.out.println("1");}{System.out.println("2");}AooTest() {System.out.println("3");System.out.println("a=" + a + ", b=" + b);}private static void f1() {AooTest aooTest = new AooTest();System.out.println("4");}int a = 5;static int b = 6;
}

先看一下输出结果:

2
3
a=5, b=0
1
2
3
a=5, b=6
4

      这个题比较绕,一般就是面试的时候故意出的费脑细胞的题,开发的时候压根不会碰到。但是这种题能够加深我们对类加载机制的理解,现在我们逐行去分析一下:

1、首先执行main方法,这里会执行当前AooTest类的加载,引起类加载有7种情况:

      1.1:创建类的实例,new关键词;
      1.2:访问类或接口的静态变量,或者对静态变量赋值;
      1.3:调用类的静态方法;
      1.4:程序的启动类所在的类;
      1.5:初始化一个类的子类时会引起父类的主动使用和初始化;
      1.6:反射,如Class.forName("com.cn.Test01");
      1.7:jdk1.7之后的动态语言支持也会引起类的初始化。

2、类的加载会出发静态代码块,这个题里面有多个静态属性和静态代码块,按照从上往下的顺序执行,依次是:

3、这里在执行1的时候,就去执行new AooTest(),对当前类实例化,那么实例化就需要执行成员属性赋值和实例代码块、之后再执行构造器,如果有多个成员属性或者多个实例代码块也是从上往下的顺序执行,这里我们看下:

所以,先输出 2(步骤1.1),之后对a赋值 a= 5(步骤1.2)。

然后再执行构造器的代码(步骤1.3),首先输出 3,接下来输出 a = 5, b=0,这里有些同学会有疑问,为什么 b 是0呢?大家注意看,前面类加载的时候,我们只是执行了步骤1,而 静态属性b的赋值要到步骤3种才能执行,所以这里b是没有被赋值的,默认是0。

4、然后回到前面的图,执行步骤2,输出1

5、再往下执行步骤3,注意这里b会被赋值了 b =6。

经过以上步骤,类的加载执行完成,所有的静态属性和静态代码块都执行完成。

6、下面进入了main方法,执行了 AooTest.f1()函数。

在f1方法里面,AooTest又一次被实例化了,所以如果前面被实例化的步骤一样,实例代码块输出2,构造器输出3,接下来输出输出 a = 5, b=6,这里注意,b在前面已经赋值了,所以与上面的输出不同。

7、实例化结束之后,最后输出 4 。

最后来总结一下类加载的顺序:

1、最先加载静态成员变量、静态代码块,如果有多个,按照从上往下的顺序加载;

2、其次实例化普通成员变量、实例代码块,如果有多个,按照从上往下的顺序执行;

3、最后执行构造器函数

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

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

相关文章

免费的云服务器推荐~三丰云

对于许多初创企业和小型公司来说,寻找一个经济实惠且可靠的云服务提供商是至关重要的。在这方面,三丰云以其免费虚拟主机和云服务器吸引了大量用户。 1. 注册与界面 注册三丰云的账户过程简单明了,只需按照步骤填写必要信息即可。其界面设计…

Centos7:Jenkins+gitlab+node项目启动(1)

Centos7:Jenkinsgitlabnode项目启动(1) Centos7:Jenkinsgitlabnode项目启动(1)-CSDN博客 Centos7:Jenkinsgitlabnode项目启动(2) Centos7:Jenkinsgitlabnode项目启动(2)-CSDN博客 Centos7:Jenkinsgitlabnode项目启…

逻辑卷使用和扩容

1.逻辑卷管理LVM ( Logical Volume Manager) 是 Linux 下对硬盘分区的一种管理机制 /boot分区用于存放引导文件,不能基于lvm创建 2.分区缺点: 无法动态扩容 必须使用连续的空间 没有备份 逻辑卷 lvm: 可以动态扩容…

Python高级用法:生成器(generator)

生成器(generator) 生成器是一种返回生成序列的方法,与直接使用列表等方式返回序列的方式不同的是,他的生成可以是无限的。 生成器可以与next搭配使用,可以被看作是一种特殊的迭代器。 yield语句 yield一般与循环相…

单集群400TB,OceanBase稳定支撑快手核心业务场景

一款日均超过千万人访问的短视频 App 快手,面对高并发流量如何及时有效地处理用户请求?通过在后端配置多套 MySQL 集群来支撑高流量访问,以解决大数据量存储和性能问题,这种传统的 MySQL 分库分表方案有何问题?快手对分…

【C++】STL 容器 - set 集合容器 ① ( set 集合容器简介 | set 集合容器操作的时间复杂度 | set 集合容器常用操作 )

文章目录 一、set 集合容器1、set 集合容器简介2、set 集合容器操作的时间复杂度3、set 集合容器常用操作 二、代码示例 - set 集合容器1、代码示例2、执行结果 一、set 集合容器 1、set 集合容器简介 C 语言中的 STL 容器中的 set 容器 , 是 " 集合容器 " , 容器中…

在Go语言中处理HTTP文件上传

大家好,我是你们可爱又迷人的编程小助手,今天要带你们一起探讨在Go语言中如何处理HTTP文件上传,让我们把这场技术之旅变得轻松有趣吧! 首先,想象一下这个场景:你是一个网站的开发者,用户们急切…

使用 SSH 方式实现 Git 远程连接GitHub

git是目前世界上最先进的分布式版本控制系统,相比于SVN,分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作!当有网络的时候,再把本地提交推送一下就完成了同步&…

MongoDB Certified Associate Developer 认证考试心得

介绍 前段时间通过了 MongoDB Associate Developer 考试,也记下了一些心得,结果忘记发出来了,现在重新整理下。通过考试后证书是这样的: MongoDB 目前有两个认证证书 1. MongoDB Associate Developer 认证掌握使用MongoDB 来构建现代应用…

【一分钟】ThinkPHP v6.0 (poc-yaml-thinkphp-v6-file-write)环境复现及poc解析

写在前面 一分钟表示是非常短的文章,只会做简单的描述。旨在用较短的时间获取有用的信息 环境下载 官方环境下载器:https://getcomposer.org/Composer-Setup.exe 下载文档时可以设置代理,不然下载不上,你懂的 下载成功 cmd cd…

Linux环境grep搜索方法记录

1 grep grep 命令,用来搜索字符串所在位置,可以具体到不同文件,不同行; 在Linux 下,查看命令释义如下 zhaocubuntu2004:~$ grep --help Usage: grep [OPTION]... PATTERNS [FILE]... Search for PATTERNS in each FI…

C#获取windows系统资源使用情况

1.前言 之前有一篇博客介绍如何获取Linux服务器上的资源使用情况《Java 获取服务器资源(内存、负载、磁盘容量)》,这里介绍如何通过C#获取Window系统的资源使用。 2.获取服务器资源 2.1.内存 [DllImport("kernel32.dll")][retu…

Maven项目提示Ignored pom.xml问题

1 环境 (1)IDEA开发工具:2022.2.1 (2)JDK:Java17(Spring6要求JDK最低版本是Java17) (3)Spring:6.1.2 (4)Maven 3.8.8 2 …

C#上位机与欧姆龙PLC的通信06---- HostLink协议(FINS版)

1、介绍 对于上位机开发来说,欧姆龙PLC支持的主要的协议有Hostlink协议,FinsTcp/Udp协议,EtherNetIP协议,本项目使用Hostlink协议。 Hostlink协议是欧姆龙PLC与上位机链接的公开协议。上位机通过发送Hostlink命令,可…

计算机组成原理复习7

内存管理 文章目录 内存管理存储器概述存储器的分类按在计算机中的作用(层次)分类按存储介质分类按存取方式分类按信息的可保存性分类 存储器的性能指标存储容量单位成本存储速度:数据传输率数据的宽度/存储周期 存储器的层次化结构多级存储系…

Java注解学习,一文掌握@Autowired 和 @Resource 注解区别

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

Unity坦克大战开发全流程——开始场景——开始界面

开始场景——开始界面 step1:设置UI 反正按照这张图拼就行了 step2:写脚本 前面的拼UI都是些比较机械化的工作,直到这里写代码的时候才真正开始有点意思了,从这里开始,我们就要利用面向对象的思路来进行分析&#xff1…

【量化】蜘蛛网策略复现

文章目录 蜘蛛网策略研报概述持仓数据整理三大商品交易所的数据统一筛选共有会员清洗数据计算研报要求数据全部代码 策略结果分析无参数策略有参数策略正做反做 MSD技术指标化 蜘蛛网策略 策略来自《东方证券-股指期货趋势交易之蜘蛛网策略——从成交持仓表中捕捉知情投资者行为…

从实际工作情况,介绍嵌入式(MCU)软件开发常用(通用)工具

目录 前言 1、代码阅读及编辑工具(VSCode、Understand) 2、代码对比工具(Beyond Compare) 3、代码仓库相关工具(Git、SVN、Tortoise) 4、文本编辑器(Notepad) 5、电脑文件搜索工…

Springcloud Alibaba使用Canal将Mysql数据实时同步到Redis保证缓存的一致性

目录 1. 背景 2. Windows系统安装canal 3.Mysql准备工作 4. 公共依赖包 5. Redis缓存设计 6. mall-canal-service 1. 背景 canal [kənl] ,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。其诞…