java中静态块与非静态块以及自由块与构造函数执行顺序分析_陌陌天使的博客-程序员信息网

技术标签: 基础知识总结  static  非静态块  自由块  执行顺序  静态块  

 

首先,让我们用一个简单的程序来引入主题:

***********************程序*********************

package cn.kml.forserver20130730;
/**
 * 定义一个用于测试自由块以及构造器执行顺序的父类
 * @author 柯美玲  QQ:794950040
 */
public class Detail{
	public static int a;
	public Detail(){//构造器
		System.out.println("Detail构造器");
	}
	{//非静态块
			System.out.println("Detail非静态"); 
	}
	static{//静态块
		System.out.println("Detail静态块");
}
	public static void main(String[] args) {
		System.out.println("main1");
		Detail detail=new Detail();
	}
}

 

***********************运行结果*********************



 

 

在此刻,你是不是觉得很神奇!为什么构造函数不是最先执行的?你是不是开始怀疑我的结果,

其实不用怀疑,谁试谁知道………………

 

 

在了解具体的原因之前,让我们先来看一下,当一个程序执行时,需要做哪些准备工作。

那当然就是类装载器要把程序装载到虚拟机上。装载过程分为三个部分:装载,链接和初始化

其中链接又分为三部分:校验,解析,准备。下面分别列出具体作用:

                      装载:查找和导入类或接口的二进制数据

                      链接:进行下面三个步骤,其中解析步骤是可选择的。

                      校验:检查导入类或者接口的二进制数据是否正确

                      解析:将符号引用转成直接引用

                      准备:给类的静态变量分配并初始化储存空间

                      初始化:初始化静态变量以及执行静态块代码

如下图所示:

            

 

 

所以说,由上面可以得出,静态变量的分配空间与初始化以及静态自由块的执行都是在.class

文件加载时,也就是主函数执行之前。

 

总结:

           **************************静态块与非静态块***************************

           java中一个类中除了有属性,方法之外,还可以有自由块。

           自由块又可以分为静态块和非静态块。

           虽同为自由块,但静态块和非静态块的执行是有很大区别的。

           由本文最初给出的程序及结果可知:

           静态块最先执行,而且只会执行一次;

           而非静态块是在每次实例化类的对象时执行的,而且执行在构造器之前。

 

         ***********************静态属性与一般属性**************************

         静态属性的初始化是在类装载过程中切只执行一次,先于主函数的执行    

 

         非静态属性的初始化在实例化对象时,先于构造器的执行  

       

          当类与类之间存在继承关系时:如下

             

package cn.kml.forserver20130730;
/**
 * 定义一个用于测试自由块以及构造器执行顺序的子类,继承Detail类
 * @author 柯美玲  QQ:794950040
 */
public class subDetail extends Detail{
	public subDetail(){//构造器
		System.out.println("subDetail构造器");
		}
		{  //非静态块
		 System.out.println("subDetail非静态块"); 
		}  
		static {  //静态块
		System.out.println("subDetail静态块"); 
		}  
		public static void main(String args[]){ 
			System.out.println("subDetailmain"); 
			subDetail te=new subDetail(); 
		}  
	}

 运行结果:



            当存在继承关系时,先执行父类的静态块,再执行子类的静态块

            接下来执行子类的主函数

           若实例化子类的对象,先执行父类的非静态块,再执行父类的构造函数

                                            然后执行子类的非静态块,最后执行子类的构造函数

 

           再如以下程序:

                            

package cn.kml.forserver20130730;
/**
* 定义一个用于测试自由块以及构造器执行顺序的子类,继承subDetail类
 * @author 柯美玲  QQ:794950040
 */
public class subbDetail extends subDetail{
	public subbDetail(){//构造器
		System.out.println("subbDetail构造器");
	}
	static{//静态块
		System.out.println("subbDetail静态快");
	}
	{//非静态块
		System.out.println("subbDetail非静态快");
	}
	public static void main(String[] args) {
		System.out.println("subbDetail  main");
		subbDetail sDetail = new subbDetail();
	}
}

            运行结果:

      

 

由以上结果显而易见,自由块与构造器的执行顺序。

 

 

 

 纪念整整崩了15次的google浏览器!!

 

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011290954/article/details/84471679

智能推荐

关于layer.js 弹出框表单提交关闭父窗口出现表单提交失效的问题_超越自己看到的的博客-程序员信息网

对于layer.js出现回调关闭父类的弹出层时,之前的表单的submit失效的问题:     如何解决:网上有很多,有的是转为ajax的请求,在数据传输完再关闭父类的弹出层:     下面是关闭父弹出层的办法:        var index = parent.layer.getFrameIndex(window.name); //获取窗口索引        parent.lay

技术小白记录工作遇到的问题_唯他命的博客-程序员信息网

