不忙的时候看了一下java基础,初始化顺序这里以前不太清楚,现在明白好多,如果你也和我一样,相信通过这段代码能给你帮助
public class TestCodeExecOrder extends TestCodeExecOrderHost { static {System.out.println("TestCodeExecOrder static代码块");}//(3)静态代码块 //(1)和(2)的顺序决定了输出顺序,也就是说哪个在前,先走哪个代码 private int x = print("TestCodeExecOrderHost xx变量");//(2)普通成员变量 {System.out.println(xx2+"TestCodeExecOrderHost 动态代码块");}//(1)动态代码块 //private int x = print("TestCodeExecOrderHost xx变量");//(2)普通成员变量 //(3)和(4)的顺序决定了输出顺序,也就是说哪个在前,先走哪个代码 private static int xx2 = print("static TestCodeExecOrder.xx2 init");//(4)static成员变量 public TestCodeExecOrder(){ System.out.println("TestCodeExecOrder j="+j); System.out.println("TestCodeExecOrder x="+x); } public static void main(String[] args) { System.out.println("TestCodeExecOrder main"); TestCodeExecOrder t = new TestCodeExecOrder(); } } class TestCodeExecOrderHost{ private int i = 9; public int j; private static int xx = print("static TestCodeExecOrderHost.xx init"); {System.out.println(xx+"TestCodeExecOrderHost 动态代码块");} static {System.out.println("TestCodeExecOrderHost static代码块");} public TestCodeExecOrderHost(){ System.out.println("TestCodeExecOrderHost i="+i+" j="+j); j = 10; } public static int print(String s){ System.out.println(s); return 20; } }
//output结果 static TestCodeExecOrderHost.xx init TestCodeExecOrderHost static代码块 TestCodeExecOrder static代码块 static TestCodeExecOrder.xx2 init TestCodeExecOrder main 20TestCodeExecOrderHost 动态代码块 TestCodeExecOrderHost i=9 j=0 TestCodeExecOrderHost xx变量 20TestCodeExecOrderHost 动态代码块 TestCodeExecOrder j=10 TestCodeExecOrder x=20
总结:
主线:如果有父类先走父类部分,再走子类部分
细分:
(0)在其他任何事情发生之前,将分配给对象的存储空间初始化成二进制的的零(先是父类的成员变量初始为默认值,再是子类的成员变量初始为默认值)
(1)程序运行时第一件事就是试图访问TestCodeExecOrder .main方法(他是static的),这是加载器加载TestCodeExecOrder的编译代码,对他加载过程中如果发现他有一个父类TestCodeExecOrderHost,接着对父类进行加载;
(2)接着,父类中的static初始化被立刻进行,然后是子类的static初始化(此处的static包括:static变量和static代码块,谁在前,谁就先执行),此时必要的类加载完毕,就可以创建对象了
(3)此时,对对象中的普通成员变量初始化(有值得赋值,没值的赋默认值)(普通成员变量包括:普通成员变量和动态代码块,谁在前,谁就先执行),接着父类的构造方法被执行,然后是子类的构造方法
本人看书之后的理解,如果有不对的地方欢迎大家指正,这些基本的执行顺序在分析实际项目的bug感觉很有用
相关推荐
在Java编程语言中,`static`关键字扮演着极其重要的角色,它主要用于声明类的成员变量、方法以及代码块为静态。本文将深入探讨`static`在变量、方法和代码块中的应用,通过示例和解释帮助读者更深刻地理解其功能与...
本文详细介绍了类继承中的初始化顺序问题,包括初始化的基本概念、初始化过程中的关键步骤以及如何正确处理基类和子类之间的构造函数调用。理解这些概念对于编写高效、可维护的面向对象程序至关重要。希望通过对这些...
3. **父类静态成员变量及初始化块**:如果当前类继承自另一个类,则父类的静态成员变量和静态初始化块会在子类之前被初始化。 4. **实例成员变量的默认初始化**:创建对象时,默认情况下,实例成员变量会被初始化为...
静态初始化块是以`static`关键字标识的代码块,它在类被加载到Java虚拟机(JVM)时执行,且只执行一次。静态初始化块常用于设置类级别的变量,或者执行只应执行一次的初始化操作。例如,如果一个类需要在程序运行前...
- 静态初始化块(static{}):如果类中存在静态初始化块,该块的代码会在类加载后的准备阶段执行,用于初始化静态变量或执行其他静态设置任务。 - 静态变量的赋值:接着,静态变量会被赋予它们的初始值,这可以是...
Java中,类变量(static变量)的初始化顺序遵循以下规则: 1. 首先,执行父类的静态初始化块(方法),如果有的话。 2. 然后,执行子类的静态初始化块。 3. 静态变量的初始化顺序取决于它们在代码中声明的顺序,而...
本文将深度剖析几个常见的Java面试题目,包括方法重写、静态代码块和构造方法的执行顺序。 首先,我们来讨论**方法重写(Override)**。在面向对象编程中,子类可以继承父类的属性和方法,有时需要根据自己的需求对...
在Java中,当一个类继承自另一个类时,实例化子类对象时构造函数与静态块的执行顺序遵循以下规则: 1. **静态块的执行**:首先,所有父类的静态块会被执行,然后再执行子类的静态块。这是因为静态块是在类加载时...
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
### Java 类中静态域、块,非静态域、块,构造函数的初始化顺序 #### 一、概述 在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块...
Java 初始化块,也称为构造代码块,是Java编程语言中的一种特性,用于在对象创建时执行特定的初始化操作。初始化块在类的定义中以 `{}` 包裹的一段代码,没有返回值,也不需要任何参数。根据是否带有 `static` ...
1. 静态代码块(Static Block):这些代码块在类加载时执行,用于初始化类级别的变量或执行一些仅需执行一次的设置操作。静态代码块与类相关联,而不是类的实例。 2. 普通代码块(Instance Initialization Block)...
在 JAVA 中,类的初始化顺序可以分为四个阶段:静态变量、静态初始化块、变量、初始化块和构造器。其中,静态变量和静态初始化块的初始化顺序是最高的,接着是变量和初始化块,最后是构造器。 在了解类的初始化顺序...
当我们讨论“Java static静态初始化块”时,我们关注的是如何在类加载时执行特定的初始化代码。 首先,让我们理解`static`关键字的基本概念。`static`在Java中用于声明类变量或静态方法,这些变量和方法不需要创建...
类中的结构包括属性(变量)、方法(实现功能)、构造器(创建对象),还有代码块(初始化块),它们各自有不同的作用。 代码块可以分为静态代码块和非静态代码块。静态代码块由`static`关键字修饰,它们在类加载时...
静态代码块是在类中独立于类成员的 static 语句块,可以有多个,位置可以随意放,它不在任何的方法体内,JVM 加载类时会执行这些静态代码块,是该类中最先被执行的代码,如果有多个静态代码块,会按照它们在类中出现...
从上面的初始化顺序可以看出,Java类成员初始化顺序是一个非常复杂的过程,其中涉及到静态变量、final静态常量、静态代码块、普通变量、普通代码块、构造方法和普通方法等多种成员变量的初始化顺序。 在实际开发中...
成员变量是定义在类中的变量,但不在任何方法、构造器或初始化块内。它们与类的对象直接关联,每个对象都有自己的成员变量副本。当创建类的新实例时,会为每个成员变量分配内存空间。成员变量可以被类的任何方法访问...
构造方法是与类同名的方法,用于初始化新创建的对象。它在对象创建时自动调用,不能直接调用。静态初始化器(`static{}`)则在类初次加载时执行,用于初始化静态域,只执行一次。 此外,我们还有抽象方法(`...