2013-05-21 4 views
2

Мое сомнение - это ссылочная переменная 'r', которая ссылалась на объект розы, теперь ссылается на цветочный объект.Ссылка на переменную в Java?

Что случилось с поднятым объектом сейчас? Будет ли оно уничтожено?

Я следующий код:

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

Ваш цветочный объект не будет иметь никаких ссылок на него, поэтому он будет очищен всякий раз, когда запускается сборщик мусора (вам не нужно беспокоиться о освобождении памяти). – Supericy

ответ

9

enter image description here

Flower Это объект, который имеет право на сбор мусора. Объект Rose по-прежнему ссылается как на ссылочную переменную, которая составляет f, так и r.

+0

Удивительное объяснение ... thanx a ton – Abhinav

+0

Какой тип литья это? вверх или вниз? вы можете объяснить это PLS – Abhinav

+1

Это неявное повышение. Downcasting нуждается в явном литье. – AmitG

2

В коде экземпляр f = new Flower() не используется, и в конечном итоге будет удалена (означает, что вы не можете адресовать его больше и вывоз мусора, скорее всего, удалить его когда-нибудь в будущем).

Это было бы то же самое для следующего кода:

Rose one = new Rose(); 
Rose two = new Rose(); 
one = two; 

переменная one = new Rose() обыкновение быть использована и в конечном итоге будут удалены. Так что это не имеет никакого отношения к кастингу в первую очередь.

Как вы можете адресовать все Rose Объекты как Flower Объекты, которые можно присвоить объекту Rose переменной Flower.

+1

«будет удалено» немного проблематично: нет правила, в котором говорится, что его нужно удалить. Это можно * удалить, и оно будет * вероятно * удалено в конце концов (если JVM живет достаточно долго, и соответствующий GC запускается некоторыми механизмами). * Именно * эта «нечеткость» - вот почему сильная формулировка, такая как «будет удалена», может привести к неправильному впечатлению. –

+0

@JoachimSauer Вы правы, я исправлю это. –

4

Здесь вы назначили розу переменной f. Это означает, что экземпляр цветка теперь готов к уничтожению (собранный мусор).

f содержит розы, поэтому f.smell() приведет к Rose gives rosy smell.

+0

Thanx, но я все-таки понял, что это было то, что произошло или произошло? вы можете объяснить? – Abhinav

1

Если его созданный как новая Роза, то это Роза навсегда, кастинг не влияет на базовый объект. Однако некоторым методам все равно, если его роза, просто ее цветок, они берут цветок в качестве своего аргумента, а розу рассматривают как любой старый цветок (но его можно отбросить к розе).

Так же, как и в вашем случае у вас есть переменная цвета f, роза - это цветок, поэтому роза может удерживаться в цветочной переменной, но она по-прежнему в основном является розой.

Точно так же объект, который создается как новый цветок, никогда не может быть розы, отливка в розу не приведет к исключению времени компиляции, потому что цветок может быть быть розой, но будет поднимать исключение во время выполнения, потому что в этом случае это не так.

Как и другие ответы правильно сказал ваш «новый цветок» никогда не используется и будет мусора

1

Когда следующий код запускается:

Flower f = new Flower();//Line1 
Rose r = new Rose();//Line2 
f = r; //Line3 

Это то, что происходит:

Line1 создает новый Цветочный объект в памяти кучи, а ссылка f будет в стеке.

Line2 создает новый объект Rose в памяти кучи, а ссылка r будет находиться в стеке.

Line3 Теперь назначение г = г делает е также ссылка на тот же объект Rose, созданный в line2 в результате ссылка на цветочном объект, который был создан в LINE1 будет потерян, поэтому объект цветок останется без ссылок на память кучи, пока это мусор, собранный JVM и не будет уничтожен в конечном итоге.

Смежные вопросы