`
heisedeyueya
  • 浏览: 97732 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

类各个成员的初始化顺序

JVM 
阅读更多
基础学习,对于初学者理解有一定的帮助。
  • 问题描述:
  •    类的各个成员的初始化顺序,简单的理解就是一个类在加载、实例化时候的执行顺序其中包括静态成员变量、静态成员函数、静态语句块、一般成员变量、一般成员函数、构造函数。
 
  • 先给出测试结果:
  • 静态成员函数—>静态成员变量—>静态语句块(类加载的时候)
    成员函数—>成员变量—>构造函数(类实例化的时候)
    所以总的来说执行顺序是(并且遵循先父类后子类的原则):
    静态成员函数—>静态成员变量—>静态语句块—>成员函数—>成员变量—>构造函数


  • 测试代码:
  •    构造三个类Base(顶级父类)、SuperClass(一级子类)、SubClass(二级子类,也是测试类)。

Base类:这个类中包含了一个static成员变量、一般成员变量、静态语句块、无参的构造函数。
package org.iSun.heisedeyueya;

class Base {
	public static int a = 10;
	public int b = 20;
	static {
		System.out.println("Base Static run");
	}

	public Base() {
		System.out.println("Base construct run");
	}
}

SuperClass:其中包扩了一个static成员变量、一般的成员变量、构造函数、静态语句块、静态成员函数、一般的成员函数。
package org.iSun.heisedeyueya;

public class SuperClass extends Base {
	public static int a1 = getSuperStaticNum();
	public int b1 = getSuperInstanceNum();

	public SuperClass() {
		System.out.println("SuperClass construt run ");
	}

	static {
		System.out.println("SuperClass static run ");
	}

	public static int getSuperStaticNum() {
		System.out.println("SuperClass Static member init");
		return 100;
	}

	public int getSuperInstanceNum() {
		System.out.println("SuperClass Instance member init");
		return 200;
	}
}



SubClass:类的结构与SuperClass相同。不再赘述。
package org.iSun.heisedeyueya;

public class SubClass extends SuperClass {
	public static int a2 = getStaticNum();
	public int b2 = getInstanceNum();

	public SubClass() {
		System.out.println("SubClass construct run ");
	}

	private int getInstanceNum() {
		System.out.println("SubClas Instance member init");
		return 2000;
	}

	private static int getStaticNum() {
		System.out.println("SubClass Static member init");
		return 1000;
	}

	static {
		System.out.println("SubClass Static run ");
	}

	public static void main(String[] args) {
		new SubClass();
	}
}


运行结果:
Base Static run
SuperClass Static member init
SuperClass static run
SubClass Static member init
SubClass Static run
Base construct run
SuperClass Instance member init
SuperClass construt run
SubClas Instance member init
SubClass construct run
  • 分析
  • 1.对象在初始化的时候,JVM会先收索该类的SubClass继承树上的直接继承于Object类的子类,也就是Base类;
    2.然后JVM会先加载Base类,然后初始化静态变量a,然后执行Base类的静态语句块,此时输出:Base Static run,(此时还没有调用构造函数,构造函数是实例化时才调用的);
    3.然后JVM继续递归收索找到一级子类SuperClass,同样按照静态成员函数—>静态成员变量—>静态语句块的顺序执行。这样一直递归下去,直到加载完我们所使用的对象所在的类为止;
    4.类加载完成以后就开始对类进行实例化,这里还是会收索继承树,找到顶级父类(这里是指直接继承于Object的类)Base类;
    5.JVM会更加继承树逐层的递归,按照Base—>SuperClass—>SubClass的顺序进行,每一层执行顺序遵循:成员函数—>成员变量—>构造函数的顺序执行;

分享到:
评论

相关推荐

    Java类中各成员初始化的顺序

    了解java中类各个成员的初始化顺序是非常重要的,这样你可以对类有全局的认识。不说太多,直接看下面的例子 class Father { static{ System. out.println("父类静态代码块初始化" ); } { System. out.println...

    VC MFC下 的初始化 与结束 顺序过程,是mFC的基础

    在Microsoft Visual C++ (VC) 中使用MFC(Microsoft Foundation Classes)进行开发时,了解初始化与结束的顺序过程至关重要,因为这直接影响到程序的正确运行和资源管理。MFC提供了一套框架,使得应用程序的启动、...

    结构体变量的初始化和使用

    通过花括号 `{}` 内指定的值顺序与结构体成员一一对应,从而完成了结构体变量的初始化。 ### 使用结构体变量 一旦结构体变量被正确地初始化,就可以通过访问其成员来使用这些数据。在例子中,`cout` 语句被用来...

    C++类成员构造函数和析构函数顺序示例详细讲解

    2. **非静态数据成员**:接着,按照在类中声明的顺序,初始化各个非静态数据成员。每个数据成员都会调用其对应的构造函数。 3. **派生类构造函数**:最后,执行派生类自身的构造函数。这一步通常用于完成派生类特定...

    详解Java中类的加载顺序

    理解这些加载顺序对于优化代码性能和避免潜在问题至关重要,特别是在处理静态成员、初始化逻辑以及多线程环境下的类加载时。希望这个详尽的解释能帮助你更好地理解和应用Java中的类加载机制。如有任何疑问,欢迎继续...

    二叉树类的定义和成员函数的实现

    提供了两个构造函数,一个默认构造函数初始化所有指针为`NULL`,另一个带有参数的构造函数用于初始化节点数据并设置指针为`NULL`。 接下来是`Binary_tree`类,它是二叉树的模板类。这个类包含了多个成员函数,用于...

    顺序表实现框架程序1

    1. `IntiaList(SqList & L)`:初始化顺序表,分配内存并设置长度为0,列表大小为LIST_INIT_SIZE。 2. `DestroyList(SqList & L)`:销毁顺序表,释放内存。 3. `ClearList(SqList &L)`:清空顺序表,将所有元素置为空...

    c选择题复习题(一).pdf

    静态成员变量不属于任何对象,需要在类外部进行初始化,而函数成员的初始化通常不是通过函数完成,而是通过构造函数来初始化对象的非静态成员。 19. 文件流类库中的函数: 在文件流类库中,fstream是处理文件输入...

    详解C#中使用对象或集合的初始值设定项初始化的操作

    在C#编程中,对象和集合的初始值设定项初始化是一种方便的方法,可以在创建对象时直接设置其属性或成员的初始值,而无需显式调用构造函数。这使得代码更加简洁、易读。以下是对C#中对象和集合初始值设定项初始化的...

    第四次非编程作业1

    当一个类(派生类)从另一个类(基类)继承时,它们之间存在构造函数的调用顺序,这对于理解和正确初始化对象至关重要。以下是关于派生类构造函数执行次序的详细解释: 1. **基类构造函数的调用**: 在派生类的...

    C++经典面试题全集

    25. 对象成员初始化的顺序由它们在类中的声明顺序决定,而非初始化列表中的顺序。 26. 类是对象的抽象,描述了对象的一般性质;对象是类的具体实例,具有类定义的属性和行为。 27. 类的成员访问属性有public、...

    顺序表的实现(C++)

    - **建立含有若干个元素的顺序表**:初始化顺序表并添加初始数据。 - **实现基本操作**:包括插入、删除、查找等操作。 #### 3. 实验内容 ##### 2.1 各算法基本思想及各函数流程图 - **UML类图**:通过UML类图来...

    C++继承及派生类习题.pdf

    8. **初始化列表**:派生类构造函数的初始化列表用于初始化基类的数据成员以及派生类中新增的成员,包括子对象和一般成员。 9. **访问权限转换**:在派生类中,基类的public和protected成员的访问权限可能会因为...

    大数据结构线性表地顺序表示和实现地实习报告材料.doc

    1. 首先,我们编写了 InitList_Sq 函数来初始化线性表,包括分配存储空间和初始化成员变量。 2. 然后,我们编写了 ListInsert_Sq 函数来插入元素到线性表中,包括检查插入位置的合法性、分配新的存储空间和移动元素...

    面试题目背诵

    成员变量的初始化顺序取决于它们在类中声明的顺序,而不是初始化列表中的顺序。 #### 26. 类与对象的关系 类是对象的抽象描述,而对象是类的具体实例。类定义了对象的结构和行为,对象则是根据类创建的具体实体。 ...

    C++面试题

    对对象成员的初始化顺序不受初始化列表的影响,而是由成员在类中的声明顺序决定。类与对象之间的关系是类是对象的抽象,对象是类的实例。类的成员访问属性有public、protected和private之分。 指针与const的结合...

    C++类总结多态继承

    - **多继承的调用顺序**: 在多层继承中,处于同一层的基类构造函数的调用顺序取决于定义派生类时所指定的基类顺序,而不是派生类构造函数定义时初始化列表中的顺序。 - **虚基类**: - 虚基类用来解决多继承中的...

    类加载机制与动态代理的测试题

    - 接口的初始化顺序是按需加载的,也就是说,只有在真正使用到接口中的静态成员时,才会加载并初始化该接口及其父接口。 #### 三、问答题知识点详解 题目给出的是一个简单的单例模式实现。在该示例中,`Singleton...

    c/c++实现 顺序表

    初始化顺序表 `initList()` ```c void initList(sqlist*& l) { l->length = 0; // 设置顺序表的长度为0 } ``` **知识点:** - **指针传递**:通过传递指针而不是值的方式可以实现在函数内部修改顺序表的状态。 -...

    数据结构实验顺序表的实现,包括实验要求 CPP文件 EXE

    类的成员函数可以包括`init()`、`insert()`, `remove()`, `getLength()`, `searchByValue()`, 和 `searchByPosition()`等,分别对应上述的各个操作。 在实验过程中,使用CPP文件编写代码并编译生成EXE可执行文件,...

Global site tag (gtag.js) - Google Analytics