Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятный код 
V
    Опции темы
maddoc
Дата 7.4.2006, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 364
Регистрация: 11.5.2005

Репутация: нет
Всего: 1



кто объяснит ответ
Код

class GFC301 {
  private String name;
  public GFC301(String name) {this.name = name;}
  public void setName(String name) {this.name = name;}
  public String getName() {return name;}
  public static void m1(GFC301 r1, GFC301 r2) {
    r1.setName("Bird");
    r2 = r1;
  }
  public static void main (String[] args) {
    GFC301 pet1 = new GFC301("Dog");
    GFC301 pet2 = new GFC301("Cat");
    m1(pet1,pet2);
    System.out.println(pet1.getName() + "," + pet2.getName());
}}


ответ Bird,Cat


--------------------
"Безвыходных положений не бывает" (с) Камасутра
PM MAIL   Вверх
LSD
Дата 7.4.2006, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



В функцию передаются ссылки на объекты, причем передаются по значению. Т.е. код:
Код
r2 = r1;

локальной ссылке на r2 присваивает значение r1. Но поскольку дальше мы этими ссылками не оперируем, то этот кусок кода можно закомментарить и ничего не изменится.
Ранее мы меняем значение поля name:
Код
r1.setName("Bird");

причем меняем у исходного объекта (что видно из System.out.println()).

Вообщем, никаких аномалий в поведении объектов не замечено smile


--------------------
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.
PM MAIL WWW   Вверх
Tirael
Дата 7.4.2006, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 31.1.2006
Где: Москва

Репутация: нет
Всего: 7



И почему непонтно ?
Давай проследим цепочку действий:

Входной точкой ( началом ) программы является функция main. Ее код
Код

public static void main (String[] args) {    
    GFC301 pet1 = new GFC301("Dog");    
    GFC301 pet2 = new GFC301("Cat");    
    m1(pet1,pet2);    
    System.out.println(pet1.getName() + "," + pet2.getName());    
}


1 Создаем объект pet1
Код

GFC301 pet1 = new GFC301("Dog");

Причем как видишь в конструктор пишем "Dog". Значит после этой операции у нас будет у нас будет объект pet1, с полем name равном "Dog"

Код конструктора:
Код

public GFC301(String name) {this.name = name;}


2
Делаем тоже самое, но уже объект pet2 и конструктору передаем "Cat"

Значит у нас два разных объекта, pet1 и pet2, поле которых name соответсвенно равно "Dog" и "Cat"

3
Далее вызываем функцию m1 этого же класса
Код

m1(pet1,pet2);


Давай поподробнее рассмотрим код этой функции
Код

public static void m1(GFC301 r1, GFC301 r2) {    
    r1.setName("Bird");    
    r2 = r1;    
  }

Она берет два параметра, а именно ссылки на объект типа GFC301 ( в нашем случае это ссылки pet1 и pet2 ). Заметим так же важную вещь, то что ссылки r1 и r2 это совершенно самостоятельные ссылки. И действительны они только в пределах функции m1 .В данном случае они просто будут ссылаться на те же объекты, что и ссылки pet1 и pet2. Далее вызываем метод setName("Bird");
Код

public void setName(String name) {this.name = name;}

Значит в первом объекте поле name теперь будет не "Dog", а "Bird".
Следующая строчка - это просто подвох.
Код

r2 = r1;

Теперь r1 и r2 ссылаются на один и тот же объект. Но заметь, никаких данных внутри объекта мы не меняли. А значит по окончании работы этого метода у нас будут два объекта. у первого поле name будет равно "Bird", a у второго "Cat"

4 Возврящемся в функцию main и выполняем следующую команду :
Код

System.out.println(pet1.getName() + "," + pet2.getName());

Она выводит на экран содержимое поля name первго и второго объектов.
Восему мы получаем Bird,Cat

Это сообщение отредактировал(а) Tirael - 7.4.2006, 23:29
--------------------
 
PM MAIL   Вверх
maddoc
Дата 7.4.2006, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 364
Регистрация: 11.5.2005

Репутация: нет
Всего: 1



А разве по знчению передаются не простые типы?


--------------------
"Безвыходных положений не бывает" (с) Камасутра
PM MAIL   Вверх
LSD
Дата 7.4.2006, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(maddoc @ 8.4.2006, 00:27 Найти цитируемый пост)
А разве по знчению передаются не простые типы?

Простые типы, по значению. Но тут нет ни одного простого типа.


--------------------
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.
PM MAIL WWW   Вверх
Tirael
Дата 7.4.2006, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 31.1.2006
Где: Москва

Репутация: нет
Всего: 7



Цитата(maddoc @ 7.4.2006, 23:27 Найти цитируемый пост)
А разве по знчению передаются не простые типы?


По значению передаются только простые типы. ( int, char, double и т.д. )
В нашем случае тип GFC301 не простой. И объекты будут передаваться по ссылке и только по ссылке.

Блин, меня опять опередили. smile Надо будет делать пустой пост, а потом сидеть его редактриковать )))

Это сообщение отредактировал(а) Tirael - 7.4.2006, 23:34
--------------------
 
PM MAIL   Вверх
maddoc
Дата 7.4.2006, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 364
Регистрация: 11.5.2005

Репутация: нет
Всего: 1



Цитата

В функцию передаются ссылки на объекты, причем передаются по значению.

smile smile smile ???????
2 Tirael
Цитата

Но заметь, никаких данных внутри объекта мы не меняли.

так а зачем менять, если 2 ссылки на 1 обьект? (или я что-то не так понял)


--------------------
"Безвыходных положений не бывает" (с) Камасутра
PM MAIL   Вверх
Tirael
Дата 7.4.2006, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 31.1.2006
Где: Москва

Репутация: нет
Всего: 7



maddoc,

Цитата(maddoc @ 7.4.2006, 23:34 Найти цитируемый пост)
В функцию передаются ссылки на объекты, причем передаются по значению.

Наверное, имелось ввиду что ссылка, это тоже какой то набор битов и байтов в памяти компьютера. Просто первый набор битов копируется и получается в точности такой же набор битов, но уже в другой области памяти. Названный по другому. Хочешь назови этот набор битов "значением" ссылки.

Цитата

так а зачем менять, если 2 ссылки на 1 обьект? (или я что-то не так понял)

Так менять и не зачем. Это подвох. Ты все правильно понял.

Это сообщение отредактировал(а) Tirael - 7.4.2006, 23:48
--------------------
 
PM MAIL   Вверх
maddoc
Дата 7.4.2006, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 364
Регистрация: 11.5.2005

Репутация: нет
Всего: 1



Спасибо всем, я все понял smile
дело именно в том, что внутри метода все равно копии ссылок
а так как в r2(внутри метода) присвоили другую ссылку, от этого r2 базовый не поменяется.
кажется так?


--------------------
"Безвыходных положений не бывает" (с) Камасутра
PM MAIL   Вверх
LSD
Дата 8.4.2006, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Tirael @ 8.4.2006, 00:33 Найти цитируемый пост)
Блин, меня опять опередили.  Надо будет делать пустой пост, а потом сидеть его редактриковать )))

Не стоит, возможно твой ответ будет более развернутым или более понятным smile

Манипуляции с объектами в 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.
PM MAIL WWW   Вверх
LSD
Дата 8.4.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0608 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.