`
陌陌天使
  • 浏览: 22528 次
  • 性别: 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编程语言中,静态代码块、非静态代码块和构造函数是面向对象设计的重要组成部分,它们在类的初始化和对象创建过程中起到关键作用。本文将深入探讨这些概念,以及它们在实际开发中的应用。 首先,我们来理解静态...

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

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

    java中静态代码块与构造方法的执行顺序判断

    在Java编程语言中,了解静态...通过上述分析,我们可以清楚地理解Java中静态代码块与构造方法的执行顺序,这对于编写高效且可靠的代码至关重要。在实际编程中,了解这些基础知识有助于避免潜在的错误并优化代码结构。

    java中静态与非静态的区别

    ### Java中静态与非静态的区别 #### 一、静态类与非静态类 在Java中,**静态类**与**非静态类**有着明显的区别: 1. **成员组成**: - **静态类**只能包含**静态成员**和**静态方法**。这意味着你无法在静态类中...

    Java类的完整构造执行顺序

    在深入探讨Java类的完整构造执行顺序之前,我们先来明确一下Java中构造函数与类初始化的基本概念。构造函数在创建对象时被调用,用于初始化该对象的状态。而类初始化则是指在类首次被使用时,JVM执行的一系列初始化...

    JAVA程序:静态块代码

    它的执行顺序早于类的非静态初始化块和构造函数。当类第一次被加载时,静态块按照它们在代码中的顺序依次执行。 下面是一个简单的静态块示例,展示了如何使用静态块初始化静态变量: ```java public class ...

    Java static静态初始快

    1. **执行顺序**:静态初始化块在非静态初始化块之前执行。当类第一次被加载时,JVM会按照它们在源代码中的顺序执行静态初始化块。 2. **类加载机制**:Java类的加载是懒加载的,即只有在类被首次使用时,JVM才会...

    在Java中自由块的执行顺序

    总结来说,Java中的自由块执行顺序是静态自由块在类加载时执行,非静态自由块在创建对象时执行,并且遵循继承的层次结构。理解这一执行顺序有助于优化代码,避免在类加载和对象创建过程中出现预期之外的行为。

    静态代码块

    静态代码块与实例代码块(非静态代码块)的主要区别在于它们的执行时机以及作用范围。 - **执行时机**:静态代码块在类加载时执行,而实例代码块则是在创建对象时执行。 - **作用范围**:静态代码块作用于整个类的...

    JAVA函数使用手册

    在Java编程语言中,函数是实现特定功能的代码块,可以被多次调用,从而提高代码的重用性。这份“JAVA函数使用手册”可能是针对Java编程中的函数使用方法、设计原则以及常见问题的详细指南。以下是关于Java函数的一些...

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

    下面我们将详细探讨Java中代码块的执行顺序,包括静态属性、非静态属性、静态代码块、非静态代码块以及构造函数。 首先,让我们回顾一下结论: 1. 当创建一个类的实例时,首先会执行类中的静态属性和静态代码块,...

    java函数速查手册常用函数

    Java函数速查手册是编程学习过程中非常实用的参考资料,它主要涵盖了Java语言中常见的函数,对初学者来说尤其有价值。这个CHM文件很可能是由一系列的函数解释、示例代码和使用指南组成的电子手册,方便用户快速查找...

    java经典小程序-函数小程序

    Java允许在同一个类中定义多个同名函数,只要它们的参数列表不同(参数个数、类型或顺序不同)。这是方法重载的概念,有助于提高代码的可读性和复用性。 4. **递归函数**: 递归函数是调用自己的函数,通常用于...

    java代码的初始化顺序demo

    总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...

    java中的static变量,方法,代码块

    2. 对象创建时,先执行类中的非静态代码块,再调用构造函数。 通过上述分析,我们可以清楚地看到`static`关键字在Java中是如何被运用的,及其在变量、方法和代码块管理上的独特优势。理解这些概念,对于编写高效、...

    深入浅析Java中普通代码块、构造代码块与静态代码块

    下面将详细解释这三种代码块的特性、执行顺序以及它们在程序运行过程中的作用。 1. **普通代码块**: 普通代码块是指在方法或语句中直接定义的一组代码,不带有任何修饰符。它们的执行顺序取决于它们在代码中的...

    java编程主要函数的用法详解

    每个类可以有一个或多个构造函数,它们的名称与类名相同且没有返回类型。例如: ```java public class MyClass { public MyClass() { // 初始化代码 } } ``` 2. **void函数** `void`函数不返回任何值,通常...

    java 函数速查CHM

    在Java编程语言中,函数是执行特定任务的代码块,可以被多次调用。掌握Java函数是成为熟练Java程序员的关键步骤。以下是一些关于Java函数的重要知识点: 1. **定义与调用**:函数通过`public static void function_...

    学习java静态数据初始化.doc

    在 Java 中,静态变量的初始化过程可以被分为三个阶段:静态初始化、非静态初始化和执行构造函数。静态初始化是指在类加载时对静态变量的初始化。非静态初始化是指在实例创建时对实例变量的初始化。执行构造函数是指...

Global site tag (gtag.js) - Google Analytics