假设我有两个课程ListNode
和List
。
public class List{
private ListNode head;
public List(){head = null;}
public void insertFront (int obj)
{
head = new ListNode(obj, head);
}
// other methods to be declared
public boolean isEmpty(){...}
public Object removeFront() {...}
public Object removeBack(){...}
public void insertBack(Object value){...}
public ListNode nth(int i){...}
public void insertAfter(ListNode node, Object value){...}
}
public class ListNode{
public Object item;
public ListNode next;
public ListNode(Object value,ListNode next){
this.item = value;
this.next=next;
}
public ListNode(Object value){
this(value,null);
}
}
在我看过的视频中,它说没有List
的方法返回ListNode
,因此单个节点不能被篡改。外部课程无法获得列表中Node
的引用
这是否意味着我创建一个列表
List list=new List();
list.insertFront("a");
list.insertFront("b");
list.insertFront("c");
此特定列表无法由外部类更改。但是外部类仍然可以创建单独的链表吗?
public class A{
public static void main (String args[]){
ListNode list=new ListNode("a");
System.out.println(list.item);
}
}
有没有办法可以在课堂A上访问课程List
中创建的项目?
有人可以解释封装如何工作,因为我不熟悉Java和编程,我仍然试图理解封装的概念。
答案 0 :(得分:3)
您可以在List类中定义ListNode类,而不是创建两个不同的类。这样,您将隐藏使用ListNode类的内部表示。
此外,链表支持的基本API是
public void addItem(int val);
public void removeItem(int val)
public int size()
list.insertFront()可以在列表类中轻松实现。列表类将有一个字段“head”,它将是链表的头部。因此,要在链接列表的前面插入节点,您所要做的就是更改链接列表的头部。现在没有必要将头引用传递给调用类。
removeFront,removeBack等可以类似地实现。
但是,如果要删除链接列表中的特定节点,则必须更改API和实现。即,我们没有添加从链表中删除特定节点的功能。当前的remove方法将int值作为参数,而不是Node类的对象。
您可以在Java here中找到双向链表类的实现。我觉得这个实现是可靠的,因为这个实现是由普林斯顿大学的教授教授的。
答案 1 :(得分:0)
在尝试使用java来理解封装之前,您应该阅读Java中的访问修饰符。
如果将变量标记为公共变量,则始终可以访问任何对象。然而,这是一种不好的做法。您的对象应始终是私有或受保护的。
由于您将ListNode元素标记为私有,因此除了ListNode类/对象之外的任何地方都无法访问它,除非您有一个返回该引用的泄漏函数(这是错误的代码)
对于Ex: 公共类列表{ private ListNode internalListNode; .... public ListNode badLeakyRef(){ return internalListNode; } }