Значение целого числа до метода: -> 10 Значение целого числа в методе:> 20 Значение целого числа после метода: -> 10
Здесь нет ничего удивительного.Вы передаете значение 10 методу, оно увеличивается и отображается правильно.После возврата из вызова метода переменная i
остается неизменной.
Значение строки до метода: -> XXX значение i-> XXX Hello Значение целого числа после метода: -> XXX
Строки являются неизменяемыми классами, поэтому изменить их невозможно.Вы можете только переназначить значение, как вы это делали в своем примере.Хитрость заключается в том, чтобы понять, что вы получаете скопированное значение ссылки, ведущее к объекту XXX
.Теперь вы создаете новый объект i + "Hello"
и переопределяете предыдущую ссылку i
.Таким образом, объект XXX
не изменяется, однако в методе вы его не печатаете - вы печатаете объект, созданный в методе.
Значение StringBuffer перед методом: ->Значение ABC для i-> ABC Hello. Значение StringBuffer после метода: -> ABC
Это тот же случай, что и в приведенном выше коде, поскольку toString()
дает новый объект String
.
И наконец:
Значение сотрудника до метода: -> Имя: abhi .... Возраст: 28 Значение сотрудника в имени метода: rishu .... Возраст: 29Значение Employee после метода: -> Имя: rishu .... Возраст: 29
Это идеальная демонстрация PASS BY VALUE Вы создаете объект Employee
,но вы передаете REFERENCE этому объекту в качестве параметра метода.Теперь, запомните это на всю жизнь , эта ссылка скопирована, поэтому вы получите копию ссылки, доступную для работы внутри метода. ПОЧЕМУ JAVA ВСЕГДА ПРОХОДИТ КОПИЕЙ .Однако эта скопированная ссылка все еще указывает на тот же объект Employee
, который вы создали ранее.Таким образом, если вы будете использовать эту ссылку для изменения объекта, на который он указывает, вы измените исходный Employee
.Вот почему вы можете увидеть эффект изменения в выводе.
Bruce Eckel
имеет хороший пример ссылок и объектов в Java.Думайте об объекте как о телевизоре, а об объекте - как о пульте дистанционного управления.Если вы передадите ссылку на другой метод в качестве аргумента, у вас будет скопированный пульт дистанционного управления в этом методе.Если вы нажмете кнопку «выключить» в методе, телевизор все равно будет выключен, даже если вы не использовали оригинальный пульт;)