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

时间:2014-02-01 00:01:06

标签: java

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

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

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'关键字定义的子类相同吗?

干杯,谢谢你的帮助。

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

3 个答案:

答案 0 :(得分:4)

  

但我想知道为什么我可以访问'数据'和'下一步'   我的函数在LinkedList中的类Node字段。

因为Java Language Specification says so

  

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

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

  

添加到此,嵌套类与子类相同   使用'extends'关键字定义?

没有。有关嵌套类的详细信息,请参阅Java tutorialsextends关键字用于继承。请参阅corresponding Java tutorial

  

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

不,你在做什么都没关系。使用LinkedList类的人对它的实现方式不感兴趣,只要它遵循数据结构或规范的规则即可。您的Node类已嵌套,private隐藏了这些详细信息。这被称为information hidingencapsulation,被认为是良好做法。

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

答案 1 :(得分:1)

  

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

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

  

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

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

  

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

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

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

答案 2 :(得分:-2)

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

绝对不是。嵌套类是类,其中每个实例都具有对封闭类实例的“隐藏引用”。除非声明为“静态”,否则它只是一种噱头......我不确定是什么,

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

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