繁体   English   中英

Java中的引用变量?

[英]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对象仍由引用变量引用,即fr

在这里,您已将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM