اینکه جاوا Pass by Value هست درسته ولی کد تنها چیزی رو ثابت نمی کنه و این الگوریتم و قواعد JVM هست که کلا مانع گرفتن Reference / Offset میشه . چرا ؟ به خاطر Garbage Collection / GC.
به خاطر اینکه چون رفرنس ها توسط GC جا به جا می شوند و GC از چندین نوع هستند میشه ازGC ها Reference Counting / Mark-sweep-compact اسم ببرم که کار درست نداشتن کاربر در رفرنس گردن Mark-sweep-compact GC هست برای اینکه سه مرحله چک می کنه برای مدیریت حافظه :
Mark: چک کردن رفرنس ها و اشیای که مورد استفاده هستند یا در آینده مورد استفاده قرار می گیرند.
sweep : خارج کردن اشیای یا حافظه اشغال شده ای که رفرنسی نداره.
compact : مرتب سازی صورت می گیره که در اینجا رفرنسا جا به جا می شند
Reference Counting تعداد رفرنس های هر شی کلاس متد .... اگر صفر شد از حافظه پاک میشه با چک کردن sweep .
به این نتیجه می رسیم Pass by Reference وجود ندارد چون مخالف طبیعت رفتار GC و JVM هست.
وقتی instance , method رو به پارامتر می دید کاری به primitive ها نداریم اگر رفرنسی داده بشه اون رفرنس کپی رفرنس اصلی هست :
int[] array = { 1, 2, 3, 4, 5 };
modifyArray(array); // pass array reference
public static void modifyArray(int[] array2)
{
for (int counter = 0; counter < array2.length; counter++)
array2[counter] *= 2;
}
for (int value : array)
System.out.printf("
%d", value);
//2 4 6 8 10
//2 4 6 8 10
جواب یکی ولی الان ۲ رفرنس به یک value دسترسی داره واسه اینکه رفرنس مورد نیازه خود jvm هیچ وقت این اختار رو به شما نمیده چون مدیریت حافظش باهمین رفرنسه که یکی از بزرگترین مزیت های جاواس . GC ها چند نوع هستن فکر کنم ۶ تا باشند که هر کدوم هم به چندین قسمت تقسیم می شوند برای تسلط به آشنای با اینا نیاز داری. در مورد Heap , generational GC , Edan - young generation , perm - permanent generation , old generation مطالعه داشته باشی خوبه .