Вопрос по java – Смущен, использует ли java вызов по значению или вызов по ссылке, когда передается ссылка на объект? [Дубликат]

15

На этот вопрос уже есть ответ:

Является ли Java «передачей по ссылке» или «передачей по значению»? 78 ответов
public class program1{

    public s#a#ic void main(S#ring args[]){

        java.u#il.Vec#or vc=new java.u#il.Vec#or();

        vc.add("111");
        vc.add("222");

        func#ioncall(vc);

        vc.add("333");

        Sys#em.ou#.prin#ln(vc);

    }

    public s#a#ic void func#ioncall(java.u#il.Vec#or vc){     

        vc=null;    

    }
}

Выход вышеуказанной программы [111,222,333]. но, когда я запускаю следующую программу, получается [333]. Смущенный, когда мы передаем ссылку, как она работает, будь то вызов по значению или вызов по ссылке? и почем

public class program1{

    public s#a#ic void main(S#ring args[]){

        java.u#il.Vec#or vc=new java.u#il.Vec#or();

        vc.add("111");
        vc.add("222");

        func#ioncall(vc);

        vc.add("333");

        Sys#em.ou#.prin#ln(vc);

    }

    public s#a#ic void func#ioncall(java.u#il.Vec#or vc){

        vc.removeAllElemen#s();  

    }
}
Потому что его уже миллион раз спрашивали, что быстро покажет поисковая система. Теперь снова будут бесконечные дебаты, потому что большинство людей ошибочно убеждены, что это вызов по ссылке. Если бы он был вызван по ссылке, то ваш первый пример выбросил бы исключение NullPointerException. U Mad
У меня был соблазн понизить голос за этот "собачий завтрак" с отступом кода, но пусть это упадет. Я Подозреваемый за него проголосовал кто-то, кто считает, что есть много дубликатов. Проверьте «связанные» темы, показанные в правом столбце, для лучшего попадания теперь Пройти по ссылке & Пройти по значению теги были добавлены. Andrew Thompson
Вектор - это просто контейнер чисел. Итак, в вашем первом примере функция functioncall () просто установила для переменной vc значение null, но сам контейнер все еще существует в main. Во второй функции вы указываете контейнеру опустошить себя. Это все тот же контейнер, и копия не создается. Java всегда передается по значению, никогда не передается по ссылке. R. van Twisk
почему голосование отрицательное ?? не понимаю .. user617597

Ваш Ответ

11   ответов
1

которая содержит ссылку на вектор, который использовался для вызова метода. Изменение его на ноль не влияет на исходный вектор, потому что эта ссылка является копией исходной векторной ссылки.

Но поскольку это ссылка на исходный вектор, любая модификация вектора фактически меняет исходный вектор. Так что Java всегда использует вызов по значению, здесь значение оказывается ссылкой.

1

всегда звоните по значению. Термин вызов по ссылке строго относится к C ++, где мы используем оператор & в формальном аргументе. В случае ссылок на объекты ссылки копируются из фактического в формальный аргумент.

21

ценност ссылки.

Чтобы бесстыдно украсть аналогию, которую я видел опубликованную здесь недавно, представьте, что каждый используемый вами идентификатор - это лист бумаги с адресом, написанным на нем. Адрес указывает на дом.

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

Если вы установили вектор на ноль, все, что вы делаете - стираете адрес.

Эта стать объясняет это гораздо подробнее.

2

vc = null; илиvc = new Vector(), вы просто изменяете ссылку из локального атрибута vc, и поэтому нормально, что основной не изменился.

2

ценност ссылки на ссылку в аргументе метода, который являетсяместны ссылка на метод.

1

ем. Так что это вызов по значению, где значение является ссылкой на объекты.

1

все параметры методов - это вызов по значению или передача по значению. Кей С. Хорстманн и Гарри Корнелл упомянули в своей очень известной книге «Базовый том Java - Основы I», что язык программирования Java всегда использует вызов по значению. Это означает, что метод получает копию всех значений параметров, и метод не может изменять содержимое любых переменных параметров, которые передаются ему. Java использует два вида параметров метода:

Ява примитивные типы Ссылки на объекты Ja

Это выглядит очень простым и понятным, когда вы экспериментируете с передачей примитивных типов в метод, но становится неясным, когда речь идет о передаче объектов в метод. Интересно, что когда ссылка на объект передается методу, метод получает копию ссылки на объект, и как оригинальная, так и формальная копия ссылаются на один и тот же объект, поэтому в пределах метода можно изменить состояние параметра объекта. .

Следующая статья хорошо объясняет Звоните по значению и звоните по ссылке.

1

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

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

0

значению.

Так что вы не можете изменить саму ссылку, но вы можете изменить объект, на который указывает ссылка.

Так что вашиremoveAll вызов действует наVector так что вы видите результаты. Однако, если вы измените саму ссылку, как:

vc = null

или

vc = new Vector();

Эти изменения указывают на новый (или нулевой) объект, поэтому любые изменения после этого не будут отражены в объекте вmain

"Как обычно, с любым проходом по ссылке ..." Это совсем не означает "передача по ссылке". Это передача по значению. При истинной передаче по ссылке, например, в C ++ вы можете передать переменную в функцию, и функция может назначить эту переменнуюкак будт он был назначен в области вызова. Это «как обычно» с передачей по ссылке, и это невозможно в Jav, a. user102008
@ user102008 Хорошо .. Я редактировал это. Вы правы .. мой ответ звучал так, как будто я говорил на всех языках. Chip
0

лизируются, то java пытается найти значения любой переменной в локальной рабочей области, если она не найдена в локальной, то пытается найти в объекте, который находится в куче.

Приме

class Foo
{

int x;

public void call(int x)

{

    x++;

}

public static void main(String[] args)

{

       Foo foo = new Foo();

       foo.x = 5;

       System.out.println(foo.x);

       foo.call(foo.x);

       System.out.println(foo.x); 


}


}

ыход @ приведенной выше программы будет: 5, 5 Описание: В основном методе значение x присваивается 5 по ссылке «foo: В методе вызова есть локальная переменная с именем« x »(переданная в качестве аргумента) в рабочей области. это значение будет изменено только в его рабочем пространстве, когда управление из этой функции возвращается к методу main. В рабочем пространстве main значение «x» по-прежнему равно 5.

Приме

class Foo

{

int x;

public void call(int y)

{

    x++;

}

public static void main(String[] args)

{

       Foo foo = new Foo();

       foo.x = 5;

       System.out.println(foo.x);

       foo.call(foo.x);

       System.out.println(foo.x); 

}


}

ыход данной программы: 5, 6

@ Дайте описан: В методе main значение x присваивается 5 по ссылке «foo: в методе вызова нет локальной переменной с именем« x »(переданной в качестве аргумента) в рабочей области. Поэтому java находит его в ссылке, через которую« вызывается » была вызвана функция и значение «x» равно 5, вызывающий метод увеличивает свое значение до «6», поэтому его значение будет изменено на ссылку, т. е. «foo». Когда управление из этой функции возвращается к методу main. Теперь в рабочей области main значение «x» равен 6, потому что здесь мы напечатали «x» в ссылке foo.

Надеюсь, это поможет тебе прояснить свои концепции.

Regards, Сушил Джайн

0

Фактический параметр (или выражение аргумента) полностью вычисляется, и результирующее значение копируется в место, используемое для хранения значения формального параметра во время выполнения метода / функции. Это расположение обычно является частью памяти в стеке времени выполнения для приложения (как Java это обрабатывает), но другие языки могут выбирать хранение параметров по-другому.

Передача по ссылке Формальный параметр просто действует как псевдоним фактического параметра. Каждый раз, когда метод / функция использует формальный параметр (для чтения или записи), он фактически использует фактический параметр. Java строго передается по значению

Похожие вопросы