我正在研究数据结构。在研究链表时,我想知道这是否是好的做法。这是我的代码:
class LinkedListStack {
// <-- Node
private class Node { // I made a private class!
private int data;
private Node next;
public Node(int data) {
this.data = data;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
// Node -->
// <-- Logic
private Node headNode = null;
public int top() {
if(headNode == null) {
System.out.println("Empty stack");
return 0;
}
else {
return headNode.getData();
}
}
...
实际上,我通常在类 LinkedListStack 之外创建节点类 - 但是可以创建私有类 Node 吗? 我发现的问题是在方法 top()中,我可以直接访问变量 data 和 next 。有没有办法阻止在LinkedListStack类中访问类Node的局部变量(data,next)?此外,我想知道一个私人班级的“真实”例子。实际上人们什么时候在现实世界中使用私人课程?为什么我们需要它?
答案 0 :(得分:4)
我发现的问题是,在方法
top()
中,我可以直接访问变量数据。
这不是问题,这是一个功能。 Java允许您的外部类访问其内部类的私有方法和字段,即使该类及其所有字段都是private
。
这个的基本原理是嵌套类是你自己的类实现的一部分,所以这两个类都可以访问彼此的私有成员。
我通常在类
之外创建节点类LinkedListStack
当一个嵌套类看起来像一个可以在类外定义的类时,这是一个很好的指示,该类应该是静态的,如下所示:
private static class Node {
...
}
这是因为非静态嵌套类具有对其外部类的对象的隐式引用 - LinkedListStack
在你的情况下,Node
类不需要。
答案 1 :(得分:2)
如果使用内部类实现它,则无法阻止父类查看它的私有字段。幸运的是,这样做是没有用的。这里的内部类很完美,例如参见java.util.HashMap
的实现,它使用(至少在JDK8中)一个名为Node
的内部类,用于表示链接列表。
实际上,仅Node
没有任何意义,这就是为什么将它隐藏为私人内部类更好的做法。
答案 2 :(得分:1)
从外层你可以访问内部类的私有变量。你可以在那里做很多事情。
当从设计角度确定私有内部类不会在封闭类之外使用时,使用私有内部类。对于LinkedList节点看起来并不正确,因为在其他一些代码中你想引用LinkedList中的Node Object。
正如@Dici在评论中建议的那样,它可以作为私人使用。只有当next()方法返回Node中的数据而不是Node本身时。您可以在LinkedList JDK implementation中看到此私有Node类。但是,如果您希望在封闭类之外操作Node对象,则它不应该是私有的。