В java может ли вложенный объект класса использовать метод включающего класса? - PullRequest
0 голосов
/ 22 февраля 2019

Я создал простой список классов.Что я хочу сделать, это создать метод в SLList, чтобы дать размер объекта SLList.Я хочу сделать это рекурсивно, однако следующий метод size (), который я создал, просто не работает.Я знаю другие способы реализовать это, такие как создание вспомогательного метода.Но что меня интересует, так это то, что мой size () не работает?Сообщение об ошибке «size () не определено для SLList.IntNode».Зачем?Поскольку я сделал вложенный класс IntMode просто общедоступным и нестатичным, почему он не может использовать метод, определенный в классе SLList?

public class SLList {

    public class IntNode {

        public int item;
        public IntNode next;

        public IntNode(int i, IntNode n) {
            item = i;
            next = n;
        }
    }

    private IntNode first;

    public SLList(int x) {
        first = new IntNode(x, null);
    }

    public int size() {
        if (first.next == null) {
           return 1;
        }
        return 1 + first.next.size();
    }
}

Я просто новичок в Java и совершенно не уверен встатичные вещи, особенно когда дело доходит до класса.Спасибо, что кто-нибудь ответил мне.

Ответы [ 4 ]

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

Добавьте метод размера в класс IntNode и получите доступ к нему из метода размера SLList, чтобы вычислить полный размер списка.Следующий фрагмент кода не требует пояснений.Для получения дополнительной информации о вложенных классах см. https://www.programiz.com/java-programming/nested-inner-class

public class SLList {

    public class IntNode {

        public int item;
        public IntNode next;

        public IntNode(int i, IntNode n) {
            item = i;
            next = n;
        }

        public int size() {
            IntNode tmp = next;

            if (tmp == null) {
                return 1;
            }

            return 1 + tmp.size();
        }
    }

    private IntNode first;

    public SLList(int x) {
        first = new IntNode(x, null);
    }

    public int size() {
        if (first == null)
            return 0;
        return first.size();
    }

    public static void main(String[] args) {
        SLList list = new SLList(10);
        list.first.next = list.new IntNode(20, null);
        list.first.next.next = list.new IntNode(30, null);
        list.first.next.next.next = list.new IntNode(40, null);

        System.out.println(list.size());
    }
}
0 голосов
/ 22 февраля 2019

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

class SLList {

    public class IntNode {

        public int item;
        public IntNode next;

        public IntNode(int i, IntNode n) {
            item = i;
            next = n;
        }

        private int theSize()
        {
            return size();
        }
    }

    private IntNode first;

    public SLList(int x) {
        first = new IntNode(x, null);
    }

    public int size() {
        if (first.next == null) {
            return 1;
        }
        return 1 + first.next.theSize();
    }
}
0 голосов
/ 22 февраля 2019

size() - это метод SLList, а не IntNode.Вы можете ссылаться на метод внешнего класса внутри IntNode следующим образом:

public class SLList {

    public class IntNode {
        ...

        public int size() {
            return SLList.this.size();
        }
    }

    ...

    public static int size() {
        ...
    }
}
0 голосов
/ 22 февраля 2019

Причина: ваш метод size() в классе SLList .

Следовательно, nested inner class IntNode.

к нему нельзя получить доступ.
...