Показать полную графическую версию : Передача параметров из функций
Добрый день помогите начинающему 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, ведь в яве все передается по ссылке, так почему же не работает?
Результат исполнения программы вывод aaaa а очень бы хотелось zzzz, ведь в яве все передается по ссылке, так почему же не работает? »
Очевидно, что утверждение " в яве все передается по ссылке" не верно.
Пару минут в гугле
1.Java программа работает не с самими объектами, а с сылками на объекты, а с примитивавмми напрямую.
2. В метод передается КОПИЯ, — для объекта — копия ссылки, т.о. мы можем изменять состяние объекта через его методы, т.к. копия ссылки указывает на тот же объект, что и сама ссылка, но не можем изменить значение оригинальнойссылки(т.к. в методе всего лишь ее копия), т.е. "подменить объект". С примитивами же работа идет напрямую, не через ссылки, потому примитив передается по значению в классическом понимании.
Т.о. ссылка obj в методе main абсолютно не изменяется после вызова метода myMethod, т.к. в нем идет работа с локальной копией.
Проводим следственный експеримент, заменяем оператор присваения, на вызов метода:
- str="zzzz";
+ str.concat("zzzz");
результат вывода не меняется.
Проводим следственный експеримент, заменяем оператор присваения, на вызов метода:
- str="zzzz";
+ str.concat("zzzz");
результат вывода не меняется. »
А в чем смысл этого эксперимента?
BlackEric
27-01-2013, 20:24
Ну так сделайте функцию
private static String getText(String str){
return "zzzzz";
}
Для ferget:
Смысл експеримента, доказать несостоятельность вашего утверждения в прошлом посту:
> 2. В метод передается КОПИЯ, — для объекта — копия ссылки, т.о. мы можем изменять состяние объекта через его методы, т.к. копия ссылки указывает на тот же объект....
str.concat("zzzz");
мы меняем обьект через его метод, и все равно обьект не меняется.
Для BlackEric:
НЕМОГУ, потому как мне необходимо возвращать более одного значения типа стринг (5-6 примерно), просто решил не нагружать форум огромным куском реального кода, а отразить существующую проблему на более простом примере.
Читайте полностью
но не можем изменить значение оригинальнойссылки(т.к. в методе всего лишь ее копия), т.е. "подменить объект"
Для ferget:
>но не можем изменить значение оригинальнойссылки(т.к. в методе всего лишь ее копия), т.е. "подменить объект"
str.concat("zzzz");
не меняет значение оригинальной ссылки, и не подменяет обьект, а именно как написанно: "изменяет состояние объекта через его методы"
И конечно я пользовался гуглом, и находил запощеные вами тут цитаты, и собственно вопрос на форуме я задал дабы уяснить: почему поведение реальной ява машины отличается от того что написано. Скажу больше: ради проверки написал свой обьект у которого всего одно поле типа стринг, и один метод который его меняет, так вот если передавать в функцию такой обьект, то его поведение абсолютно соответствует написанному вами. А вот обьект типа String почемуто ведет себя не так, и хотелось бы узнать почему, и можно ли это както обойти эффективно а не создавая какието псевдотипы.
BlackEric
29-01-2013, 16:31
Тогда нужно возвращать список или класс
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.