2016-03-27 3 views
1

Я хотел бы знать, в чем разница между двумя фрагментами кода при создании нового объекта относительно эффективности и использования памяти.Создание конструктора атрибутов по сравнению с просто созданием атрибутов и использованием конструктора по умолчанию

против

private Node head= new Node(0,null); 
private int size = 0; 

public MyLinkedList(){ 

} 

ответ

2

Когда ваш объект скомпилирован, компилятор создает 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 и увидеть, что полученные инструкции байткодом и их порядок для двух версий вашего класса практически одинаковы:

Bytecode comparison of the two versions of the MyLinkedList class

1

При вызове конструктора

В случае 1: обе переменные инициализируются только если переопределить конструктор по умолчанию называется

В случае 2: ​​вызов любой другой конструктор будет инициализировать две переменные. хотя любые инициализации в этих конструкторах не предоставляются.

Итак, если у вас есть один и только один конструктор, который является этим конструктором по умолчанию, то они ведут себя одинаково. Однако поведение меняется, если у вас есть другие конструкторы.

Смежные вопросы