我正在尝试使用“数据结构”和“数据结构”这本书重新学习Java。 Java中的算法,在第191页,该书实现了链接列表。代码首先构建一个链接类,一个链接列表类和一个客户端类linkapp。
public class Link {
public int data;
public link next;
public Link (int newdata){
data=newdata;
}
}
public class Linklist {
public Link first;
public void insertFirst(int data){
Link newlink=new Link (data);
newlink.next=first;
first=newlink;
}
public boolean isEmpty(){ return (first==null); }
public void displaylist(){
if (!isEmpty()){
Link current=first;
while(current!=null){
System.out.print(current.data);
current=current.next;}
}
}
}
public class LinklistApp {
public static void main(String[] args) {
Linkedlist linkList = new Linkedlist();
linkList.insertFirst(3);
linkList.insertFirst(4);
linkList.insertFirst(5);
linkList.displaylist();
}
}
但是我不明白为什么可以通过displaylist方法访问linklist类中的insertFirst方法本地创建的链接对象。方法退出时局部变量将消失,因为它们只是中间结果。那么displaylist方法如何仍然可以访问这些链接对象?
答案 0 :(得分:3)
newlink
中insertFirst
变量的值会复制到实例变量中:
first=newlink;
然后在displayLink
中,first
的值被复制回局部变量:
link current=first;
区分变量及其值以及引用和对象之间的区别非常重要。所有这些link
变量的值仅为引用。
(顺便说一句,这个例子直接出自本书吗?如果是这样,我关注的是使用link
等非常规名称而不是Link
作为一个类,{{{ 1}}而不是newlink
作为变量。)
答案 1 :(得分:0)
使用new
关键字创建的对象在堆上分配,然后该对象的地址被推送到本地调用堆栈。
当从调用堆栈弹出本地堆栈帧时,对象指针(局部变量)超出范围。这个临时孤儿是堆上的对象。这是垃圾收集的地方
垃圾收集器(GC)将抓取堆查找对象,该对象的地址未在调用堆栈中的任何其他位置引用,然后将其丢弃。
对于在link
方法中本地创建的insertFirst
对象,该地址仍然被调用堆栈上的对象引用,因此GC永远不会收集该对象,因此该对象仍然存在。当您执行第first=newlink
行时,您将该地址存储在一个不会超出范围的地方,直到收集父对象为止。