Не знаете, использует ли Java вызов по значению или вызов по ссылке при передаче ссылки на объект?

public class program1{

    public static void main(String args[]){

        java.util.Vector vc=new java.util.Vector();

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

        functioncall(vc);

        vc.add("333");

        System.out.println(vc);

    }

    public static void functioncall(java.util.Vector vc){     

        vc=null;    

    }
}

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

public class program1{

    public static void main(String args[]){

        java.util.Vector vc=new java.util.Vector();

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

        functioncall(vc);

        vc.add("333");

        System.out.println(vc);

    }

    public static void functioncall(java.util.Vector vc){

        vc.removeAllElements();  

    }
}

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


Ответы (11)


Он передает значение ссылки.

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

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

Если вы установите для вектора значение null, все, что вы делаете, это стираете адрес.

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

person Tharwen    schedule 25.05.2012

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

person Michael Laffargue    schedule 25.05.2012

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

person Pshemo    schedule 25.05.2012

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

  • Примитивные типы Java
  • Ссылки на объекты Java

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

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

person Krishan    schedule 19.01.2013

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

person RokL    schedule 25.05.2012

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

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

person Ashwinee K Jha    schedule 25.05.2012

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

person arnabkaycee    schedule 07.04.2013

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

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

person Community    schedule 07.01.2014

В Java «передача по ссылке» сама ссылка передается по значению.

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

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

vc = null

or,

vc = new Vector();

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

person Chip    schedule 25.05.2012
comment
Как обычно с любой передачей по ссылке ... Это совсем не то, что означает передача по ссылке. Это передача по значению. При истинной передаче по ссылке, например в C ++ вы можете передать переменную в функцию, и функция может присвоить этой переменной , как если бы она была назначена в вызывающей области. Это обычно с передачей по ссылке и невозможно в Java. - person user102008; 25.05.2012
comment
@ user102008 Ок .. Отредактировал. Вы правы ... мой ответ звучал так, как будто я говорил обо всех языках. - person Chip; 25.05.2012

Java работает с «концепцией вызова по значению». Если его стек и куча визуализируются, тогда 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» (переданная как аргумент). Так что это значение будет изменено в его рабочей области только когда управление из этой функции вернется к основному методу. В основной рабочей области значение «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

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

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

С уважением, Сушил Джайн

person Sushil Jain    schedule 23.12.2012

Передача по стоимости

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

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

person user2233159    schedule 01.04.2013