[英]Using Java reflection, can I access a private field of type private static nested class?
[英]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'字段。
[...]如果成员或构造函数被声明为
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.