# Является ли Java pass-by-reference или pass-by-value?

**URL:** <https://forum.itvdn.com/t/yavlyaetsya-li-java-pass-by-reference-ili-pass-by-value/3161>\
**Category:** Java\
**Created:** [06.02.2019 13:46:23 UTC](https://forum.itvdn.com/t/yavlyaetsya-li-java-pass-by-reference-ili-pass-by-value/3161 "2019-02-06T13:46:23Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Vetal](https://forum.itvdn.com/letter_avatar_proxy/v4/letter/v/d9b06d/32.png) [@Vetal](https://forum.itvdn.com/u/Vetal)\
**Post date:** [06.02.2019 13:46:23 UTC](https://forum.itvdn.com/t/yavlyaetsya-li-java-pass-by-reference-ili-pass-by-value/3161/1 "2019-02-06T13:46:23Z")

</div>

Я всегда считал, что Java является pass-by-reference, но в [эта](http://www.javadude.com/articles/passbyvalue.htm) статья меня запутала. Могли бы мне объяснить, каким именно языком программирования является Java? Заранее спасибо!

---

<div class="post-metadata">

**Author:** ![Pavel92](https://forum.itvdn.com/letter_avatar_proxy/v4/letter/p/85e7bf/32.png) [@Pavel92](https://forum.itvdn.com/u/Pavel92)\
**Post date:** [08.02.2019 18:45:15 UTC](https://forum.itvdn.com/t/yavlyaetsya-li-java-pass-by-reference-ili-pass-by-value/3161/2 "2019-02-08T18:45:15Z")

</div>

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

Рассмотрим это на примерах из наведённой Вами статье:

```
public static void main(String[] args) {
    Dog aDog = new Dog("Max");
    Dog oldDog = aDog;

    // we pass the object to foo
    foo(aDog);
    // aDog variable is still pointing to the "Max" dog when foo(...) returns
    aDog.getName().equals("Max"); // true
    aDog.getName().equals("Fifi"); // false
    aDog == oldDog; // true
}

public static void foo(Dog d) {
    d.getName().equals("Max"); // true
    // change d inside of foo() to point to a new Dog instance "Fifi"
    d = new Dog("Fifi");
    d.getName().equals("Fifi"); // true
}

```

В приведенном выше примере aDog.getName() будет по-прежнему возвращать "Max". Значение aDog в main не изменяется в функции foo с помощью Dog "Fifi" как ссылка на объект передается по значению. Если бы он был передан по ссылке, то aDog.getName() в main вернул бы "Fifi" после вызова foo.

Если же мы изменим foo, то при том же вызове результат поменялся:

```
public static void main(String[] args) {
    Dog aDog = new Dog("Max");
    Dog oldDog = aDog;

    foo(aDog);
    // when foo(...) returns, the name of the dog has been changed to "Fifi"
    aDog.getName().equals("Fifi"); // true
    // but it is still the same dog:
    aDog == oldDog; // true
}

public static void foo(Dog d) {
    d.getName().equals("Max"); // true
    // this changes the name of d to be "Fifi"
    d.setName("Fifi");
}

```

В приведенном выше примере Fifi - это имя собаки после вызова foo(aDog) потому что имя объекта было установлено внутри foo(...). Любые операции, которые foo выполняет на d таковы, что для всех практических целей, они выполняются на aDog, но это не возможно, чтобы изменить значение переменной aDog самой.

---

<div class="post-metadata">

**Author:** ![Vetal](https://forum.itvdn.com/letter_avatar_proxy/v4/letter/v/d9b06d/32.png) [@Vetal](https://forum.itvdn.com/u/Vetal)\
**Post date:** [09.02.2019 12:43:00 UTC](https://forum.itvdn.com/t/yavlyaetsya-li-java-pass-by-reference-ili-pass-by-value/3161/3 "2019-02-09T12:43:00Z")

</div>

Большое спасибо за разъяснение!
