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

Я всегда считал, что Java является pass-by-reference, но в эта статья меня запутала. Могли бы мне объяснить, каким именно языком программирования является Java? Заранее спасибо!

Сам в прошлом запутался в этом, но мне помогли с этим. Так вот 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 самой.

1 Вподобання

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