Java всегда передается по значению. К сожалению, они решили назвать местоположение объекта «ссылкой». Когда мы передаем значение объекта, мы передаем ему ссылку . Это запутывает новичков.
Это выглядит следующим образом:
public static void main(String[] args) {
Dog aDog = new Dog("Max");
// 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
}
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
.
Аналогично:
public static void main(String[] args) {
Dog aDog = new Dog("Max");
foo(aDog);
// when foo(...) returns, the name of the dog has been changed to "Fifi"
aDog.getName().equals("Fifi"); // 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
(кроме случаев, когда d
изменен, чтобы указать на другой экземпляр Dog
, например d = new Dog("Boxer")
), .