猿问

为什么我的 var“first” 上的“private”关键字不起作用?

这些天我正在使用 CS61b。我被访问控制的讲座困住了。我的变量first和类IntNode上的“private”关键字无法正常工作。


在谷歌上搜索但一无所获。


public class SLList {

    private IntNode first;


    /**

     * If the nested class never uses any instance variables or methods of the outer

     * class, declare it static.

     */

    private static class IntNode {

        public IntNode next;

        public int item;


        public IntNode(int i, IntNode n) {

            next = n;

            item = i;

        }


    }


    public SLList(int x) {

        first = new IntNode(x, null);

    }




    public void addFirst(int x) {

        first = new IntNode(x, first);

    }


    public int getFirst() {

        return first.item;

    }

/** ----------------SIZE---------------------- */

    private int size(IntNode L) {

        if (L.next == null) {

            return 1;

        }


        return 1 + size(L.next);

    }


    public int size() {

        return size(first);

    }

/**-------------------SIZE------------------- */



/**---------------add LAST ------------------*/

/** how to solve null pointer expectation? */

    public void addLast(int x) {

        IntNode p=first;

        while(p.next!=null){

            p=p.next;

        }

        p.next=new IntNode(x, null);

    }

/**---------------add LAST ------------------*/


    public static void main(String[] args) {

        SLList L = new SLList(5);

        L.addFirst(10);

        L.addFirst(15);

        System.out.println(L.getFirst());

        System.out.println(L.size());

        L.addLast(20);

        L.first.next.next = L.first.next;  /** <----- I can still get√ access to first. */


    }

}

我预计会出现错误:first has private class in SLList,但我没有任何错误。


慕村225694
浏览 77回答 1
1回答

郎朗坤

请参阅Java 语言规范第 6.6.1 节:仅当类型可访问并且声明成员或构造函数允许访问时,引用类型的成员(类、接口、字段或方法)或类类型的构造函数才可访问:如果成员或构造函数被声明为公共,则允许访问。缺少访问修饰符的接口的所有成员都是隐式公共的。否则,如果成员或构造函数被声明为受保护,则仅当满足以下条件之一时才允许访问:对成员或构造函数的访问发生在包含声明受保护成员或构造函数的类的包内。访问正确,如§6.6.2中所述。否则,如果使用包访问来声明成员或构造函数,则仅当访问发生在声明该类型的包内时才允许访问。没有访问修饰符声明的类成员或构造函数隐式具有包访问权限。否则,成员或构造函数被声明为 private,并且当且仅当访问发生在包含成员或构造函数声明的顶级类型(第 7.6 节)的主体内时,才允许访问。(强调我的)由于您的访问first位于同一顶级类型内,因此您可以毫无问题、错误或任何其他情况地访问它。
随时随地看视频慕课网APP

相关分类

Java
我要回答