闲来无事,写了一个java成员变量初始化的顺序的小例子
代码如下
父类
package com.own.test;
public class Bird {
private String birdColor;
private static Enemy enemy = new Enemy("superclass static member is initialized");
private int age = getAge();
public Bird(String birdColor){
this.birdColor = birdColor;
System.out.println("superclass constructor called");
}
private int getAge() {
// TODO Auto-generated method stub
System.out.println("superclass member is initialized");
return 9;
}
public Bird(){
System.out.println("Bird() constructor called ");
}
}
子类
package com.own.test;
public class Parrot extends Bird {
private Food food = new Food("subclass member is initialized");
private static Friend friend = new Friend("sublass static member is initialized");
public Parrot(String birdColor){
super(birdColor);
System.out.println("subclass contructor is called");
}
}
辅助类
package com.own.test;
public class Enemy {
public Enemy(String message) {
System.out.println(message);
}
}
package com.own.test;
public class Food {
public Food(String message){
System.out.println(message);
}
}
package com.own.test;
public class Friend {
public Friend(String message){
System.out.println(message);
}
}
测试类
package test;
import org.junit.Test;
import com.own.test.Parrot;
public class MemberInitSequenceTest {
@Test
public void testInitSequence(){
Parrot p = new Parrot("green");
}
}
输出结果如下
superclass static member is initialized
sublass static member is initialized
superclass member is initialized
superclass constructor called
subclass member is initialized
subclass contructor is called
总结如下:
当运行这个测试的时候,执行到new parrot()的时候虚拟机回加载Parrot这个类,在加载的过程中发现他继承Bird这个类,虚拟机就回去加载Bird这个类,直到没有父类,不管你创不创建父类对象,父类都会被加载到虚拟机里,然后jvm会执行父类的静态初始化(这里是Bird类)然后是派生类的静态变量初始化(可能子类的静态变量初始化要用到父类的静态成员初始化),直到所有的派生类的静态成员初始化完成,到此,所有的类都加载完了,可以创建父对象了,所有的primitive类型的被设为默认值,reference被设置成null,这个过程很快,如果有对成员变量赋值,则执行赋值,然后执行构造函数,派生类的执行给父类一样,这里不再重复。
分享到:
相关推荐
详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。
当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...
详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序
Java 变量初始化详解 Java 变量初始化是 Java 语言的基础知识点之一,但也往往被学习者所忽略。 Java 变量初始化的时机是指在 Java 语言中变量的初始化过程,包括变量的声明、初始化和赋值的步骤。 Java 变量声明 ...
总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...
总之,深入理解Java的ClassLoader机制和类变量初始化顺序是提升Java编程技能的重要步骤。通过学习这些知识点,开发者可以更好地优化代码、设计更健壮的系统,并解决与类加载和初始化相关的复杂问题。
以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**: - **加载**:当Java虚拟机(JVM)首次遇到一个类的引用时,会通过类加载器进行加载。加载过程包括找到类的.class文件,读取其字节码,并转化为内存中...
### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...
4. **子类非静态成员初始化**:接着是子类的非静态成员变量初始化。 5. **基类构造函数调用**:通过`super()`调用基类的构造函数。 6. **子类构造函数调用**:最后执行子类自身的构造函数。 ### 初始化过程详解 ##...
在 Java 中,实例变量的初始化顺序是按照定义的顺序进行的,而静态变量的初始化顺序则是按照定义的顺序,并且只在第一次访问时初始化。 在上面的示例代码中,我们可以看到,类变量和实例变量的初始化顺序是按照定义...
这个顺序表明,无论类之间的继承关系如何,初始化顺序始终是:静态变量和静态初始化块先于非静态成员。在创建对象时,父类的初始化先于子类。这是Java语言规范所规定的,确保在子类访问父类的静态或非静态成员时,...
在Java编程语言中,理解成员变量的初始化顺序对于正确地设计和实现类结构至关重要。通过本实验,我们将深入了解成员变量的初始化顺序,以及如何通过实际代码示例来验证这些概念。 #### 实验步骤解析 ##### 步骤一...
Java静态和非静态成员变量初始化过程解析 Java静态和非静态成员变量初始化过程解析是Java语言中一个非常重要的概念。了解Java静态和非静态成员变量的初始化过程对大家的学习或者工作具有一定的参考学习价值。 首先...
Java对象的初始化顺序是一个关键的编程概念,它涉及到类加载、静态初始化、实例初始化等多个步骤。下面我们将详细探讨这些步骤。 首先,当程序运行并创建一个新的对象时,JVM(Java虚拟机)会按照特定的顺序来初始...
在Java中,类的初始化顺序是面试中的经典问题之一,它涉及到继承、静态成员以及实例成员等多个方面。正确理解类的初始化顺序对于编写正确、高效的代码至关重要。 首先,需要了解Java类初始化的基本规则,即在类的...
8. **父类非静态成员变量初始化**:接下来,`basecode` 被设置为 `"父类非静态变量初始化"`。 9. **父类非静态初始化块**:执行输出 `"我输出的是父类非静态块内容→" + this.basecode`。此时 `basecode` 已经被...
在Java中,初始化顺序则有所不同: 1. 基本类型的静态字段和引用类型的静态字段(如果它们是常量,即final且已初始化):这些字段在类加载时按声明顺序初始化。 2. 静态初始化块:当类第一次被加载时执行,按块的...
总之,类的初始化顺序是:静态成员 -> 静态初始化块 -> 非静态成员 -> 非静态初始化块 -> 构造器。这个顺序同样适用于继承关系,只是会先初始化父类的部分,再初始化子类的部分。掌握这一知识能帮助程序员更好地设计...
总结一下,Java中类变量和成员变量的初始化顺序是这样的: 1. 类变量按照定义顺序进行静态初始化。 2. 创建对象时,先执行实例初始化块,然后调用构造函数,构造函数中的初始化会覆盖实例初始化块中已初始化的值。 ...
在本文中,我们讨论了 Java 类加载器中的静态变量初始化机制,了解了静态变量的初始化顺序和类加载器的生命周期。通过对静态变量初始化机制的理解,我们可以更好地掌握 Java 语言的基础知识,并更好地应用 Java 语言...