首先,让我们用一个简单的程序来引入主题:
***********************程序*********************
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浏览器!!
相关推荐
### Java 类中静态域、块,非静态域、块,构造函数的初始化顺序 #### 一、概述 在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块...
Java编程语言中,静态代码块、非静态代码块和构造函数是面向对象设计的重要组成部分,它们在类的初始化和对象创建过程中起到关键作用。本文将深入探讨这些概念,以及它们在实际开发中的应用。 首先,我们来理解静态...
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
在Java编程语言中,了解静态...通过上述分析,我们可以清楚地理解Java中静态代码块与构造方法的执行顺序,这对于编写高效且可靠的代码至关重要。在实际编程中,了解这些基础知识有助于避免潜在的错误并优化代码结构。
### Java中静态与非静态的区别 #### 一、静态类与非静态类 在Java中,**静态类**与**非静态类**有着明显的区别: 1. **成员组成**: - **静态类**只能包含**静态成员**和**静态方法**。这意味着你无法在静态类中...
在深入探讨Java类的完整构造执行顺序之前,我们先来明确一下Java中构造函数与类初始化的基本概念。构造函数在创建对象时被调用,用于初始化该对象的状态。而类初始化则是指在类首次被使用时,JVM执行的一系列初始化...
它的执行顺序早于类的非静态初始化块和构造函数。当类第一次被加载时,静态块按照它们在代码中的顺序依次执行。 下面是一个简单的静态块示例,展示了如何使用静态块初始化静态变量: ```java public class ...
1. **执行顺序**:静态初始化块在非静态初始化块之前执行。当类第一次被加载时,JVM会按照它们在源代码中的顺序执行静态初始化块。 2. **类加载机制**:Java类的加载是懒加载的,即只有在类被首次使用时,JVM才会...
总结来说,Java中的自由块执行顺序是静态自由块在类加载时执行,非静态自由块在创建对象时执行,并且遵循继承的层次结构。理解这一执行顺序有助于优化代码,避免在类加载和对象创建过程中出现预期之外的行为。
静态代码块与实例代码块(非静态代码块)的主要区别在于它们的执行时机以及作用范围。 - **执行时机**:静态代码块在类加载时执行,而实例代码块则是在创建对象时执行。 - **作用范围**:静态代码块作用于整个类的...
在Java编程语言中,函数是实现特定功能的代码块,可以被多次调用,从而提高代码的重用性。这份“JAVA函数使用手册”可能是针对Java编程中的函数使用方法、设计原则以及常见问题的详细指南。以下是关于Java函数的一些...
下面我们将详细探讨Java中代码块的执行顺序,包括静态属性、非静态属性、静态代码块、非静态代码块以及构造函数。 首先,让我们回顾一下结论: 1. 当创建一个类的实例时,首先会执行类中的静态属性和静态代码块,...
Java函数速查手册是编程学习过程中非常实用的参考资料,它主要涵盖了Java语言中常见的函数,对初学者来说尤其有价值。这个CHM文件很可能是由一系列的函数解释、示例代码和使用指南组成的电子手册,方便用户快速查找...
Java允许在同一个类中定义多个同名函数,只要它们的参数列表不同(参数个数、类型或顺序不同)。这是方法重载的概念,有助于提高代码的可读性和复用性。 4. **递归函数**: 递归函数是调用自己的函数,通常用于...
总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...
2. 对象创建时,先执行类中的非静态代码块,再调用构造函数。 通过上述分析,我们可以清楚地看到`static`关键字在Java中是如何被运用的,及其在变量、方法和代码块管理上的独特优势。理解这些概念,对于编写高效、...
下面将详细解释这三种代码块的特性、执行顺序以及它们在程序运行过程中的作用。 1. **普通代码块**: 普通代码块是指在方法或语句中直接定义的一组代码,不带有任何修饰符。它们的执行顺序取决于它们在代码中的...
每个类可以有一个或多个构造函数,它们的名称与类名相同且没有返回类型。例如: ```java public class MyClass { public MyClass() { // 初始化代码 } } ``` 2. **void函数** `void`函数不返回任何值,通常...
在Java编程语言中,函数是执行特定任务的代码块,可以被多次调用。掌握Java函数是成为熟练Java程序员的关键步骤。以下是一些关于Java函数的重要知识点: 1. **定义与调用**:函数通过`public static void function_...
在 Java 中,静态变量的初始化过程可以被分为三个阶段:静态初始化、非静态初始化和执行构造函数。静态初始化是指在类加载时对静态变量的初始化。非静态初始化是指在实例创建时对实例变量的初始化。执行构造函数是指...