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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача параметра по ссылке и по значению 
:(
    Опции темы
ChessMaster
Дата 13.8.2007, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Запутался с тем, как передать значение по сслыке, а как по значению. 
Код


public class Zoo{

private List<Monkey> monkeyCage = new ArrayList<Monkey>()
public void addMonkey(Monkey monkey) 

}



public class MAIN{


public satatic void main(){

Monkey monkey = new Monkey();

Zoo zoo = new Zoo();

Zoo.addMonkey(monkey);

Monkey.changeTemperature( int newTemprature);

}


}



Дело в том, что monkey != cageMonkey.get(0);

То есть вклетки сидит мартышка с другой температурой.
PM MAIL   Вверх
agR
Дата 13.8.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(ChessMaster @  13.8.2007,  10:13 Найти цитируемый пост)
Запутался с тем, как передать значение по сслыке, а как по значению. 

Честно говоря из примера мало что понятно. 
В Java параметры передаются по значению... для объектных переменных значениями являются ссылки. 
Попытался сделать, че-то по твоей идее, вот что получилось:
Код

package Monkey;

import java.util.ArrayList;

public class MonkeyTest {
    public static void main(String[] args) {
        Zoo zoo = new Zoo();
        Monkey monkey = new Monkey(36.6f);
        Monkey monkey2 = new Monkey(36.6f);
        zoo.addMonkey(monkey);
        monkey.changeTemp(42.2f);
        zoo.addMonkey(monkey2);
        if(monkey == zoo.getList().get(0))  {
            System.out.println("monkey = cageMonkey");
        }
        else {
            System.out.println("monkey != cageMonkey");
        }
        System.out.println("Temp monkey = "+ monkey.getTemp());
        System.out.println("Temp cageMonkey = "+ zoo.getList().get(0).getTemp());
        if(monkey == monkey2) {
            System.out.println("monkey = monkey2");
        }
        else System.out.println("monkey != monkey2");
    }
}
class Monkey {
    public Monkey(float temp) {
        this.temp = temp;
    }
    public float getTemp() {
        return temp;
    }
    public float changeTemp(float newTemp) {
        this.temp=newTemp;
        return temp;
    }
    private float temp;
}
class Zoo {
    public Zoo() {
        monkeyCage = new ArrayList<Monkey>();
    }
    public void addMonkey(Monkey monkey) {
        monkeyCage.add(monkey);
    }
    public ArrayList<Monkey> getList() {
        return monkeyCage;
    }
    private ArrayList<Monkey> monkeyCage;
    
}

П.С. А ты код прям на форуме набирал? smile
PM MAIL ICQ   Вверх
LSD
Дата 13.8.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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   Вверх
agR
Дата 13.8.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



LSD, 
Цитата(LSD @  13.8.2007,  12:34 Найти цитируемый пост)
Объекты всегда передаются по ссылке, а примитивные типы по значению. 

и
Цитата(agR @  13.8.2007,  11:35 Найти цитируемый пост)
В Java параметры передаются по значению... для объектных переменных значениями являются ссылки. 

Как по мне, то те же грабли, тока в профиль.
Читал книгу, так там акцент как раз и делался, что в java передается по значению... и утверждение  "по ссылке" - ошибочно. Кому верить? smile


PM MAIL ICQ   Вверх
LSD
Дата 13.8.2007, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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   Вверх
ChessMaster
Дата 13.8.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(LSD @  13.8.2007,  13:28 Найти цитируемый пост)
Для объектов передается копия ссылки на этот объект. И мы можем в теле метода изменить переданную копию ссылки, присвоив ей другой объект. 


LSD, а можно пример того как присаивать ссылку другому объекту, чтобы знать как передать по значению. Спасибо smile 
PM MAIL   Вверх
fixxer
Дата 13.8.2007, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 6
Всего: 27



Боюсь, LSD ввел в небольшое заблуждение. Изменение (переприсваивание) ссылки возымеет действие только в пределах метода. Ключевая фраза "передается копия ссылки на этот объект". 


--------------------
user posted image
PM MAIL ICQ   Вверх
LSD
Дата 13.8.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Код

  public static void main(String[] args)
  {
    StringBuffer string = new StringBuffer("Abc");
    System.out.println("inital = " + string);
    toLowerCase(string);
    System.out.println("after toLowerCase() = " + string);
    toUpperCase(string);
    System.out.println("after toUpperCase() = " + string);
    toCamelCase(string);
    System.out.println("after toCamelCase() = " + string);
  }

  public static void toLowerCase(StringBuffer str)
  {
    for(int i = 0; i < str.length(); i++)
      str.setCharAt(i, Character.toLowerCase(str.charAt(i)));
  }

  public static void toUpperCase(StringBuffer str)
  {
    StringBuffer newStringBuffer = str;
    for(int i = 0; i < newStringBuffer.length(); i++)
      newStringBuffer.setCharAt(i, Character.toUpperCase(newStringBuffer.charAt(i)));
  }

  public static void toCamelCase(StringBuffer str)
  {
    str = new StringBuffer("blablabla");
    for(int i = 0; i < str.length(); i++)
    {
      if(i % 3 == 0)
        str.setCharAt(i, Character.toUpperCase(str.charAt(i)));
      else
        str.setCharAt(i, Character.toLowerCase(str.charAt(i)));
    }
    System.out.println("inside toCamelCase() = " + str);
  }



--------------------
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   Вверх
fixxer
Дата 13.8.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 6
Всего: 27



Да, безусловно, только пример не отражает фразу
Цитата

И мы можем в теле метода изменить переданную копию ссылки, присвоив ей другой объект. 



--------------------
user posted image
PM MAIL ICQ   Вверх
nornad
Дата 14.8.2007, 05:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(fixxer @  13.8.2007,  22:00 Найти цитируемый пост)
только пример не отражает фразу

А как же это:

Цитата(LSD @  13.8.2007,  19:05 Найти цитируемый пост)
  public static void toCamelCase(StringBuffer str)
  {
    str = new StringBuffer("blablabla");

 smile 


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
fixxer
Дата 14.8.2007, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 6
Всего: 27



Да, сорри. Не заметил. Ну тогда будут выведены разные значения внутри и вне метода. Наверно LSD это и хотел продемонстрировать.  smile 


--------------------
user posted image
PM MAIL ICQ   Вверх
chief39
Дата 14.8.2007, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


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

Репутация: 15
Всего: 77



Цитата(agR @  13.8.2007,  12:58 Найти цитируемый пост)
Как по мне, то те же грабли, тока в профиль.

Нифига се профиль!!! smile))

