Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Передача параметров из функций (http://forum.oszone.net/showthread.php?t=252244)

thebas 24-01-2013 17:21 2074102

Передача параметров из функций
 
Добрый день помогите начинающему 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 2074139

Цитата:

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

Очевидно, что утверждение " в яве все передается по ссылке" не верно.

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

Цитата:

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

thebas 25-01-2013 12:01 2074659

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

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

ferget 25-01-2013 20:08 2074968

Цитата:

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

А в чем смысл этого эксперимента?

BlackEric 27-01-2013 20:24 2076324

Ну так сделайте функцию
private static String getText(String str){
return "zzzzz";
}

thebas 28-01-2013 12:57 2076756

Для ferget:
Смысл експеримента, доказать несостоятельность вашего утверждения в прошлом посту:

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

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

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

ferget 28-01-2013 15:13 2076882

Читайте полностью

Цитата:

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

thebas 29-01-2013 12:09 2077515

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

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

BlackEric 29-01-2013 16:31 2077781

Тогда нужно возвращать список или класс


Время: 12:55.

Время: 12:55.
© OSzone.net 2001-