Java中的引用变量?

时间:2013-05-21 10:59:38

标签: 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

 }
}

5 个答案:

答案 0 :(得分:9)

enter image description here

符合垃圾回收条件的Flower对象。 Rose对象仍被引用变量引用,fr

答案 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收集并最终销毁。