当前位置: 首页 > 面试题库 >

Java中的局部VS全局变量

白修谨
2023-03-14
问题内容

我以为我了解了Java中局部变量和全局变量之间的区别,直到今天看到一个示例。在这段代码中,我们尝试将元素添加到方法的链接列表中:

public void addDataPacket(DataPacket data){
    PacketQueueElement newElement = new PacketQueueElement(data);
    if(firstElement != null){
        lastElement.setNextElement(newElement);
        lastElement = newElement;
    }
    else{
        firstElement = newElement;
        lastElement = newElement;
    }
}

我不明白的是,为什么在关闭方法后newElement不会消失?因为这是局部变量,并且未在任何地方的类中定义。这是此类的完整代码:

public class PacketQueue {

/** Das erste Element in der Warteschlange */
private PacketQueueElement firstElement;

/** Das letzte Element in der Warteschlange. */
private PacketQueueElement lastElement;

/**
 * Instanziert eine neue Warteschlange.
 */
public PacketQueue(){
    this.firstElement = null;
    this.lastElement = null;
}

/**
 * Fuegt ein neues Paket ans Ende der Warteschlange an.
 *
 * @param data Das neue Paket
 */
public void addDataPacket(DataPacket data){
    PacketQueueElement newElement = new PacketQueueElement(data);
    if(firstElement != null){
        lastElement.setNextElement(newElement);
        lastElement = newElement;
    }
    else{
        firstElement = newElement;
        lastElement = newElement;
    }
}

/**
 * Entfernt das erste Element der Warteschlange und gibt es zurueck.
 *
 * @return Das erste Element in der Warteschlange
 */
public PacketQueueElement getAndRemoveFirstElement(){
    PacketQueueElement element = this.firstElement;
    this.firstElement = element.getNextElement();
    return element;
}

/**
 * Gibt das erste Paket aus dem ersten Element zurueck.
 *
 * @return Das erste Paket
 */
public DataPacket getFirstDataPacket(){
    return this.firstElement.getData();
}

/**
 * Entfernt das erste Paket der Warteschlange und gibt es zurueck.
 *
 * @return Das erste Paket in der Warteschlange
 */
public DataPacket getAndRemoveFirstDataPacket(){
    return this.getAndRemoveFirstElement().getData();
}

/**
 * Gibt das erste Element der Warteschlange zurueck
 *
 * @return Das erste Element
 */
public PacketQueueElement getFirstElement(){
    return this.firstElement;
}



/**
 * Ueberprueft, ob die Wartschlange leer ist.
 *
 * @return true, wenn sie leer ist
 */
public boolean isEmpty(){
    if(firstElement == null){
        return true;
    }
    else{
        return false;
    }
}

/* (non-Javadoc)
 * @see java.lang.Object#toString()
 */
public String toString(){
    PacketQueueElement element = this.firstElement;
    String s = "";
    while(element != null){
        s += element + "\n";
        element = element.getNextElement();
    }
    return s;
}

}

先感谢您


问题答案:

这是 变量对象的 混合,newElement确实是局部变量,在方法结束后会丢失,但是引用指向一个 对象
。如果没有引用(变量)指向对象,则该对象可以进行垃圾回收。在这种情况下newElementfirstElement双方都暂时指出了这一点。newElement当方法退出但firstElement它仍然指向它时它丢失了,因为lastElement它不符合垃圾收集的条件。

换句话说:变量是指对象,而不是对象本身。

  • 变量:可以在上面写地址的纸
  • 对象:房子
  • 垃圾收集器:拆除人员

我盖了一栋房子,把它的地址写在纸片上,这样你就可以到达那里,我把那张纸片递给你,你把纸片上的地址写到地址簿里,把纸片扔掉。

拆除人员通过查看是否还有住所来检查是否有人还在使用房屋。即使您扔掉了纸屑,您的地址簿中仍然有地址,因此房屋仍在使用中且未拆除



 类似资料:
  • 问题内容: 此代码为何起作用: 但这给出了“分配前引用的局部变量’var’”错误: 问题答案: 因为在第一个代码中,您已经创建了一个局部变量并使用了它的值,而在第二个代码中,您正在使用局部变量,而没有对其进行定义。 因此,如果要使第二个功能正常工作,则需要声明:- 在使用该功能之前。 而在此代码中: 更新 :- 但是,按照@Tim的注释,您不应在函数内部使用变量。最好在使用变量之前先定义变量,然后

  • 主要内容:局部变量,全局变量,局部变量和全局变量的综合示例在《 C语言形参和实参的区别》中提到,形参变量要等到函数被调用时才分配内存,调用结束后立即释放内存。这说明形参变量的作用域非常有限,只能在函数内部使用,离开该函数就无效了。 所谓 作用域( Scope ) ,就是变量的有效范围。 不仅对于形参变量,C语言中所有的变量都有自己的作用域。决定变量作用域的是变量的定义位置。 局部变量 定义在函数内部的变量称为 局部变量(Local Variable) ,

  • 问题内容: 我正在尝试使用exec运行一段python代码。 这导致以下输出 但是,如果我将代码更改为此- 然后工作正常-提供以下输出- 显然,A存在并且可以访问-在第一段代码中出了什么问题?我正在使用2.6.5,欢呼声, 科林 更新1 如果我检查类中的locals()- 然后很明显,locals()在两个地方都不相同- 但是,如果我这样做,就没有问题- 更新2 好的,所以这里的文档-http:

  • 问题内容: 我了解Python中局部变量和全局变量的概念,但是我只是有一个问题,为什么下面的代码中会出现错误?Python逐行执行代码,因此在读取第5行之前,它不知道a是局部变量。Python尝试执行第5行后,会回退一行并将其标记为错误吗? 问题答案: 设置和测试 为了分析您的问题,让我们创建两个独立的测试函数来复制您的问题: 版画。因此,调用此函数不是问题,而是在下一个函数上: 我们收到一个错误

  • 问题内容: 如何在Java中定义全局变量? 问题答案: 要定义全局变量,你可以使用静态关键字 现在你可以通过调用从任何地方访问a和b

  • 问题内容: 我还是Python的新手,我一直在尝试提高Python脚本的性能,因此我在有或没有全局变量的情况下对其进行了测试。我给它计时,令我惊讶的是,它在声明了全局变量的情况下运行得更快,而不是将局部变量传递给函数。这是怎么回事?我以为局部变量的执行速度更快?(我知道全球人并不安全,我仍然很好奇。) 问题答案: 当地人应该更快 根据此页面上的本地人和全球人: 当一行代码要求输入变量x的值时,Py