Java本地对象变量的作用域

时间:2014-01-22 19:22:42

标签: java scope

我正在尝试使用“数据结构”和“数据结构”这本书重新学习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方法如何仍然可以访问这些链接对象?

2 个答案:

答案 0 :(得分:3)

newlinkinsertFirst变量的值会复制到实例变量中:

first=newlink;

然后在displayLink中,first的值被复制回局部变量:

link current=first;

区分变量及其值以及引用和对象之间的区别非常重要。所有这些link变量的值仅为引用。

(顺便说一句,这个例子直接出自本书吗?如果是这样,我关注的是使用link等非常规名称而不是Link作为一个类,{{{ 1}}而不是newlink作为变量。)

答案 1 :(得分:0)

使用new关键字创建的对象在堆上分配,然后该对象的地址被推送到本地调用堆栈。

当从调用堆栈弹出本地堆栈帧时,对象指针(局部变量)超出范围。这个临时孤儿是堆上的对象。这是垃圾收集的地方

垃圾收集器(GC)将抓取堆查找对象,该对象的地址未在调用堆栈中的任何其他位置引用,然后将其丢弃。

对于在link方法中本地创建的insertFirst对象,该地址仍然被调用堆栈上的对象引用,因此GC永远不会收集该对象,因此该对象仍然存在。当您执行第first=newlink行时,您将该地址存储在一个不会超出范围的地方,直到收集父对象为止。