[英]Reference Variable in Java?
我怀疑的是引用变量'r',引用玫瑰对象现在引用花对象。
现在玫瑰对象发生了什么? 会被摧毁吗?
我有以下代码:
class Flower
{
public void smell() // I
{
System.out.println("All flowers give smell, if you can smell");
}
}
public class Rose extends Flower
{
public void smell() // II
{
System.out.println("Rose gives rosy smell");
}
public static void main(String args[])
{
Flower f = new Flower();
Rose r = new Rose();
f = r; // subclass to super class, it is valid
f.smell(); // II
}
}
它是Flower
对象,有资格进行垃圾回收。 Rose对象仍由引用变量引用,即f
和r
。
在这里,您已将rose指定给f
变量。 这意味着花的实例现在已经准备好被销毁(被收集)。
f
包含玫瑰,所以f.smell()
会导致Rose gives rosy smell
。
在你的代码中, f = new Flower()
的实例没有被使用,并且最终将被删除(意味着你不能再解决它了,垃圾收集很可能在将来的某个时候删除它)。
对于以下代码,这将是相同的:
Rose one = new Rose();
Rose two = new Rose();
one = two;
one = new Rose()
变量不会被使用,最终会被删除。 所以这与首先铸造无关。
由于可以将所有Rose
对象作为Flower
对象处理,因此可以将Rose
实例分配给Flower
Variable。
如果它作为一个新的Rose创建它永远是一个玫瑰,则施法不会影响底层对象。 然而某些方法并不关心它是否是一朵玫瑰,只是它的某种花,它们以花为参数而玫瑰被视为任何一朵旧花(但可以被抛回到玫瑰中)。
同样在你的情况下,你有花变量f,玫瑰是花,所以玫瑰可以在花变量中保持,但它仍然基本上是玫瑰。
类似地,作为新花创建的对象永远不能成为玫瑰,施放到玫瑰不会导致编译时异常,因为花可能是玫瑰但会引发运行时异常,因为在这种情况下它不是。
正如其他答案正确地说你的“新花”从未被使用过并将被垃圾收集
运行以下代码时:
Flower f = new Flower();//Line1
Rose r = new Rose();//Line2
f = r; //Line3
这是发生的事情:
Line1在堆内存上创建一个新的Flower对象,引用f将在堆栈上。
Line2在堆内存上创建一个新的Rose对象,引用r将在堆栈上。
Line3现在赋值f = r使得f也引用了在line2中创建的同一个Rose对象,因此对line1创建的flower对象的引用将会丢失,因此flower对象将在堆内存中保持未引用状态,直到它为止JVM收集的垃圾最终被破坏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.