Статический вложенный класс в Java - PullRequest
0 голосов
/ 19 февраля 2019
public class LinkedList { 

    Node head; // head of list 

    // Linked list Node. 
    // This inner class is made static 
    // so that main() can access it 
     static class Node { 

        int data; 
        Node next; 

        // Constructor 
        Node(int d) 
        { 
            data = d; 
            next = null; 
        } 
    } 
}

Я читал о статическом внутреннем классе, что он похож на нормальный класс.

В этом я не понимаю, как Глава узла вызывается даже до объявления статического внутреннего класса?

Статический внутренний класс компилируется первым, потому что этот внешний класс знает о внутреннем классе еще до того, как объявил его?

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Вы объявляете переменную (не вызывая) типа Node, затем компилятор ищет тип Node.Поскольку вы определили Node как статический внутренний класс (или внутренний класс), компилятор узнает, что такое узел на самом деле.Порядок членов в классе Java не имеет значения.

0 голосов
/ 19 февраля 2019

И, как упоминалось в Компиляция Java :

В Java, если вы использовали любую ссылку на любой другой объект Java, класс для этого объекта будет автоматически скомпилирован, если это не было скомпилировано уже.Эти автоматические компиляции являются вложенными, и это продолжается до тех пор, пока не будут скомпилированы все классы, необходимые для запуска программы.Поэтому обычно достаточно скомпилировать только класс высокого уровня, поскольку все зависимые классы будут автоматически скомпилированы.

Итак, в целом вы правы.

Как насчет причин, по которымиспользуя вложенные классы?В учебнике Oracle Nested Classes говорится:

Необоснованные причины использования вложенных классов:

Это способ логической группировки классов, которые используются тольков одном месте: если класс полезен только для одного другого класса, то логично встроить его в этот класс и сохранить их вместе.Вложение таких «вспомогательных классов» делает их пакет более упорядоченным.

Это увеличивает инкапсуляцию: рассмотрим два класса верхнего уровня, A и B, где B нужен доступ к членам A, которые в противном случае были бы объявлены закрытыми.Скрывая класс B в классе A, члены A могут быть объявлены частными, и B может получить к ним доступ.Кроме того, сам B может быть скрыт от внешнего мира.

Это может привести к более удобочитаемому и поддерживаемому коду: вложение небольших классов в классы верхнего уровня размещает код ближе к месту его использования.

Это верно для всех вложенных классов, включая статические.

0 голосов
/ 19 февраля 2019

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

Этот ответ дает еще один хороший пример этого: объяснить порядок компиляции Java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...