Вы только манипулируя локальная переменная l
в вашем методе createMap
. Переменная map
в вашем первом методе все еще указывает на null.
Чтобы понять, как это работает, рассмотрим следующее:
В вашем методе main
, вы создаете varialbe map
, и назначение его пустым. Теперь у вас есть эта переменная в вашем стеке, но все равно никакого соответствующего объекта в куче.
Затем вы передаете эту переменную в качестве параметра в значение createMap
. Java выполняет этот вызов by value
, то есть делает копию переменной и толкает ее в стек в сочетании с вызовом метода. Теперь у вас есть две переменные в стеке и все еще нет объекта в куче.
Наконец, внутри вашего метода createMap
вы создаете новый объект Map и назначаете его l
, вашей копии первой переменной. Теперь у вас есть две переменные в стеке, и один объект в куче, один из которых указывает на объект на карте:
карта ---> нулевой л ---> Карта
Когда createMap
метод возвращает стек, и ваша переменная l
освобождается. карта по-прежнему не указывает на объект карты - он никогда не делал этого, он все равно укажет на нуль. Кроме того, поскольку объект Map теперь не имеет живых ссылок, он будет замечен следующим циклом сбора мусора.
Итак, у вас в конце есть еще одна переменная в стеке, которая еще указывает на null.
Заканчивать [этот ответ] (http://stackoverflow.com/a/12429953/2024761). – SudoRahul
tldr; переназначение переменной параметра * never * перепроверяет переменную, используемую в качестве аргумента в вызывающем. – user2864740