当前位置: 首页 > news >正文

一道阿里类的初始化顺序笔试题

问题很简单,就是下面的代码打印出什么?

public class InitializeDemo {private static int k = 1;private static InitializeDemo t1 = new InitializeDemo("t1" );private static InitializeDemo t2 = new InitializeDemo("t2");private static int i = print("i");private static int n = 99;{print( "初始化块");j=100;}public InitializeDemo(String str) {System.out.println((k++) + ": " + str + "   i= " + i + "   n=" + n);++i;++n;}static {print("静态块");n = 100;}private int j = print("j");public static int print(String str) {System.out.println((k++) + ": "+ str +"   i="+i+"    n="+n);++n;return ++i;}public static void main(String[] args){InitializeDemo test = new InitializeDemo("test");}
}
//运行结果
1: 初始化块   i=0    n=0
2: j   i=1    n=1
3: t1   i= 2   n=2
4: 初始化块   i=3    n=3
5: j   i=4    n=4
6: t2   i= 5   n=5
7: i   i=6    n=6
8: 静态块   i=7    n=99
9: 初始化块   i=8    n=100
10: j   i=9    n=101
11: test   i= 10   n=102

分析:唯一的问题就是弄清楚java类的初始化顺序。main方法执行前,进行类的初始化。类的初始化一般只执行一次:(静态属性=静态代码块)>(非静态属性=匿名构造器=非静态代码块)>非匿名构造器
先对静态属性和静态代码块进从上到下的初始化
在这里插入图片描述
(1)k=1;
(2)new一个对象t1,t1也是一个InitializeDemo 类型的对象,所以要对InitializeDemo 非静态变量,非静态代码块以及构造器依次进行初始化

  • 在这里插入图片描述
    加载第一个非静态代码块,执行print方法(i和n的初始值是0)
    输出 ===> 1: 初始化块 i=0 n=0
    (k=2,i=1,n=1,j=100)
  • 在这里插入图片描述加载下一个非静态变量j,执行print方法
    输出 ===> 2: j i=1 n=1
    (k=3,i=2,n=2,j=2)

  • 执行带参构造器
    输出 ===> 3: t1 i= 2 n=2

(3)完成t1后,t2与t1同理,依次输出===>
4: 初始化块 i=3 n=3
5: j i=4 n=4
6: t2 i= 5 n=5

(k=7,i=6,n=6)
(4)接着初始化i,执行print方法
输出===> 7: i i=6 n=6
(k=8,i=7,n=7)
(5)n=99;
(6)执行静态代码块
在这里插入图片描述
输出===> 8: 静态块 i=7 n=99
(k=9,i=8,n=100)
(7)最后 new InitializeDemo(“test”) 和t1,t2相同输出三次===>

9: 初始化块 i=8 n=100
10: j i=9 n=101
11: test i= 10 n=102

http://www.lryc.cn/news/25431.html

相关文章:

  • cuda找不到路径报错
  • Elasticsearch进阶之(核心概念、系统架构、路由计算、倒排索引、分词、Kibana)
  • Android包体积缩减
  • 【华为OD机试】 网上商城优惠活动(C++ Java Javascript Python)
  • GWT安装过程
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
  • office@word@ppt启用mathtype组件方法整理
  • 计算机大小端
  • Matplotlib绘图从零入门到实践(含各类用法详解)
  • C语言 入门教程||C语言 指针||C语言 字符串
  • Nacos2.x+Nginx集群配置
  • Android源码分析 - InputManagerService与触摸事件
  • python库--urllib
  • 美团前端二面常考react面试题及答案
  • 环境搭建04-Ubuntu16.04更改conda,pip的镜像源
  • 【C++进阶】四、STL---set和map的介绍和使用
  • JavaSE学习进阶 day1_01 static关键字和静态代码块的使用
  • 苹果笔可以不买原装吗?开学必备性价比电容笔
  • 数据库连接与properties文件
  • Linux上的校验和验证
  • 杂记——14.git在idea上的使用及其实际开发介绍
  • 记一次Nodejs减低npm版本的踩坑日记
  • 【iOS】—— 初识RAC响应式编程
  • Java——面向对象
  • 电影《毒舌律师》观后感
  • 【活学活用掌握trap命令】
  • 计算机组成原理4小时速成6:输入输出系统,io设备与cpu的链接方式,控制方式,io设备,io接口,并行串行总线
  • MyBatis源码分析(三)SqlSession的执行主流程
  • 环境搭建01-Ubuntu16.04如何查看显卡信息及安装NVDIA显卡驱动
  • 内网渗透测试理论学习之第四篇内网渗透域的横向移动