Как я могу объявить переменную экземпляра (типа внутреннего класса) во внешнем классе? - PullRequest
0 голосов
/ 20 октября 2019

Я хочу объявить экземпляр во внешнем классе, прежде чем я определил внутренний класс, но в коде исчезла причина его возникновения:

class LinkedList 
{ 
    Node head; //line3

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


    public void push(int new_data) 
        { 

            Node new_node = new Node(new_data); //line 20

            new_node.next = head; 

            head = new_node; 
        } 
  1. В строке 3 я запутался, почемувы можете создать переменную экземпляра типа Node, когда вы определяете класс Node в строке 5.
  2. Кроме того, гипотетически, если бы я хотел создать переменную экземпляра в классе Node типа LinkedlistПозволит ли мне это сделать?
  3. В методе push в строке 20, когда он создает новый экземпляр Node, он также создает новый экземпляр LinkedList, потому что Node является внутренним классом LinkedList?

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Вы можете сделать это, потому что компилятор Java умный и может смотреть в будущее.

По этой же причине у вас может быть два класса A и B в отдельном источнике. файлы, где A относится к B, а B относится к A, т.е. циклическая зависимость , и она будет компилироваться нормально, если вы компилируете оба одновременно.

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

0 голосов
/ 20 октября 2019

Класс LikendList компилируется первым, когда он компилирует его, проверяя класс Node, который может находиться вне или внутри этого класса, затем класс Node компилируется, после чего LikendList будет скомпилирован. если вы предоставите LikendList внутри узла, он будет делать то же самое и компилируется, но во время выполнения вы можете встретить ошибку циклической ссылки

...