据我所知,私有字段只能在定义它们的类中访问。
我有一个简单的单链表的代码:
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'关键字定义的子类相同吗?
干杯,谢谢你的帮助。
编辑:只是添加到这个问题,在链接列表的其他实现中,我看到人们为节点和列表定义了两个单独的类。对于我来说,节点成为链表的嵌套类更有意义。如果这不完全正确,请告诉我......
答案 0 :(得分:4)
但我想知道为什么我可以访问'数据'和'下一步' 我的函数在LinkedList中的类Node字段。
因为Java Language Specification says so
[...]如果成员或构造函数被声明为
private
,则访问权限为。{ 当且仅当它出现在顶层的主体内时才被允许 包含成员或的声明的类(第7.6节) 构造
您案例中的顶级课程为LinkedList
。班级Node
是LinkedList
的成员。因此它有意义(LinkedList
能够访问它的任何部分(Node
)。
添加到此,嵌套类与子类相同 使用'extends'关键字定义?
没有。有关嵌套类的详细信息,请参阅Java tutorials。 extends
关键字用于继承。请参阅corresponding Java tutorial。
对于我来说,节点成为链表的嵌套类更有意义。 如果这不完全正确,请告诉我......
不,你在做什么都没关系。使用LinkedList
类的人对它的实现方式不感兴趣,只要它遵循数据结构或规范的规则即可。您的Node
类已嵌套,private
隐藏了这些详细信息。这被称为information hiding和encapsulation,被认为是良好做法。
请注意,您的嵌套类也被视为内部类。您也可以在之前的链接中阅读相关内容。
答案 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”。