**刚毕业的程序员找工作有多难!!!!!太难了本人女,今年毕业的大专程序员(技术小白),找个两个月的工作,现今在一家企业上班(在我眼中很大的公司),公司的项目正在测试所以我没啥事,所以想用博客记录我的程序员生活。。。原因三个不知道干啥无意间看见一个博客专家写了一本书,想像他一样在人世间留点痕迹,至少也有吹牛的资本,啊哈哈哈哈记录刚毕业的孩子在公司的任务,给像我一样刚刚步入社会的人一...

VB ADO常用方法_fengzhou8417的博客-程序员信息网

 VB使用ADODB操作数据库的常用方法ADO常用方法下面是我所掌握的使用ADO对数据库操作的一些常用方法,主要是提供给初学者作为参考,有不对的地方请指正。如有补充不胜荣幸准备工作========Dim conn As New ADODB.Connection 创建一个 Connection 实例,在这里使用New等于将Dim和Set合并为一段代码执行Dim rs As AD

mac 快速启动jmeter_Novela_888的博客-程序员信息网

操作步骤:1、下载jmeter在电脑中解压。2、在终端输入命令,vim ~/.bash_profile,在配置文件中输入export JMETER_HOME=/Users/yu.xiang/Documents/downloads/jemeter/apache-jmeter-3.2export PATH=$M2_HOME/bin:$JMETER_HOME/bin:JAVA_HOM...

继把数据中心沉入海底后,微软又把服务器浸入了“按摩浴缸”_菜鸟学Python的博客-程序员信息网

大数据文摘作品作者:Mickey数据中心的能耗问题一直是各家科技公司的“老大难”问题。据统计,美国国内的数据中心的耗电量,占到了全美电能消耗的2%。数据中心快速增长也造成了巨大的能耗。...

随便推点

java struts1_J2EE学习篇之--Struts1详解_weixin_39850787的博客-程序员信息网

今天来看一下Struts1的相关知识,其实Struts现在是出名的,每个Web开发者都会知道的,也是现在比较流行的框架,下面就来看一下我们为什么要用Struts框架呢?摘要1.建立在mvc这种好的模式上的,Struts在m,v,c上都有涉及,但主要的是提供一个好的控制器和一套定制的标签库上也就是说它在这里体现在c和v上,有mvc的一系列的优点,如:结构层次分明,高重用性,增加了程序的健壮性和可伸缩...

win10报错jar不是内部或外部命令,也不是可运行的程序_lvxiucai的博客-程序员信息网_jar不是

1.问题:今天在cmd命令行中要用jar命令打包,却发现出现错误。 错误提示:jar不是内部或外部命令,也不是可运行的程序 但是java -version没有任何问题。2.解决:首选需确认配置了系统的Java环境变量,而不是用户的环境变量。 如:JAVA_HOME:C:\Program Files\Java\jdk1.8.0_191问题就就出在这个P...

python爬虫(一)入门常见错误集合_小幽余生不加糖的博客-程序员信息网

在入门爬虫的时候遇到不少问题,和不是唯一的解决方法的方法,总结整理一下,供大家学习交流。syntaxerror: invalid syntax语法错误:无效语法syntaxerror: unexpected EOF while parsing语法错误:多了无法解析的符号(检查是否多了或少了括号)syntaxerror: invalid character in identifier语法错误:有无效标识符(检查中文符号)indexerror: list index out of ran

map判断key不区分大小写_WI_232995的博客-程序员信息网

需要学习视频资料请加qq 1686763368有时候我们会需要一个不区分KEY大小写的MAP,当然仅仅是Map<String, Object>这种类型的Map今天介绍一个apache.commons包里的类,org.apache.commons.collections.map.CaseInsensitiveMap例子: public static void main(S...

计算机更新后打印机无法使用,Win10升级后惠普打印机无法打印的解决方法_莫秀娴的博客-程序员信息网

近来有一些用户反馈Win10系统升级之后,连接的一台惠普打印机无法打印了,出现类似的问题主要原因就是Win10升级后一些打印机相关软件没有迁移成功,打印时会出现HP ENVY e-All-in-One打印机安装失败,这是由于驱动导致的!那么下面这篇文章可以很好的帮助大家修复Win10升级后惠普打印机无法使用的问题。详细修复教程如下:步骤一:删除惠普打印机驱动和软件首先我们需要先删除惠普打印机驱动和...

鲍岳桥,一个程序员的成功路线图_rimoer的博客-程序员信息网

鲍岳桥,一个程序员的成功路线图作者:孙小羽 | <!--发表者: <a href="http://www.iteer.net/userinfo.php?uid=4">hawk</a></span> <span class="itemPostDate">于-->2005-11-13 17:51:57 (14515 次阅读)

推荐文章

热门文章

相关标签