博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
变量、初始化块和构造方法的初始化顺序问题(笔试题)
阅读量:5052 次
发布时间:2019-06-12

本文共 1602 字,大约阅读时间需要 5 分钟。

在某公司面试时碰见的该题目,

给出如下程序,让写出程序打印的语句的顺序,也就是程序加载执行的过程。

当时确实有些懵了,只根据大体印象写了答案。回来后写程序跑了一遍,自己还真是没猜对。所以贴出来帮助记忆并与大家共赏!!

package com.skd.timu;public class Demo4 {	public static void main(String[] args) {		new childrenDemo();		new childrenDemo();	}}class ParentDemo{	 static	String staParentString="父类-静态-变量";	 String parentString="父类-非静态-变量";		 static{		 System.out.println(staParentString);		 System.out.println("父类 -  静态 - 初始化块");	 }	 {		 System.out.println(parentString);		 System.out.println("父类 - 非静态 - 初始化块");	 }	 ParentDemo(){		 System.out.println("父类-构造方法");	 }}class  childrenDemo extends ParentDemo{	static	String staChildrenString="子类-静态-变量";	 String childrenString="子类-非静态-变量";		 static{		 System.out.println(staChildrenString);		 System.out.println("子类 -  静态 - 初始化块");	 }	 {		 System.out.println(childrenString);		 System.out.println("子类- 非静态 - 初始化块");	 }	 childrenDemo(){		 System.out.println("子类-构造方法");	 }}

看完该程序不妨自己先写个输出语句的顺序然后写程序执行看是否与自己的判断一致。

先把程序执行的结果贴上:

父类-静态-变量父类 -  静态 - 初始化块子类-静态-变量子类 -  静态 - 初始化块父类-非静态-变量父类 - 非静态 - 初始化块父类-构造方法子类-非静态-变量子类- 非静态 - 初始化块子类-构造方法父类-非静态-变量父类 - 非静态 - 初始化块父类-构造方法子类-非静态-变量子类- 非静态 - 初始化块子类-构造方法

从输出结果可以看出,静态变量和静态初始化块只在程序加载的时候执行一次,执行次序在最前面,是全局的;

构造块的加载顺序在静态块之后但在构造方法之前,而且在构造块加载之前,变量已经加载;

构造方法是在静态变量,静态块,变量,构造块后才加载的,是在类实例化时,除了调用方法外的最后加载的位置;

因为静态变量和静态块都是全局的,因此在程序加载时就已经加载,不会因为是子类中的静态变量和静态块就比父类的构造块加载晚,但在都是静态变量或静态块的情况下,

总是先初始化父类的,然后初始化子类的。

同样的因为构造块和构造方法不是全局的,而且子类在实例化时总是先调用父类的构造块和构造方法,因此父类的构造块和构造方法在子类的之前调用。即在实例化子类时,程序会先调用父类的实例化构造块或者构造方法,然后才会调用子类的构造块和构造方法完成子类的实例化。

而且,构造块和构造方法会在每次实例化的时候都执行,静态变量和静态块只会执行一次(不管该类实例化多少对象)。

转载于:https://www.cnblogs.com/JZZ1026/p/4417324.html

你可能感兴趣的文章
[Unity3D]Unity3D游戏开发MatchTarget的作用攀登效果实现
查看>>
ACdream 1115 Salmon And Cat (找规律&&打表)
查看>>
JSON、JSONP、Ajax的区别
查看>>
AngularJS学习篇(一)
查看>>
关于Xshell无法连接centos6.4的问题
查看>>
css3动画——基本准则
查看>>
javaweb常识
查看>>
Java注解
查看>>
web自己主动保存表单
查看>>
一个小的日常实践——高速Fibonacci数算法
查看>>
机器学些技法(9)--Decision Tree
查看>>
drf权限组件
查看>>
输入月份和日期,得出是今年第几天
查看>>
Qt中子窗口全屏显示与退出全屏
查看>>
使用brew安装软件
查看>>
[BZOJ1083] [SCOI2005] 繁忙的都市 (kruskal)
查看>>
吴裕雄 python 机器学习——数据预处理嵌入式特征选择
查看>>
Centos6.4安装JDK
查看>>
201521123069 《Java程序设计》 第4周学习总结
查看>>
线性表的顺序存储——线性表的本质和操作
查看>>