2016-03-27 73 views

回答

2

编译对象时,编译器会为您的构造函数创建一个instance initialization method,例如,您MyLinkedList类,为您的类的两个版本的编译器将创建方法如下:当您使用new关键字或MyLinkedList.class.newInstance()方法

public void <init>(MyLinkedList this) {...} 

该方法被调用。

此外,有三种方法来初始化对象:

  • 实例变量的初始化(如在上面的第二版本)
  • 实例初始化(如下所示)
  • 构造(如在第一个以上版本)

实例初始化:

private Node head; 
private int size; 

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

public MyLinkedList(){ 

} 

编译器将在<init>方法中放置实例变量初始化代码,实例初始化代码和构造函数体代码。当你创建一个新的实例时,编译器会做的第一件事是通过初始化实例变量为它们的默认值来为Object和它的所有实例变量分配内存。此后,调用<init>方法。确切的顺序在Java Language Specification

中概述。这将意味着关于效率和内存使用方面没有区别,并且考虑使用哪一个归结为您的使用情况和结构,例如,有了多个构造函数,您可能需要复制初始化代码或确保调用其他构造函数,通过实例初始化,您可以捕获异常或执行更复杂的计算,否则您无法通过实例变量初始化进行操作。

要验证,你可以安装Eclipse插件Bytecode Outline并看到所产生的字节码指令和它们的顺序为类的两个版本实际上是相同的:

Bytecode comparison of the two versions of the MyLinkedList class

1

在调用构造函数,

在案例1:只有在覆盖默认构造函数被调用

在案例2中这两个变量初始化:调用任何其他构造函数都会初始化这两个变量。即使这些构造函数中没有提供任何初始化。因此,如果你有一个且只有一个构造函数是这个默认的构造函数,那么它们的行为是相同的。但是,如果您有其他构造函数,行为会有所不同。

相关问题