Войти

Показать полную графическую версию : Передача параметров из функций


thebas
24-01-2013, 17:21
Добрый день помогите начинающему Java програмисту.


public class func {
public static void main(String[] args) {
String a="aaaa";
gettext(a);
System.out.println(a);
}
private static void gettext(String str){
str="zzzz";
}
}

Результат исполнения программы вывод aaaa а очень бы хотелось zzzz, ведь в яве все передается по ссылке, так почему же не работает?

ferget
24-01-2013, 18:07
Результат исполнения программы вывод aaaa а очень бы хотелось zzzz, ведь в яве все передается по ссылке, так почему же не работает? »
Очевидно, что утверждение " в яве все передается по ссылке" не верно.

Пару минут в гугле

1.Java программа работает не с самими объектами, а с сылками на объекты, а с примитивавмми напрямую.
2. В метод передается КОПИЯ, — для объекта — копия ссылки, т.о. мы можем изменять состяние объекта через его методы, т.к. копия ссылки указывает на тот же объект, что и сама ссылка, но не можем изменить значение оригинальнойссылки(т.к. в методе всего лишь ее копия), т.е. "подменить объект". С примитивами же работа идет напрямую, не через ссылки, потому примитив передается по значению в классическом понимании.
Т.о. ссылка obj в методе main абсолютно не изменяется после вызова метода myMethod, т.к. в нем идет работа с локальной копией.

thebas
25-01-2013, 12:01
Проводим следственный експеримент, заменяем оператор присваения, на вызов метода:
- str="zzzz";
+ str.concat("zzzz");

результат вывода не меняется.

ferget
25-01-2013, 20:08
Проводим следственный експеримент, заменяем оператор присваения, на вызов метода:
- str="zzzz";
+ str.concat("zzzz");
результат вывода не меняется. »
А в чем смысл этого эксперимента?

BlackEric
27-01-2013, 20:24
Ну так сделайте функцию
private static String getText(String str){
return "zzzzz";
}

thebas
28-01-2013, 12:57
Для ferget:
Смысл експеримента, доказать несостоятельность вашего утверждения в прошлом посту:

> 2. В метод передается КОПИЯ, — для объекта — копия ссылки, т.о. мы можем изменять состяние объекта через его методы, т.к. копия ссылки указывает на тот же объект....

str.concat("zzzz");
мы меняем обьект через его метод, и все равно обьект не меняется.

Для BlackEric:
НЕМОГУ, потому как мне необходимо возвращать более одного значения типа стринг (5-6 примерно), просто решил не нагружать форум огромным куском реального кода, а отразить существующую проблему на более простом примере.

ferget
28-01-2013, 15:13
Читайте полностью

но не можем изменить значение оригинальнойссылки(т.к. в методе всего лишь ее копия), т.е. "подменить объект"

thebas
29-01-2013, 12:09
Для ferget:
>но не можем изменить значение оригинальнойссылки(т.к. в методе всего лишь ее копия), т.е. "подменить объект"
str.concat("zzzz");
не меняет значение оригинальной ссылки, и не подменяет обьект, а именно как написанно: "изменяет состояние объекта через его методы"

И конечно я пользовался гуглом, и находил запощеные вами тут цитаты, и собственно вопрос на форуме я задал дабы уяснить: почему поведение реальной ява машины отличается от того что написано. Скажу больше: ради проверки написал свой обьект у которого всего одно поле типа стринг, и один метод который его меняет, так вот если передавать в функцию такой обьект, то его поведение абсолютно соответствует написанному вами. А вот обьект типа String почемуто ведет себя не так, и хотелось бы узнать почему, и можно ли это както обойти эффективно а не создавая какието псевдотипы.

BlackEric
29-01-2013, 16:31
Тогда нужно возвращать список или класс




© OSzone.net 2001-2012