在Java中,嵌套类对象可以使用封闭类方法吗?

时间:2019-02-22 11:20:37

标签: java static inner-classes

我创建了一个简单的列表类。我想做的是在SLList中创建一个方法来为SLList对象提供大小。我想递归地执行此操作,但是,我创建的以下size()方法不起作用。我知道实现它的其他方法,例如创建一个辅助方法。但是我很好奇的是,为什么我的size()不起作用?错误消息是“未为SLList.IntNode定义size()”。为什么?由于我将嵌套的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,对私有和静态事物非常困惑,尤其是在涉及Class时。谢谢您回答我。

4 个答案:

答案 0 :(得分:0)

原因是:您的方法 size() 在类 SLList 中。

因此nested inner class IntNode无法访问它。

答案 1 :(得分:0)

您可以通过添加一个额外的私有方法来摆弄它,但这并不是特别容易推论。除非绝对必要,否则我将避免这样做。

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();
    }
}

答案 2 :(得分:0)

size()SLList而非IntNode的方法。您可以在IntNode中引用外部类方法,如下所示:

public class SLList {

    public class IntNode {
        ...

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

    ...

    public static int size() {
        ...
    }
}

答案 3 :(得分:0)

向IntNode类添加一个size方法,并从SLList size方法访问它,以计算列表的整个大小。以下代码段不言自明。有关嵌套类的更多信息,请参见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());
    }
}