zangsy
zangsy

Reputation: 35

In java, can nested class object use the enclosing class method?

I created a simple list class. What I want to do is to create a method in SLList to give the size a SLList object. I want to do it recursively, however, the following size() method I created just does not work. I know other ways to realize it such as creating a helper method. But what I am curious about is that why does my size() does not work? The error message is the "size() is undefined for SLList.IntNode". Why? Since I made the nested IntMode class just public and non-static, why it cannot use the method that is defined in SLList class?

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

I am just new to Java, and quite confused about the private and static things, especially when it comes to the Class. Thank you for anyone answering me.

Upvotes: 0

Views: 120

Answers (5)

Yunus
Yunus

Reputation: 84

The reason for the error is because the size() method definition is outside of IntNode. The definition for size() is missing in class IntNode.

In addition about doing recursive method, the recursive implementation normally have entry method and the recursive. Your implementation missing the recursive method.

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

// recursive - private, only called from size()
private int nodeSize( IntNode node) {
   if (node == null) {
      return 0;
   }
   return 1 + nodeSize( node.next );
}

Upvotes: 0

Azad
Azad

Reputation: 171

Add a size method to IntNode class and access it from SLList size method to calculate the entire size of the list. The following code snippet is self explanatory. For more information about nested classes refer 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());
    }
}

Upvotes: 0

devmind
devmind

Reputation: 364

size() is a method of SLList, not IntNode. You can refer to outer class method inside IntNode as follows:

public class SLList {

    public class IntNode {
        ...

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

    ...

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

Upvotes: 0

Michael
Michael

Reputation: 44150

You can fiddle it by adding an extra private method but it's not particularly easy to reason about. I would avoid doing it this way unless absolutely necessary.

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

Upvotes: 1

Raj
Raj

Reputation: 727

Reason is : your method size() is in class SLList.

Hence it cannot be accessed by nested inner class IntNode.

Upvotes: 0

Related Questions