java - Java 中的局部变量 VS 全局变量

标签 java variables global local

我以为我理解了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;
}

提前致谢

最佳答案

enter image description here newElement 只是对在内存中创建的对象的引用。

firstElement 然后持有对同一对象的引用。

引用 newElement 确实是一个局部变量,但引用所引用的对象随后也被另一个引用引用,即 firstElement。所以在 addDataPacket() 方法完成后,newElement 引用不再存在,但它引用的对象仍然存在于内存中并且该对象由 引用>第一个元素

关于java - Java 中的局部变量 VS 全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21858226/

相关文章:

javascript - jQuery 动态按钮选择器

javascript - 多次声明变量

android - 存储变量以便在 Activity 发生变化时保留该值的正确方法是什么?

框架中的 php 全局变量开销

git - 当你在 Windows 上为 git 设置一个全局配置选项时,它会被写入到哪里?

php - 我需要一个全局范围内的 PHP 对象。我该怎么做,或者有更好的方法吗?

java - 如何将有关列表项的信息传递给新的列表 Activity ?

java - java中未指定泛型和<?>之间的编译差异

java - 如何将通量链接到另一个通量/单声道并施加另一个背压?

java - <a4j :commandbutton> doesn't show <h:message> created on its action method