Когда ваш объект скомпилирован, компилятор создает instance initialization method
для ваших конструкторов, например. для вашего класса MyLinkedList
, компилятор для обеих версий вашего класса создать метод следующим образом:
public void <init>(MyLinkedList this) {...}
Этот метод вызывается при использовании new
ключевое слово или метод MyLinkedList.class.newInstance()
.
Кроме того, существует три способа инициализации объекта:
- Instance инициализация переменной (как в вашей второй версии выше)
- Instance инициализации (как показано ниже)
- Конструктора (как и в вашем первом версия выше)
Instance Initialization:
private Node head;
private int size;
{
Node = new Node(0,null);
int = 0;
}
public MyLinkedList(){
}
Компилятор разместит код инициализации переменной экземпляра, код инициализации экземпляра и код тела конструктора в методе <init>
. Когда вы создаете новый экземпляр, первое, что сделает компилятор, это выделить память для объекта и всех его переменных экземпляра, инициализируя переменные экземпляра их значениями по умолчанию. После этого вызывается метод <init>
. Точная последовательность описана в Java Language Specification:
Это будет означать, что нет никакой разницы в эффективности и использовании памяти, и рассмотрение того, какой из них использовать, сводится к вашему варианту использования и структурированию, например. с несколькими конструкторами, возможно, вам придется дублировать код инициализации или обязательно вызвать другие конструкторы, при инициализации экземпляра вы можете перехватывать исключения или делать более сложные вычисления, которые вы не могли бы сделать с инициализацией переменной экземпляра.
Чтобы проверить, можно установить плагин для Eclipse Bytecode Outline и увидеть, что полученные инструкции байткодом и их порядок для двух версий вашего класса практически одинаковы: