— Привет, Амиго, это снова я – Элли. Прости, что постоянно так говорю, так просто принято на Земле в 31 веке. Я хочу рассказать тебе об особенностях переменных-ссылок и передаче в функции(методы) аргументов-ссылок.
— Я готов.
— Отлично, тогда слушай. Переменные-ссылки – это переменные всех типов, кроме примитивных. Такие переменные содержат в себе только адрес объекта (ссылку на объект).
— Переменные примитивных типов хранят в себе значения, а переменные типов-классов хранят ссылку на объекты этого же класса, ну или хранят null. Я все правильно говорю?
— Абсолютно верно.
— Так что же это такое — эта ссылка?
— Объект и ссылка на него связаны, примерно, как человек и его телефонный номер. Телефонный номер не является человеком, но номер можно использовать, чтобы звонить человеку, спрашивать у него какую-то информацию, руководить им или давать команды. Ссылка тоже используется для взаимодействия с объектом. Все объекты взаимодействуют друг с другом при помощи ссылок.
— Это как если бы люди общались друг с другом по телефону?
— Именно. При присваивании примитивного объекта, его значение копируется (дублируется). При присваивании же ссылочной переменной, копируется только адрес объекта (телефонный номер), сам же объект при этом не копируется.
— Ок, понял.
— Ссылка даёт ещё одно преимущество: можно передать ссылку на объект в какой-нибудь метод, и этот метод будет в состоянии модифицировать (изменять) наш объект используя ссылку на него, вызывая его методы и обращаясь к данным внутри объекта.
Пример 1
Тут значение m и n не меняется.
|
И вот почему.
Данный код аналогичен коду слева
|
— Переменным a и b присваиваются только значения 5(m) и 6(n) соответственно, a и b ничего не знают про (никак не влияют на) m и n.
— Честно говоря, я понял, что я ничего не понял. Можно еще пару примеров?
— В случае со ссылочным типом, можно было сделать так:
Пример 2
Тут данные объектов меняются
|
И вот почему.
Данный код аналогичен коду слева
|
— Переменным a и b присваиваются ссылки на olga и vera соответственно, a и b меняют значения внутри объектов olga и vera.
— Так классы внутри других классов ещё можно объявлять? Круто!
— Но в остальном не очень-то и понятно.
— Не все сразу.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