在我今天看到一个例子之前,我以为我理解了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;
}
}
提前谢谢
答案 0 :(得分:8)
newElement
只是对在内存中创建的对象的引用。
firstElement
然后保存对同一对象的引用。
引用newElement
确实是局部变量,但引用引用的对象也由另一个引用引用,即firstElement
。因此,addDataPacket()
方法完成后,newElement
引用不再存在,但它引用的对象仍然存在于内存中,该对象由firstElement
引用。
答案 1 :(得分:5)
这是混合变量和对象,newElement
确实是一个局部变量,它在方法结束后丢失,但引用指向一个的对象即可。如果没有引用(变量)指向它,则对象可以进行垃圾收集。在这种情况下,临时newElement
和firstElement
都指向它。方法退出时丢失了newElement
,但firstElement
仍指向它,lastElement
也是如此,因此无法进行垃圾回收。
或者换句话说:变量指的是一个对象,它不是对象本身。
我盖了一幢房子,把它的地址写在一张纸上,这样你就可以到达那里,我把那张纸扔给你,你把那张纸上的地址写到你的地址簿里,扔掉废料纸。
拆迁人员通过查看是否有人仍然持有其地址来检查是否有人仍在使用房屋。即使你扔掉了那张纸,你仍然在你的地址簿里有地址,所以房子仍在使用而且没有被拆除