Цитата(ChessMaster @  13.8.2007,  14:48 Найти цитируемый пост)
LSD, а можно пример того как присаивать ссылку другому объекту, чтобы знать как передать по значению. Спасибо 

Если надо сугубо по значению - тогда clone() объекта и передача клона в качестве параметра.



--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
LSD
Дата 15.8.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(chief39 @ 14.8.2007,  14:05)
Цитата(ChessMaster @  13.8.2007,  14:48 Найти цитируемый пост)
LSD, а можно пример того как присаивать ссылку другому объекту, чтобы знать как передать по значению. Спасибо 

Если надо сугубо по значению - тогда clone() объекта и передача клона в качестве параметра.

Ага 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   Вверх
Fedrus
Дата 24.1.2008, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как раз сегодня получил ошибку забыв про "передачу объектов по ссылке".
Я передал как new Object(myObject). В поисках более правильного решения погуглил и 
нашел интересную статью http://www.javable.com/columns/robinson/letters/01/
в ней как раз доказывается что в java 
Цитата(agR @  13.8.2007,  11:35 Найти цитируемый пост)
В Java параметры передаются по значению... для объектных переменных значениями являются ссылки. 

Потом залез на форум и нашел эту тему и окончательно запутался(LSD привык верить) и сегодня сильно не выспался чтоб полностью понять статью может посмотрите и всетаки дадите определенный ответ.

Это сообщение отредактировал(а) Fedrus - 24.1.2008, 11:16
--------------------
Если вы идете через ад, идите не останавливаясь.
PM MAIL   Вверх
LSD
Дата 24.1.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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

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

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


 




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


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

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