Java 为属性创建构造函数与仅创建属性并使用默认构造函数相比

Java 为属性创建构造函数与仅创建属性并使用默认构造函数相比,java,constructor,Java,Constructor,我想知道当我创建一个新对象时,这两个代码片段在效率和内存使用方面有什么不同 private Node head; private int size; public MyLinkedList(){ head = new Node(0,null); size = 0; } vs 调用构造函数时 在案例1中:仅当调用重写的默认构造函数时,这两个变量才会初始化 在案例2中:调用任何其他构造函数将初始化这两个变量。即使这些构造函数中没有提供任何初始化 因此,如果您有一个且只有一个构造

我想知道当我创建一个新对象时,这两个代码片段在效率和内存使用方面有什么不同

private Node head;
private int size;

public MyLinkedList(){
    head  = new Node(0,null);
    size = 0;
}
vs


调用构造函数时

在案例1中:仅当调用重写的默认构造函数时,这两个变量才会初始化

在案例2中:调用任何其他构造函数将初始化这两个变量。即使这些构造函数中没有提供任何初始化


因此,如果您有一个且只有一个构造函数,即默认构造函数,那么它们的行为是相同的。但是,如果您有其他构造函数,则行为会有所不同。

编译对象时,编译器会为您的构造函数创建一个
实例初始化方法
,例如,对于您的类
MyLinkedList
,编译器会为您的两个版本的类创建方法,如下所示:

public void <init>(MyLinkedList this) {...}
编译器将实例变量初始化代码、实例初始化代码和构造函数主体代码放在
方法中。创建新实例时,编译器要做的第一件事是通过将实例变量初始化为默认值,为对象及其所有实例变量分配内存。然后调用
方法。准确的顺序如图所示:

这意味着在效率和内存使用方面没有区别,使用哪一个取决于您的用例和结构,例如,对于多个构造函数,您可能需要复制初始化代码或确保调用其他构造函数,通过实例初始化,您可以捕获异常或执行更复杂的计算,而这是通过实例变量初始化无法完成的

为了验证,您可以安装Eclipse插件,并查看生成的字节码指令及其在类的两个版本中的顺序实际上是相同的:

public void <init>(MyLinkedList this) {...}
private Node head;
private int size;

{
    Node = new Node(0,null);
    int = 0;
}

public MyLinkedList(){

}