繁体   English   中英

Java - 类可以访问其嵌套类的私有字段吗?

[英]Java - Can a class access a private field of its nested class?

据我所知,私有字段只能在定义它们的类中访问。

我有一个简单的单链表的代码:

public class LinkedList {
    private class Node {
        private String data;
        private Node next;

        private Node(String data, Node nextNode) {
            this.data = data;
            this.next = nextNode;
        }
    }
    private Node head;
    public LinkedList(String data) {
        // Create head node, set next node null
        head = new Node(data, null);
    }
    public void add(String data){
        Node currentNode = head;
        while(currentNode.next != null){
            currentNode = currentNode.next;
        }
        currentNode.next = new Node(data, null);
    }
    public void printList(){
        Node currentNode = head;
        System.out.println(currentNode.data);
        while(currentNode.next != null){
            currentNode = currentNode.next;
            System.out.println(currentNode.data);
        }
    }
}

它似乎运行和工作得很好,但我想弄清楚为什么我可以在类LinkedList中的函数中访问类Node的'data'和'next'字段。

除此之外,嵌套类与使用'extends'关键字定义的子类相同吗?

干杯,谢谢你的帮助。

编辑:只是添加到这个问题,在链接列表的其他实现中,我看到人们为节点和列表定义了两个单独的类。 对于我来说,节点成为链表的嵌套类更有意义。 如果这不完全正确请告诉我...

但我想弄清楚为什么我可以在类LinkedList中的函数中访问类Node的'data'和'next'字段。

因为Java语言规范是这样说的

[...]如果成员或构造函数被声明为private ,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问。

您的案例中的顶级类是LinkedList Node类是LinkedList的成员。 因此它有意义( LinkedList能够访问它的任何部分( Node )。

除此之外,嵌套类与使用'extends'关键字定义的子类相同吗?

不可以。有关嵌套类的详细信息,请参阅Java教程 extends关键字用于继承。 请参阅相应的Java教程

对于我来说,节点成为链表的嵌套类更有意义。 如果这不完全正确请告诉我...

不,你做的很好。 只要遵循数据结构或规范的规则,使用LinkedList类的人就不会对它的实现方式感兴趣。 嵌套和private Node类隐藏了这些细节。 这被称为信息隐藏封装 ,被认为是良好的做法。

请注意,您的嵌套类也被视为内部类。 您也可以在之前的链接中阅读相关内容。

为什么我可以在类LinkedList中的函数中访问类Node的'data'和'next'字段。

你可以。 该范围在java中是有意的。

嵌套类与使用'extends'关键字定义的子类相同吗?

不,因为在您的Node类中,您无法访问this.head 但是,您可以访问LinkedList.this.head

只是添加到这个问题,在链接列表的其他实现中,我看到人们为节点和列表定义了两个单独的类。 对于我来说,节点成为链表的嵌套类更有意义。 如果这不完全正确,请告诉我

我觉得你的路很好。 它隐藏了Node,这是列表的内部实现细节。 为了进一步改进它,你可以使它成为通用的,这样add()可以采用任何类型。 例如

public class LinkedList <T> {
    //...
    public void add(T value) {
        //...
    }
}

绝对不。 嵌套类是类,其中每个实例都具有对封闭类实例的“隐藏引用”。 除非声明“静态”,在这种情况下它只是一种噱头....我不知道是什么,

坦率地说,嵌套类是魔鬼的工作。 它们使代码混乱且难以阅读,创建隐式依赖关系并且通常是要维护的PITA。 避免。

事实上,这可能会导致宗教战争,所以“YMMV”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM