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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объясните поведение, передача аргументов по ссылке 
V
    Опции темы
lamber
Дата 12.10.2011, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Объясните не понятное поведение с Java работаю не долго и возможно это баян, но все же. В Java все аргументы передаются по ссылке тогда внимание почему такое поведение, код ниже.

Код


public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {        

        Main obj = new Main();
        obj.TestArr = new int [2][2];
        obj.FillArr(obj.TestArr);
        obj.SomeTestFunction(obj.TestArr);
        obj.PrintArr(obj.TestArr);

    }
    public void SomeTestFunction(int[][] DimArr)
    {
        DimArr = new int[5][5];
        //DimArr = null; при выходе из функции DimArr не будет null
        //DimArr[1][1]=-121; при выходе из функции изменит свое значеним
        //this.PrintArr(DimArr); при инициализации внутри функции выведет массив 5х5
    }
    public void FillArr(int[][] DimArr)
    {
        for(int i=0;i<DimArr.length;i++)
            for(int j=0;j<DimArr[i].length;j++)
            {
                DimArr[i][j]=i+j;
            }
    }
    public void PrintArr(int[][] DimArr)
    {
        for(int i=0;i<DimArr.length;i++)
            for(int j=0;j<DimArr[i].length;j++)
            {
                System.out.print(DimArr[i][j]+" ");
            }
        System.out.print("\n");
    }
    public int[][] TestArr;

}





PM MAIL   Вверх
Stolzen
Дата 12.10.2011, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(lamber @  12.10.2011,  18:05 Найти цитируемый пост)
В Java все аргументы передаются по ссылке

Вот и нет. По значению они передаются. В других языках, например, в C# для этого есть аргументы ref и out - но в джаве их нет.

Это сообщение отредактировал(а) Stolzen - 12.10.2011, 17:27


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Nofate
Дата 12.10.2011, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



@lamber: Просто объекты являются ссылками, а ссылки переданные по значению остаются ссылками на то же место. Вот и кажется, что передача идет по ссылке. 

То есть в ваших методах вы работаете скопией ссылки на объект. Когда вы делаете DimArr = null, вы просто обнуляете вашу ссылку DimArr, сам объект это разумеется никак не затрагивает. То же самое относится и к другим присвоениям параметра внутри метода.

Это сообщение отредактировал(а) Nofate - 12.10.2011, 17:36


--------------------
The future is not set, there is no fate but what we make for ourselves.
Нофейтово пространство и смежные области 
PM MAIL WWW ICQ   Вверх
lamber
Дата 12.10.2011, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



2Nofate и 2Stolzen
Как же тогда выходит что изменяя значения внутри массива эти изменения сохраняются т.е. в том случае когда я пытаюсь изменить значение элементов массива все окей, но стоит мне попробовать изменить размерность массива как выходит что тут же я работаю с копией. 
PM MAIL   Вверх
Samotnik
Дата 12.10.2011, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Цитата(lamber @  12.10.2011,  23:14 Найти цитируемый пост)
Как же тогда выходит что изменяя значения внутри массива эти изменения сохраняются т.е. в том случае когда я пытаюсь изменить значение элементов массива все окей, но стоит мне попробовать изменить размерность массива как выходит что тут же я работаю с копией.  

Очень просто. Когда ты передаёшь объектную ссылку методу сама ссылка передаётся по значению. Но, т.к. передаваемое значение ссылается на объект, копия этого значения будет ссылаться на тот же объект, что и аргумент.
PM MAIL   Вверх
Nofate
Дата 13.10.2011, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Рассмотрим пошагово

Случай 1.

Код

obj.PrintArr(obj.TestArr);   //передаем  в качестве параметра ссылку на массив TestArr
    
public void SomeTestFunction(int[][] DimArr)   //в качестве параметра функция получает копию ссылки на массив
{
  DimArr[1][1]=-121;      //поскольку DimArr указывает на тот же массив, что и TestArr, мы меняем значение в исходном массиве  
}                                    // по выходу из функции все изменения остаются в силе, т.к. мы работали с исходным массивом




Случай 2.

Код

obj.PrintArr(obj.TestArr);   //передаем  в качестве параметра ссылку на массив TestArr

public void SomeTestFunction(int[][] DimArr)  //в качестве параметра функция получает копию ссылки на массив
{
  DimArr = new int[5][5];  // мы не меняем размерность массива (опасное заблужение). 
                                        //мы выделяем память под новый массив 5х5 и сохраняем ссылку на него в переменной DimArr
                                        //DimArr больше никак не связана с исходным массивом. она просто указывает на другой объект
}                                      // по выходу из функции все изменения остаются в силе, т.к. мы вообще не трогали исходный массив.


Надеюсь, стало понятнее.


--------------------
The future is not set, there is no fate but what we make for ourselves.
Нофейтово пространство и смежные области 
PM MAIL WWW ICQ   Вверх
lamber
Дата 13.10.2011, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Господа спасибо за детальный разбор можно закрывать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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