![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| maddoc |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 364 Регистрация: 11.5.2005 Репутация: нет Всего: 1 |
кто объяснит ответ
ответ Bird,Cat -------------------- "Безвыходных положений не бывает" (с) Камасутра |
|||
|
||||
| LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
В функцию передаются ссылки на объекты, причем передаются по значению. Т.е. код:
локальной ссылке на r2 присваивает значение r1. Но поскольку дальше мы этими ссылками не оперируем, то этот кусок кода можно закомментарить и ничего не изменится. Ранее мы меняем значение поля name:
причем меняем у исходного объекта (что видно из System.out.println()). Вообщем, никаких аномалий в поведении объектов не замечено -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
| Tirael |
|
||||||||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 31.1.2006 Где: Москва Репутация: нет Всего: 7 |
И почему непонтно ?
Давай проследим цепочку действий: Входной точкой ( началом ) программы является функция main. Ее код
1 Создаем объект pet1
Причем как видишь в конструктор пишем "Dog". Значит после этой операции у нас будет у нас будет объект pet1, с полем name равном "Dog" Код конструктора:
2 Делаем тоже самое, но уже объект pet2 и конструктору передаем "Cat" Значит у нас два разных объекта, pet1 и pet2, поле которых name соответсвенно равно "Dog" и "Cat" 3 Далее вызываем функцию m1 этого же класса
Давай поподробнее рассмотрим код этой функции
Она берет два параметра, а именно ссылки на объект типа GFC301 ( в нашем случае это ссылки pet1 и pet2 ). Заметим так же важную вещь, то что ссылки r1 и r2 это совершенно самостоятельные ссылки. И действительны они только в пределах функции m1 .В данном случае они просто будут ссылаться на те же объекты, что и ссылки pet1 и pet2. Далее вызываем метод setName("Bird");
Значит в первом объекте поле name теперь будет не "Dog", а "Bird". Следующая строчка - это просто подвох.
Теперь r1 и r2 ссылаются на один и тот же объект. Но заметь, никаких данных внутри объекта мы не меняли. А значит по окончании работы этого метода у нас будут два объекта. у первого поле name будет равно "Bird", a у второго "Cat" 4 Возврящемся в функцию main и выполняем следующую команду :
Она выводит на экран содержимое поля name первго и второго объектов. Восему мы получаем Bird,Cat Это сообщение отредактировал(а) Tirael - 7.4.2006, 23:29 --------------------
|
||||||||||||||||
|
|||||||||||||||||
| maddoc |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 364 Регистрация: 11.5.2005 Репутация: нет Всего: 1 |
А разве по знчению передаются не простые типы?
-------------------- "Безвыходных положений не бывает" (с) Камасутра |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Простые типы, по значению. Но тут нет ни одного простого типа. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Tirael |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 31.1.2006 Где: Москва Репутация: нет Всего: 7 |
По значению передаются только простые типы. ( int, char, double и т.д. ) В нашем случае тип GFC301 не простой. И объекты будут передаваться по ссылке и только по ссылке. Блин, меня опять опередили. Это сообщение отредактировал(а) Tirael - 7.4.2006, 23:34 --------------------
|
|||
|
||||
| maddoc |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 364 Регистрация: 11.5.2005 Репутация: нет Всего: 1 |
2 Tirael
так а зачем менять, если 2 ссылки на 1 обьект? (или я что-то не так понял) -------------------- "Безвыходных положений не бывает" (с) Камасутра |
||||
|
|||||
| Tirael |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 31.1.2006 Где: Москва Репутация: нет Всего: 7 |
maddoc,
Наверное, имелось ввиду что ссылка, это тоже какой то набор битов и байтов в памяти компьютера. Просто первый набор битов копируется и получается в точности такой же набор битов, но уже в другой области памяти. Названный по другому. Хочешь назови этот набор битов "значением" ссылки.
Так менять и не зачем. Это подвох. Ты все правильно понял. Это сообщение отредактировал(а) Tirael - 7.4.2006, 23:48 --------------------
|
||||
|
|||||
| maddoc |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 364 Регистрация: 11.5.2005 Репутация: нет Всего: 1 |
Спасибо всем, я все понял
дело именно в том, что внутри метода все равно копии ссылок а так как в r2(внутри метода) присвоили другую ссылку, от этого r2 базовый не поменяется. кажется так? -------------------- "Безвыходных положений не бывает" (с) Камасутра |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Не стоит, возможно твой ответ будет более развернутым или более понятным Манипуляции с объектами в Java осуществляются только по ссылкам, а объекты создаются только в куче. Например на 32-х битных процессорах ссылка, это 32-х битное безнаковое целое, которое адресует некий адрес в памяти. Когда мы вызываем метод и передаем ему некоторые переменные, то в стек помещяются копии этих ссылок (потом по ним можно получить объекты, на которые они ссылаются). Если метод присваивает ссылкам новые значения, то он меняет локальные копии из стека, на исходные значения ссылок он повлиять он не может. Но метод может по ссылке получить объект и изменить его состояние. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Я вынес оффтопик в эту тему.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |