#java #core
#java #Ядро
Вопрос:
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?
Комментарии:
1. как удалено? Если вы просто создадите f = null после ввода j = f, ничего не произойдет.
2. Старайтесь следовать соглашениям об именовании Java ( oracle.com/technetwork/java/codeconv-138413.html )
3. @Roflcoptr : хорошо .. спасибо, что дали справочную ссылку..
Ответ №1:
- объект не будет удален (поскольку ссылки все еще активны, GarbageCollector не уничтожит его)
- Вызовы одинаковы (оба они вызывают один и тот же метод в одном экземпляре forest
- Действительно, выполнение f= null; перед j.lion(); не будет иметь никаких видимых последствий
Кроме того, получите инструмент, подобный Eclipse, который будет выдавать предупреждения, когда вы не соблюдаете соглашения об именовании для Java. Лучше привыкнуть к этому с самого начала.
Комментарии:
1. Я предполагаю, что «обучающая» среда IDE может быть более полезной для понимания концепций объектов, экземпляров и классов. Eclipse — это слишком большой скачок для этого, imo. Я бы рекомендовал вместо этого попробовать BlueJ. О соглашениях по именованию позаботьтесь позже.
2. общедоступная статическая пустота main (строка a[]){ Forest f = new Forest(); f.lion(); //вызов 1 Forest j = f; j.lion(); // вызов 2 }
3. @Grundlefleck Я могу согласиться, что Eclipse — не очень хорошее начало. Я думаю, сначала вам следует попробовать писать простые программы без какой-либо IDE. Но я не думаю, что беспокойство по поводу соглашений об именовании можно отложить. Это проблема импорта, и если вы неправильно ее изучите, то позже будет трудно исправить ее. Множество проблем при работе в команде возникает из-за людей, которые не следуют соглашениям об именовании.
Ответ №2:
Нет разницы между вызовом 1 и вызовом 2. При new forest()
вызове новый forest
объект выделяется в куче и инициализируется. Ссылка на этот объект хранится в объявленной вами переменной f
. Когда вы инициализируете переменную j
значением f
, она просто сохраняет ссылку на тот же forest
объект в j
. Установка f
значения null не приведет к тому, что forest
объект будет собран как мусор (удален). forest
Объект не будет собираться мусором до тех пор, пока все ссылки на него не будут обнулены или не выйдут за пределы области видимости, чего здесь не произошло бы.
Ответ №3:
- Ничего.
- Ничего.
Подумайте о ссылках, подобных телефонным номерам. Вашему телефону может быть присвоено несколько номеров, но если вы удалите один, ваш телефон все еще будет существовать, и они смогут звонить вам по всем другим вашим номерам. Если вы удалите все номера, никто не сможет вам позвонить.
(Но нет никакого здоровенного сборщика мусора, который появляется на следующее утро, чтобы уничтожить ваш телефон, вот где аналогия разрушается.)
Ответ №4:
Оба вызова вызываются lion()
в базовом лесу, на который ссылаются оба f
и j
. Если f
сделано так, чтобы больше не ссылаться на базовый лес, но j
все еще ссылается, то j.lion()
все равно будет работать так, как ожидалось.
Здесь следует иметь в виду, что f
и j
являются ссылками на леса — фактические леса, на которые они ссылаются, существуют где-то в памяти. В тот момент, когда больше нет ссылок на фактический базовый лес, этот лес становится кандидатом на сборку мусора (примечание: мусор может быть собран не сразу). Но пока остается хотя бы одна ссылка на базовый лес, этот лес все еще существует. Здесь, заставляя f
больше не ссылаться на базовый лес, все равно остается j
ссылка на него, поэтому базовый лес все еще существует, и вызов j.lion()
завершится успешно.
Ответ №5:
метод lion() точно так же вызывается для базового экземпляра объекта. Вы можете установить f= null, но ссылка j все равно останется в экземпляре.
Приветствия,
Ответ №6:
f вызывает свой собственный метод lion, где as j вызывает метод lion f.
Если бы f было установлено в значение null, то вызов 2 вызвал бы исключение.