`

java类执行顺序

 
阅读更多

首先假设有如下的一些辅助类,这些类被其他类使用作为静态变量或非静态变量: 

Java代码  收藏代码
  1. public class C {  
  2.     public C() {  
  3.         System.out.println("C");  
  4.     }  
  5. }  
  6.   
  7. public class E {  
  8.     public E() {  
  9.         System.out.println("E");  
  10.     }  
  11. }  
  12.   
  13. public class F {  
  14.     public F() {  
  15.         System.out.println("F");  
  16.     }  
  17. }  
  18.   
  19. public class G {  
  20.     public G() {  
  21.         System.out.println("G");  
  22.     }  
  23. }  
  24.   
  25.   
  26. public class H {  
  27.     public H() {  
  28.         System.out.println("H");  
  29.     }  
  30. }  


1)继承自Object的类的构造函数的执行顺序: 
假设有如下的一个类I,I的定义如下: 

Java代码  收藏代码
  1. public class I {
  2. public G g = new G();//6
  3. public static E statice0 = new E();//1
  4. static {//2
  5. statice0 = new E();
  6. System.out.println("判断static执行的顺序");
  7. }
  8. public static E statice1;
  9. public static F f1;
  10. static {//3
  11. System.out.println("测试在static块中执行的顺序1");
  12. statice1 = new E();
  13. f1 = new F();
  14. }
  15. static {//4
  16. System.out.println("测试在static块中执行的顺序2");
  17. f1 = new F();
  18. statice1 = new E();
  19. }
  20. public static H h = new H();//5
  21. public E e;//7
  22. {
  23. System.out.println("aaa");
  24. e = new E();
  25. }
  26. public I(int i) {//8
  27. statice0 = new E();
  28. f1 = new F();
  29. e = new E();
  30. }
  31. public static void main(String[] args) {
  32. I i = new I(1);
  33. }
  34. }


执行结果: 


判断static执行的顺序 
测试在static块中执行的顺序1 


测试在static块中执行的顺序2 




aaa 




从这个结果来可以知道,从Object派生的类将会按照如下的书序执行: 
    1、静态变量,如果有静态块的话,则按照静态块中变量new的顺序执行静态变量构造函数。如果没有静态块的话,则按照声明的顺序执行。 
    2、非静态变量,如果有非静态变量初始化块的话,则按照new的顺序执行构造函数,如果没有初始化块则按照声明的顺序执行。 
    3、执行构造函数,所有的变量按照new的顺序执行构造函数。 

 

 

------------------------------------分割线-------------------------------------------------   

  

java类执行顺序

 

如果父类有静态成员赋值或者静态初始化块,执行静态成员赋值和静态初始化块

如果类有静态成员赋值或者静态初始化块,执行静态成员赋值和静态初始化块

将类的成员赋予初值(原始类型的成员的值为规定值,例如int型为0,float型为0.0f,boolean型为false;对象类型的初始值为null)

如果构造方法中存在this()调用(可以是其它带参数的this()调用)则执行之,执行完毕后进入第7步继续执行,如果没有this调用则进行下一步。(这个有可能存在递归调用其它的构造方法)

执行显式的super()调用(可以是其它带参数的super()调用)或者隐式的super()调用(缺省构造方法),此步骤又进入一个父类的构造过程并一直上推至Object对象的构造。

执行类申明中的成员赋值和初始化块。

执行构造方法中的其它语句。

 

最终的简化顺序版本是:

 

父类的静态成员赋值和静态块

子类的静态成员和静态块

父类的构造方法

父类的成员赋值和初始化块

父类的构造方法中的其它语句

子类的成员赋值和初始化块

子类的构造方法中的其它语句

 

 

------------------------------------分割线-------------------------------------------------

 

 

一、java代码执行顺序(理解形式):

1、父类静态代码块->子类静态代码块(只执行一次);

2、父类成员变量的初始化或普通代码块->父类构造函数;

3、子类成员变量的初始化或普通代码块->子类构造函数。

 

二、概念:               

static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

eg: static

{       

 System.out.println("static block of demo!");

}

 

普通代码块是指在类中直接用大括号{}括起来的代码段。

eg:

{

  System.out.println("comman block of demo!");

}

 

package com.dk.java.controller;


class Parent {
	private Delegete delegete = new Delegete();//4 11

	static// 加载时执行,只会执行一次
	{
		System.out.println("static block of parent!");//1
	}

	public Parent(String name) {
		System.out.println("to construct parent!"); //6 13
	}

	{
		System.out.println("comman block of parent!");//5 12
	}
}

public class Child extends Parent {
	static {
		System.out.println("static block of child!");//2
	}

	static// 可以包含多个静态块,按照次序依次执行
	{
		System.out.println("second static block of child!");//3
	}

	// 普通代码块与变量的初始化等同的,按照次序依次执行
	{
		System.out.println("comman mode of child!"); //7 13
	}

	private Delegete delegete = new Delegete();//8 14

	{
		System.out.println("second comman mode of child!");//9 15
	}

	// 构造顺序,先执行静态块(父类、子类顺序执行)(只执行一次)
	// 执行父类成员变量的初始化或普通代码块,然后执行构造函数
	// 执行子类成员变量的初始化或普通代码块,然后执行构造函数
	public Child() {
		super("DLH");
		System.out.println("to construct child!");//10 16
	}

	public static void main(String[] args) {
		Child c = new Child();
		System.out.println("**********************************");
		Child c2 = new Child();
	}
}

class Delegete {
	static {
		System.out.println("static of Delegete!"); //4.1
	}

	public Delegete() {
		System.out.println("to construct delegete!"); //4.2 8.1 11.1 14.1
	}
}

  

 

输出结果:

static block of parent!
static block of child!
second static block of child!
static of Delegete!
to construct delegete!
comman block of parent!
to construct parent!
comman mode of child!
to construct delegete!
second comman mode of child!
to construct child!
**********************************
to construct delegete!
comman block of parent!
to construct parent!
comman mode of child!
to construct delegete!
second comman mode of child!
to construct child!

 

 对单个类,JVM加载阶段(编译阶段):

1、给静态变量分配内存空间

2、用默认值初始化静态变量

3、按照静态变量和静态块的申明顺序执行初始化

4、如果创建对象;否则,直接结束

5、先给所有实例成员分配内存空间并用默认值初始化

6、按顺序执行实例块和变量

7、执行构造方法

 

 

 

 

 

分享到:
评论

相关推荐

    Java类执行顺序详解+实例(阿里面试题)+详细讲解+流程图

    Java类的执行顺序是编程过程中一个非常重要的概念,特别是在深入理解和优化代码性能时。本文将详细探讨Java类的加载、初始化、执行等步骤,并通过实例分析阿里面试中可能涉及的相关问题,结合流程图帮助理解这一过程...

    Java类的基本运行顺序

    本文将详细解析Java类的基本运行顺序,包括加载、初始化、执行等阶段,以及相关工具的运用。 首先,我们从类的生命周期开始。一个Java类的生命周期可以分为以下几个阶段: 1. **加载(Loading)**:当Java虚拟机...

    Java类的基本运行顺序-Java教程共1页.pdf.zi

    在这个"Java类的基本运行顺序"教程中,我们将深入探讨这个过程,了解一个Java类从加载到卸载的每一步。 1. **加载(Loading)**:当Java虚拟机(JVM)遇到一个新的类时,它首先会通过类加载器将类的.class文件读入...

    类执行顺序小结.doc

    ### Java类执行顺序详解 Java类的执行顺序是理解Java程序行为的关键,它涉及类的加载、初始化以及构造过程中的各种细节。以下是对类执行顺序的深入解析,基于标题“类执行顺序小结”和描述“关于Java类的执行顺序...

    Java类的完整构造执行顺序

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

    Java类继承初始化顺序

    当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...

    java简单方法顺序调用注解

    标题中的“java简单方法顺序调用注解”是指使用注解来控制类中方法的执行顺序。这在某些场景下非常有用,比如初始化逻辑、测试脚本或者需要特定顺序执行的任务。下面我们将深入探讨如何实现这一功能。 首先,我们...

    java面试题-类的初始化顺序.doc

    类--初始化块"); 39. } 40. // 构造器 41. public SubClass() { 42. System.out.println("子类--构造器"); 43. } 44. 45. public static void main(String[]...因此,掌握类的初始化顺序是每个Java开发者必备的知识点。

    java 按顺序创建文件

    在Java编程语言中,按顺序创建文件涉及到一系列的文件操作步骤。主要使用到的类是`java.io`包中的`File`和`BufferedWriter`。`File`类用于处理文件路径,创建、删除文件等操作,而`BufferedWriter`则用于向文件中...

    由浅入深详解Java 类的实例化顺序

    java教程 由浅入深详解Java 类的实例化顺序 在子类对象被实例化的过程中,变量、构造方法以及代码块三者的先后顺序为: 1. 父类的静态变量和静态代码块,按代码先后顺序执行 2. 子类的静态变量和静态代码块,按...

    JAVA程序执行顺序,你了解了吗.doc

    在JAVA编程语言中,程序的执行顺序是程序员需要掌握的关键概念之一,因为它直接影响到程序的行为。以下是关于JAVA程序执行顺序的详细解释: 1. **静态块**: 静态块是在类加载时执行的,它不依赖于类的实例。在...

    java程序初始化顺序

    在Java编程语言中,程序初始化的顺序是一个关键概念,它涉及到类加载、对象创建以及执行流程的安排。了解这些顺序对于编写高效、无错误的代码至关重要。以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**...

    Java中的Static块与静态方法

    2. **只执行一次**:每个类的静态块在整个程序运行期间只执行一次。 3. **按出现顺序执行**:如果一个类中有多个静态块,它们将按照在源代码中出现的顺序依次执行。 ### 静态方法与静态块的区别与联系 虽然静态...

    Java学习~求三角形面积的顺序结构

    在Java编程语言中,顺序结构是最基础的程序控制结构之一,它按照代码的书写顺序逐行执行。在“Java学习~求三角形面积的顺序结构”这个主题中,我们将深入探讨如何利用Java来计算三角形的面积,并了解相关概念。 ...

    JAVA类集应用

    Java 类集(Collections)是Java编程语言中一个重要的组成部分,它包含了各种数据结构,如列表、集合、映射等,以及对这些数据结构进行操作的工具类。在本压缩包中,你将找到一系列关于Java类集应用的源码实例,这些...

    Java类加载器原理

    Java 类加载器是Java虚拟机(JVM)的核心组成部分,它负责将类的字节码加载到内存中并转换为可执行的Java类。类加载器的作用不仅仅是加载类,还包括确保类的唯一性,避免重复加载,并且遵循特定的加载顺序。以下是对...

    浅谈Java文件执行顺序、main程序入口的理解

    但是,如果Java文件中没有public类,那么系统无法自动添加main方法,JVM找不到入口点,运行会报错。 Java文件执行顺序是按照下面的顺序执行的: 1. JVM寻找入口点,也就是main方法。 2. JVM执行main方法,开始执行...

Global site tag (gtag.js) - Google Analytics