Java LinkedList имеет пустой конструктор в своем исходном коде

#java

#java

Вопрос:

Это то, о чем я пишу ниже LinkedList.java в jdk-8u111 правильно?

 /**
 * Constructs an empty list.
 */
public LinkedList() {
}
  

Мы можем видеть, что в конструкторе не существует кода, и цель
такой странный конструктор предназначен для более поздних подклассов. Как мы знаем, что
компилятор автоматически предоставит параметр без аргументов super() для
конструктор подкласса, если конструктор не имеет явного super()
вызов. Компилятор сообщал бы об ошибке, если бы родительский класс не имел такого
конструктор без аргументов.

 Error:(x, y) java: no suitable constructor found for parent class(no arguments)
  

Мы можем заключить, что пустой конструктор LinkedList предназначен для использования подклассом.

Ответ №1:

Нет, это не имеет ничего общего с подклассами.

Если вы не определяете никаких конструкторов, Java автоматически добавит конструктор по умолчанию. Однако, если вы определяете другие конструкторы, тогда конструктор по умолчанию должен быть выписан. Потому что этот конструктор существует:

 LinkedList(Collection<? extends E> c);
  

Конструктор по умолчанию должен быть явно определен:

 LinkedList();
  

Он работает и не выдает ошибок, если я не выписываю явный пустой конструктор по умолчанию. Компилятор выполняется успешно. Так что, можно не записывать это? Зачем его записывать, если у нас уже есть другой конструктор?

  • При отсутствии конструкторов добавляется конструктор по умолчанию, и мы можем успешно вызвать new Thing() :

     class Thing {
    }
    
    Thing t = new Thing();
      
  • С добавлением конструктора, отличного от стандартного, Java больше не добавляет конструктор по умолчанию самостоятельно. Теперь new Thing() ошибка.

     class Thing {
        public Thing(int foo) { }
    }
    
    Thing t = new Thing();
      

    Результат:

     Test.java:7: error: constructor Thing in class Thing cannot be applied to given types;
            Thing t = new Thing();
                      ^
      required: int
      found: no arguments
      reason: actual and formal argument lists differ in length
    1 error
      
  • Мы должны выписать конструктор по умолчанию для компиляции кода:

     class Thing {
        public Thing() { }
        public Thing(int foo) { }
    }
    
    Thing t = new Thing();
      

Комментарии:

1. привет, Джон: большое спасибо, что я прояснил это сейчас. Выписать конструктор по умолчанию — значит помочь инициализации новым объектом без аргументов. Но конструктор по умолчанию не может быть использован и может быть удален, если мы всегда используем другой конструктор вместо стандартного. Кроме того, отсутствие конструктора по умолчанию привело бы к тому, что его подклассу пришлось бы явно вызывать super () с аргументом, потому что компилятор предоставил super() для подкласса, который исправлен без аргумента, сообщит об ошибке.