Что именно происходит в jvm, когда я создаю объект в java?
Насколько я понимаю, если я пишу
Car a3=new Car()
Этот оператор создаст дескриптор с именем a3
в стеке jvm со всеми его свойствами в куче JVM. Если это правильно, мне интересно, как работает вызов по значению. Итак, если я создаю метод checkMethod(Car c)
и позвони, сказав checkMethod(a3);
предположим, наша машина
public class Car{
int a=0;
public int getpar(){
return a;
}
}
в checkMethod
я пытаюсь получить доступ к using a3.a = 5;
поэтому я изменил значение a3.a
он покажет мне в вызывающем классе, а также указывает на те же поля, которые jvm создал в куче.
Но, когда я делаю a3= null;
в вызывающем методе и вернитесь снова в метод, из которого я вызывал checkMethod(a3)
и попытаться увидеть этот объект это не нуль? Почему он вел себя по-другому по сравнению со свойством объекта, который является???
4 ответа
checkMethod(a3);
Передайте копию значения, которое является ссылкой на экземпляр объекта Car
Внутри метод...
a3.a = 5
Используя a3, измените экземпляр объекта Car, который обозначен a3 (который является копией оригинала a3).
a3 = null
Установить ссылку на ноль (копия)
Когда это произойдет, только копия, переданная вашему методу, будет указывать на ноль. Но оригинальный a3 все еще указывает на ваш экземпляр объекта Car.
Why it behaved differently as compared to property of object that is a?
Потому что Java (чистый) call by value
, Вы не можете манипулировать значением параметра в контексте вызываемого. Вы всегда получаете локальную копию в контексте вызова.
При вызовах методов Java передает копию ссылки.
Таким образом, при установке a3 в ноль, он только устанавливает свою копию ссылки в ноль, а другие копии, которые хранятся в другом месте, где.