c语言编程笔录

首页 >   > 笔记大全

笔记大全

Java项目中怎么使用对象初始化顺序

更新时间:2023-10-21

对象初始化顺序的概念

在Java程序中,当我们创建一个新对象时,必须对其初始值的各个成员变量进行初始化。对象初始化顺序是指当一个类的对象被创建时,其中的成员变量按顺序初始化的过程。该过程是基于类的继承关系和成员变量定义的,并且每个类块中的变量初始化按照文本顺序。

public class ParentClass {
    String parentName = "Parent Name";
    public ParentClass() {
        System.out.println("ParentClass 构造方法");
    }
}

public class ChildClass extends ParentClass {
    String childName = "Child Name";
    public ChildClass() {
        System.out.println("ChildClass 构造方法");
    }
}

在上述代码示例中,ChildClass 继承了 ParentClass。在创建 ChildClass 对象时,会先调用父类构造方法 ParentClass() 。也就是说,在调用构造方法之前,ParentClass 的成员变量 parentName 已经被赋值。

成员变量初始化顺序

当初始化一个对象时,成员变量按照以下顺序初始化:

  1. 父类静态成员变量
  2. 子类静态成员变量
  3. 父类非静态成员变量
  4. 父类构造函数
  5. 子类非静态成员变量
  6. 子类构造函数

父类和子类的静态成员变量在初始化时只会执行一次,不论有多少个对象被创建。而每个对象都会有一份非静态成员变量。

public class InitOrderExample {
    private static final String STATIC_FINAL_VAR = "这是定义在 InitOrderExample 中的静态常量";
    private static String staticVar = "这是定义在 InitOrderExample 中的静态变量";
    private String instanceVar = "这是定义在 InitOrderExample 中的实例变量";
    
    static {
        System.out.println(STATIC_FINAL_VAR); // 1
        System.out.println(staticVar); // 2
        staticVar = "初始化静态变量"; 
    }
    
    {
        System.out.println(instanceVar); // 4
        instanceVar = "初始化实例变量";
    }
    
    public InitOrderExample() {
        System.out.println("构造 InitOrderExample 对象"); // 5
    }
}

public class InitOrderExampleChild extends InitOrderExample {
    private static String childStaticVar = "这是定义在 InitOrderExampleChild 中的静态变量";
    private String childInstanceVar = "这是定义在 InitOrderExampleChild 中的实例变量";

    static {
        System.out.println(childStaticVar); // 3
    }
    
    {
        System.out.println(childInstanceVar); // 6
        childInstanceVar = "初始化 InitOrderExampleChild 实例变量";
    }
    
    public InitOrderExampleChild() {
        System.out.println("构造 InitOrderExampleChild 对象"); // 7
    }
}

在上述代码示例中,我们创建了一个父类 InitOrderExample 和子类 InitOrderExampleChild,并且按照对象初始化顺序进行输出。

注意事项

在进行对象初始化时,需要注意以下三个方面:

  1. 成员变量初始化顺序必须遵循默认顺序,否则会出现编译错误。
  2. 在子类中调用父类构造函数时,必须使用 super(),并放在子类构造函数的起始部分,否则会出现编译错误。
  3. 静态变量只会初始化一次,而且在类加载的过程中完成初始化。即使没有创建任何对象,静态变量也会被初始化。

结语

对象初始化顺序是编写安全、高效代码的重要要素。只有了解它的基础知识和规则,才能优化项目的性能并避免不必要的错误。在处理大型代码库时,对其进行正确的初始化和排序非常关键,需要遵循惯例和最佳实践。