public class ObjectTest {
public static void byValue(Test t) {
Test anotherT = new Test();
anotherT.i = 2;
t = anotherT;
System.out.println("anotherT.i in byValue = " + anotherT.i);
System.out.println("t.i in byValue = " + t.i);
}
public static void main(String[] args) {
Test t = new Test();
t.i = 1;
System.out.println("t.i in main = " + t.i);
byValue(t);
System.out.println("t.i in main = " + t.i);
}
}
class Test {
public int i;
}
Ну и где здесь по ссылке?
Другое дело, конечно если внутри метода byValue мы напишем t.i = 5;
Здравствуйте, Аноним, Вы писали:
А>примытивам копируются значения А>объекты передаются по ссылке
передается "примитивный" указатель на объект by-value.
Семантически — по ссылке, фактически — по значению.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, dev_m, Вы писали:
_>>Как в java сделать так, чтобы измененный в функции параметр, вернулся в основную программу. _>>В сях: _>>
_>>void set(int&n);
_>>
_>> , а как в jave?
А>Издеваешься? В жаве ВСЯ работа с объектами по ссыкам.
издеваешься ? где ты увидел передачу объекта?
Re[9]: передача параметра "по ссылке"
От:
Аноним
Дата:
21.12.06 09:01
Оценка:
Здравствуйте, aka50, Вы писали:
A>передается "примитивный" указатель на объект by-value. A>Семантически — по ссылке, фактически — по значению.
Примитивный указатель — эт что-то новенькое) А как он выглядит?
Только не увлекайся с описаниями, что бы мне потом ночью кошмары не снились)
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, aka50, Вы писали:
A>>передается "примитивный" указатель на объект by-value. A>>Семантически — по ссылке, фактически — по значению.
А>Примитивный указатель — эт что-то новенькое) А как он выглядит? А>Только не увлекайся с описаниями, что бы мне потом ночью кошмары не снились)
MyObject obj = new MyObject();
obj = new MyObject();
Здравствуйте, dev_m, Вы писали:
_>Как в java сделать так, чтобы измененный в функции параметр, вернулся в основную программу.
можно передать объект, содержащий примитив, например int[]{1}
но делать так без крайних случаев не рекомендуется
существует даже практика делать ссылки на передаваемые объекты неизменяемыми с помощью final
public String convert(final String source)
{
String dest = new String(source);
...
return dest;
}
Hi, Аноним!
А> Примитивный указатель — эт что-то новенькое) А как он выглядит? А> Только не увлекайся с описаниями, что бы мне потом ночью кошмары не А> снились)
Брюс Эккель: философия JAVA
Приложение А Передача и возврат объектов.
Передача параметров "по значению"
Тут необходимо внести ясность в понимание термина "передача параметров по
значению" и то как он реализуется в программе. Суть метода заключается в
использовании локальных копий параметров, передаваемых вашему методу. Камнем
преткновения является различное отношение к передаваемым параметрам.
Существуют два наиболее распространенных взгляда на параметры:
В Java все параметры передаются по значению. Передавая методу примитивы,
вы получаете локальную копию примитивов, передавая методу ссылку, вы
получаете локальную копию ссылки. Итак, все передается по значениям.
Разумеется, при таком подходе требуется постоянно помнить о том, что вы
работаете лишь с ссылками. Однако Java разработан таким образом, что (в
большинстве случаев) позволяет вам забыть о том что вы работаете лишь с
ссылками и думать о ссылках как об "объектах", но лишь до тех пор, пока вы
не попытаетесь вызвать какой-нибудь метод.
Примитивы в Java передаются по значению, а объекты передаются как
ссылки. Это общепринятый взгляд на ссылки. При таком подходе вам не надо
думать о параметрах как о ссылках. В таком случае вы можете утверждать: "Я
передаю объект". Поскольку при передаче объекта в метод вы не создаете его
локальную копию, нельзя сказать что объекты передаются по значению. Возможно
в будущем компания Sun предложит какое-нибудь решение этой проблемы. В Java
зарезервировано, но пока не использовано ключевое слово byvalue (по
значению), но на сегодняшний день нет никакой официальной информации о том,
будет ли вообще когда-нибудь использовано это ключевое слово.
Итак, рассмотрев обе точки зрения, я скажу так: "Все это зависит лишь от
вашего представления о ссылках." Теперь вернемся к нашей проблеме. В конце
концов, это не так важно, гораздо важнее понимание того, что передача ссылок
в качестве параметров может привести к неожиданным изменениям внешних
объектов.
Здравствуйте, fellow.sufferer, Вы писали:
FS>Здравствуйте, Тычеблин, Вы писали:
Т>>издеваешься ? где ты увидел передачу объекта?
FS>А что еще, извините, можна "по ссылке" передавать?
Можно саму ссылку по значению передать Значение ссылки не можем изменить в методе, так чтобы снаружи оно поменялось, там где ее передали.
Здравствуйте, dev_m, Вы писали:
_>Как в java сделать так, чтобы измененный в функции параметр, вернулся в основную программу. _>В сях: _>
_>void set(int&n);
_>
_> , а как в jave?
это к стати то — чего ужас как нехватает в JAVA...
это первое — что нужно было добавить в язык.
проверенно на практике!
при переписывание кода с JAVA на C# происходит его ощутимое очищение и он становится понятнее.
+ очевидно повышается производительность.
Re[5]: передача параметра "по ссылке"
От:
Аноним
Дата:
21.12.06 09:25
Оценка:
Здравствуйте, Trean, Вы писали:
T>Можно саму ссылку по значению передать Значение ссылки не можем изменить в методе, так чтобы снаружи оно поменялось, там где ее передали.
Ну так и надо было спрашивать — "передача ссылки по ссылке".
Здравствуйте, Michael Ponomarev, Вы писали:
MP>В конце концов, это не так важно, гораздо важнее понимание того, что передача ссылок MP>в качестве параметров может привести к неожиданным изменениям внешних MP>объектов.
Здравствуйте, fellow.sufferer, Вы писали:
FS>Здравствуйте, aka50, Вы писали:
A>>
A>> MyObject obj = new MyObject();
A>> obj = new MyObject();
A>>
A>>Что есть obj?
FS>Какой ужас!
Как раз твои коменты — это ужас... Ты что-то кроме java и
дельфи в своей жизни видел?
В терминах С++: FS>1. MyObject obj — создал ссылку на MyObject
Кто на ком стоял? Создан указатель, который равен null, т.е. он указывает в никуда... FS>2. new MyObject(); — создал объект MyObject
угу, и присвоил указателю адрес объекта myobject. FS>3. obj = new MyObject(); — создал объект и установил ссылку.
изменил значение указателя
Ссылка — это указатель контролируемый gc. Ничего волшебного
в слове "ссылка" нет. То, что мы в java не можем так просто
получить реальный адрес — это условности jvm (в частности
из-за возможности изменения адреса при дефрагментации gc),
например в .Net слышал есть понятние fixed, что дает
возможность работать с адресом в памяти.
А>Обворачивай в объект и вперёд. Или ретурнь результат. Это уж от как красифше по задаче будет )
Return не покатит, так как возвращаемый параметр не один, ну разве хоть массив несвязаных параметров возвращай.
Как его в объект обернуть, так чтобы помогло я не понял. У меня пример с Integer тоже не работает.
Насчет обсуждений о правильности с точки зрения ООП, обсуждаемой ниже.
Я тут привел код, который написал прямо в ответнике, чтобы иллюстрировать свою проблему — не знание, как получить объект/обычную переменную из функции(чем я раньше регулярно пользовался в с++), кроме как через return. Насчет того, что n должно быть полем класса — ну, в данный момент я хочу изменять и получать состояния вообще другого класса...
Да, горячая получилось темка, совсем не ожидал....
Я так понимаю я не понял самой сути проблемы. Читая посты у меня сложилось впечатление что мое желание вообще с точки зрения java неправильно. Если так, то не могли бы вы мне объяснить почему...
Здравствуйте, fellow.sufferer, Вы писали:
FS>То есть ты щас повторил, то что я написал от своего имени и этим типа избежал ответа на вопрос) FS>Хорошая попытка)
чтоб было понятнее... основная твоя ошибка здесь: FS>3. obj = new MyObject(); — создал объект и установил ссылку.
изменил значение указателя
Правильное слово будет "изменил", и тогда становится понятно что
есть "примитивный" указатель... он в кавычках, т.к. что int, что
ссылка передаются по значению...
Здравствуйте, aka50, Вы писали:
A>Правильное слово будет "изменил", и тогда становится понятно что A>есть "примитивный" указатель... он в кавычках, т.к. что int, что A>ссылка передаются по значению...
Ну так чем же "примитивный" указатель отличается от указателя?
Здравствуйте, fellow.sufferer, Вы писали:
FS>То есть ты щас повторил, то что я написал от своего имени и этим типа избежал ответа на вопрос) FS>Хорошая попытка)
К стати, поясни еще такой код, что с чем сравниваем?
Только пожалуйста без сферических "ссылок", а что конкретно
происходит...
Integer obj = new Integer(1);
Integer obj2 = new Integer(1);
if (obj == obj2) {
}