我怀疑的是引用变量'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
}
}
答案 0 :(得分:9)
符合垃圾回收条件的Flower
对象。
Rose对象仍被引用变量引用,f
和r
。
答案 1 :(得分:4)
您已将玫瑰分配给f
变量。这意味着花的实例现在已经准备好被破坏(被收集)。
f
包含玫瑰,因此f.smell()
会产生Rose gives rosy smell
。
答案 2 :(得分:2)
在您的代码中,f = new Flower()
的实例未被使用,最终将被删除(意味着您无法再解决它,垃圾收集很可能在将来的某个时间将其删除)。
对于以下代码,这将是相同的:
Rose one = new Rose();
Rose two = new Rose();
one = two;
one = new Rose()
变量不会被使用,最终会被删除。所以这与首先投射无关。
由于您可以将所有Rose
个对象作为Flower
个对象处理,因此您可以将Rose
个实例分配给Flower
变量。
答案 3 :(得分:1)
如果它作为一个新的Rose创建它永远是一个玫瑰,则施法不会影响底层对象。然而某些方法并不关心它是否是一朵玫瑰,只是它的某种花,它们以花为参数而玫瑰被视为任何一朵旧花(但可以被抛回到玫瑰中)。
同样在你的情况下,你有花变量f,玫瑰是一朵花,所以玫瑰可以保存在花变量中,但它仍然基本上是玫瑰。
类似地,作为新花创建的对象永远不能成为玫瑰,施放到玫瑰不会导致编译时异常,因为花可能是玫瑰但会引发运行时异常因为在这种情况下它不是。
正如其他答案正确地说你的“新花”从未被使用过并将被垃圾收集
答案 4 :(得分:1)
运行以下代码时:
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创建的花对象的引用将丢失,因此花对象将继续在堆内存中未引用,直到它被JVM收集并最终销毁。