通过new新建一个对象时,涉及到类的装载及对象的实例化两方面。
1、类的装载
1)类装载时,先装载父类,然后到子类。
2)装载父类后,执行静态动作(初始化静态变量或执行静态代码程序(两者根据代码顺序执行))。
3)装载子类后,执行静态动作(初始化静态变量或执行静态代码程序(两者根据代码顺序执行))。
2、对象的实例化
1)实例化子类时,会(需要)先实例化父类。
2)实例化父类时,先完成实例变量的初始化,然后调用构造函数完成实例化工作,子类同理。
3、概括来说,初始化顺序如下:
父类的静态代码 -->子类的静态代码-->父类的非静态实例变量(或代码块)-->父类的构造方法-->子类的非静态实例变量(或代码块)-->子类的构造方法。
4、测试实例
abstract class base { public int age = getNumber(100); static { System.out.println("base static block"); } { System.out.println("base nonstatic block"); } static int sage = getNumber(50); base() { System.out.println(age); System.out.println("base start"); draw();// 会调用子类覆盖后的方法,这儿是0!???? System.out.println("base end"); } static int getNumber(int base) { System.out.println("base.getNumber int" + base); return base; } public void draw() { System.out.println("base.draw"); } } public class initializeOrder extends base { public int age = getNumber(1001); private int _radius = getNumber(10); static int sage = getNumber(250); static { System.out.println("subclass static block"); } { System.out.println("subclass nonstatic block"); } initializeOrder(int radius) { _radius = radius; System.out.println(age); draw();// 这儿是1000 System.out.println("initializeOrder initialized"); } public void draw() { System.out.println("initializeOrder.draw " + _radius); } public static void main(String[] args) { System.out.println("start main()"); new initializeOrder(1000); } }
执行输出如下:
base static block
base.getNumber int50
base.getNumber int250
subclass static block
start main()
base.getNumber int100
base nonstatic block
100
base start
initializeOrder.draw 0
base end
base.getNumber int1001
base.getNumber int10
subclass nonstatic block
1001
initializeOrder.draw 1000
initializeOrder initialized
相关推荐
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...
### Java 类中静态域、块,非静态域、块,构造函数的初始化顺序 #### 一、概述 在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块...
构造函数主要用于初始化对象的状态,而静态块则是在类加载到内存中时执行的一段代码,通常用于类级别的初始化。 ### 构造函数与静态块的基本概念 构造函数是一种特殊的方法,它与类同名,并没有返回类型,其主要...
3. **静态成员变量与实例成员变量的初始化顺序** ```java public class TestOrder { // 静态成员变量初始化 public static TestA a = new TestA(); // 静态初始化块 static { System.out.println("静态初始...
在 Java 中,静态变量的初始化顺序是按照它们在类中的定义顺序进行的。如果一个静态变量依赖于另一个静态变量的值,那么这两个变量的初始化顺序是重要的。 在给定的代码中,我们可以看到有多个静态变量的声明和初始...
2. 非静态初始化代码块中对实例变量指定初值; 3. 构造器中对实例变量指定初值。 虽然程序在三个地方都可对实例变量指定初始值,但(1)、(2)处的赋值操作最终会被提取到构造器中执行。且(1)、(2)的执行顺序...
总之,理解并有效地使用静态和对象初始化块是Java开发中的关键技能,它们可以帮助我们更好地控制类和对象的初始化过程,确保代码的高效性和正确性。在实际编程中,我们应该根据需求谨慎选择合适的初始化策略,以优化...
本文详细介绍了类继承中的初始化顺序问题,包括初始化的基本概念、初始化过程中的关键步骤以及如何正确处理基类和子类之间的构造函数调用。理解这些概念对于编写高效、可维护的面向对象程序至关重要。希望通过对这些...
2. 非静态数据成员:在构造函数初始化列表中,成员变量按照它们在类声明中的顺序被初始化。即使初始化列表中的顺序不同,也会按照声明的顺序进行。 例如: ```cpp class MyClass { public: int a; int b; static...
Java对象的初始化顺序是一个关键的编程概念,它涉及到类加载、静态初始化、实例初始化等多个步骤。下面我们将详细探讨这些步骤。 首先,当程序运行并创建一个新的对象时,JVM(Java虚拟机)会按照特定的顺序来初始...
总的来说,理解Java中静态变量的初始化顺序对于编写可靠的代码非常重要。开发者应避免依赖这种顺序来初始化变量,因为这可能导致难以预料的行为。在编写代码时,推荐的做法是保持静态变量的初始化尽可能简单,避免...
3. 静态变量的初始化顺序取决于它们在代码中声明的顺序,而不是它们在编译后的字节码中的顺序。 需要注意的是,静态初始化块只在类被加载时执行一次,而实例初始化块(构造函数)则会在每次创建类的实例时执行。...
在非继承关系中,类的初始化顺序是按照静态成员变量、静态代码块、普通成员变量和构造函数的顺序进行的,而在继承关系中,类的初始化顺序是按照父类和子类的静态成员变量、静态代码块、普通成员变量和构造函数的顺序...
在Java编程语言中,理解成员变量的初始化顺序对于正确地设计和实现类结构至关重要。通过本实验,我们将深入了解成员变量的初始化顺序,以及如何通过实际代码示例来验证这些概念。 #### 实验步骤解析 ##### 步骤一...
在Java中,一个类可能包含静态变量、静态初始化块、成员变量、实例初始化块和构造函数。当创建一个对象时,这些元素的加载顺序遵循特定的规则: 1. 静态成员和静态初始化块:在任何实例被创建之前,首先是父类的...
静态变量的初始化顺序按照它们在源代码中的出现顺序进行,而静态块则是在类加载时按顺序执行的。例如,在`JvmTest.java`和`JvmTest1.java`中,如果有静态变量和静态初始化块,它们的执行顺序将体现在`<clinit>`方法...