ссылка на объект - PullRequest
       4

ссылка на объект

0 голосов
/ 07 апреля 2011
class Forest {    

    void lion(){  
        System.out.println("king of the jungle");
    }

    public static void main (String a[]){
        Forest f = new Forest();
        f.lion(); //call 1
        Forest j = f;
        j.lion(); // call 2
    }
}

В чем разница между вызовом 1 и вызовом 2?
Если объект f удален, что происходит в вызове 2?

Ответы [ 6 ]

3 голосов
/ 07 апреля 2011
  1. объект не будет удален (так как ссылки все еще активны, GarbageCollector не уничтожит его)
  2. Вызовы одинаковы (они оба вызывают один и тот же метод в одном и том же экземпляре леса
  3. Действительно, выполнение f = null; до j.lion (); не будет иметь никаких видимых последствий

Кроме того, получите инструмент, подобный Eclipse, который будет выдавать предупреждения, когда вы этого не сделаетеследуйте соглашениям об именах для Java. Лучше привыкните к этому в начале.

1 голос
/ 07 апреля 2011

Нет разницы между вызовом 1 и вызовом 2. Когда вызывается new forest(), новый объект forest выделяется в куче и инициализируется. Ссылка на этот объект хранится в объявленной вами переменной f. Когда вы инициализируете переменную j значением f, она просто сохраняет ссылку на тот же объект forest в j. Установка для f значения null не приведет к тому, что объект forest будет удален (удален). Объект forest не будет собираться мусором до тех пор, пока все ссылки на него не будут обнулены или не выйдут из области видимости, что не произошло бы здесь.

0 голосов
/ 07 апреля 2011

f вызывает собственный метод льва, где j вызывает метод льва f.

Если для f было установлено значение null, вызов 2 вызовет исключение.

0 голосов
/ 07 апреля 2011

Метод lion () вызывается для базового экземпляра объекта точно так же.Вы можете установить f = null, но ссылка j все равно останется в экземпляре.

Cheers,

0 голосов
/ 07 апреля 2011

Оба вызова вызывают lion() в базовом лесу, к которому относятся и f, и j.Если f больше не ссылается на базовый лес, но j по-прежнему работает, то j.lion() все равно будет работать, как и ожидалось.

Здесь следует иметь в виду, что f иj являются ссылками на леса - фактические леса, на которые они ссылаются, существуют где-то в памяти.В тот момент, когда больше нет никаких ссылок на фактический базовый лес, этот лес становится кандидатом на сборку мусора (обратите внимание: он может не собираться мусором сразу).Но пока сохраняется хотя бы одна ссылка на основной лес, этот лес все еще существует.Здесь из-за того, что f больше не ссылается на базовый лес, все еще остается j со ссылкой на него, поэтому базовый лес все еще существует, и вызов j.lion() будет успешным.

0 голосов
/ 07 апреля 2011
  1. Ничего.
  2. Ничего.

Думайте о ссылках как о телефонных номерах. У вас может быть несколько номеров, назначенных вашему телефону, но если вы удалите один, ваш телефон все еще существует, и они могут звонить вам на все остальные ваши номера. Если вы удалите все номера, никто не сможет вам позвонить.

(Но нет никакого крупного сборщика мусора, который появляется на следующее утро, чтобы уничтожить ваш телефон, вот где аналогия нарушается.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...