`
陌陌天使
  • 浏览: 21624 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论

java中静态块与非静态块以及自由块与构造函数执行顺序分析

阅读更多

 

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

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

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浏览器!!

 

 

 

 

 

  • 大小: 6.7 KB
  • 大小: 6.4 KB
  • 大小: 11.6 KB
  • 大小: 16.1 KB
分享到:
评论

相关推荐

    java类中静态域、块,非静态域、块,构造函数的初始化顺序

    java类中静态域、块,非静态域、块,构造函数的初始化顺序,通过本例子,能够清楚了解到java类的初始化顺序

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    在Java中自由块的执行顺序

    java中的自由块分为静态的自由块和非静态的自由块。非静态自由块的执行时间是:在执行构造函数之前。静态自由块的执行时间是:class文件加载时执行。

    举例说明Java中代码块的执行顺序

    主要介绍了举例说明Java中代码块的执行顺序,包括静态属性和非静态属性以及构造函数等相关的执行先后,需要的朋友可以参考下

    Java开发技术大全(500个源代码).

    staticBlock.java 演示静态块的使用 staticVar.java 定义静态变量 supplyTest.java 对象作为静态成员使用示例 trySwap.java 试图交换两个形参的值 useOnlyTest.java 创建多个对象,演示this的作用 ...

    Java中类的加载顺序

    不过我们可以换个直接的问法,如果类A和类B中有静态变量,静态语句块,非静态变量,非静态语句块,构造函数,静态方法,非静态方法,同时类A继承类B,请问当实例化A时,类内部的加载顺序是什么?  当时我也是一头...

    JAVA面试题最全集

    给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46.访问修饰符“public/private/protected/缺省的修饰符”的使用 47.用关键字final修饰一个类或者方法时,有何意义? 48.掌握类和...

    java 面试题 总结

    不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)...

    java编程基础,应用与实例

    5.11 构造函数 79 5.12 类的初始化 83 5.12.1 静态块 84 5.12.2 实例块 84 5.13 巩固练习 85 第6章 数组 86 6.1 基本数据类型数组 86 6.2 一维数组的初始化 88 6.3 对象数组 88 6.4 二维数组 ...

    疯狂JAVA讲义

    学生提问:非静态内部类对象和外部类对象的关系是怎样的? 206 6.7.2 静态内部类 207 学生提问:为什么静态内部类实例方法也不能访问外部类的实例属性呢? 207 学生提问:接口里是否能定义内部接口? 208 6.7.3 ...

    Java并发编程实战

    如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性能和可伸缩性等内容,最后介绍了一些高级主题,如显式锁、原子变量、非阻塞算法以及如何开发自定义的...

    Java面试宝典-经典

    3、存储过程与触发器必须讲,经常被面试到? 92 4、数据库三范式是什么? 94 5、说出一些数据库优化方面的经验? 95 6、union和union all有什么不同? 96 7.分页语句 97 8.用一条SQL语句 查询出每门课都大于80分的学生...

    Java面试宝典2010版

    3、存储过程与触发器必须讲,经常被面试到? 92 4、数据库三范式是什么? 94 5、说出一些数据库优化方面的经验? 95 6、union和union all有什么不同? 96 7.分页语句 97 8.用一条SQL语句 查询出每门课都大于80分的学生...

    java面试题大全(2012版)

    3、存储过程与触发器必须讲,经常被面试到? 92 4、数据库三范式是什么? 94 5、说出一些数据库优化方面的经验? 95 6、union和union all有什么不同? 96 7.分页语句 97 8.用一条SQL语句 查询出每门课都大于80分的学生...

    超级有影响力霸气的Java面试题大全文档

    不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。  接口(interface...

    最新Java面试宝典pdf版

    3、存储过程与触发器必须讲,经常被面试到? 92 4、数据库三范式是什么? 94 5、说出一些数据库优化方面的经验? 95 6、union和union all有什么不同? 96 7.分页语句 97 8.用一条SQL语句 查询出每门课都大于80分的学生...

Global site tag (gtag.js) - Google Analytics