اشاره گر ها و مقادیر در جاوا - بخش اول
اگر پیش از این ، با زبان هایی مانند c سروکار داشتید ، می دونید که توی c یک مفهوم نسبتا گیج کننده داریم به نام اشاره گر (pointer) . خوشبختانه توی جاوا از کار کردن مستقیم با اشاره گر ها خبری نیست.
اما چون اساسا دسترسی به اشیا مدل call by reference هست ، باید این مفهوم رو بدونید.
مثال ساده زیر رو در نظر بگیرید :
int a ; int b; a = 12 ; b = a ; b = 25 ;
بعد از اجرای این دستورات ساده ، a , b هر کدوم چه مقادیری خواهند داشت ؟
ساده است . a برابر خواهد بود با 12 و b با 25
اگر جواب درست داده باشید ، یعنی می دونید که در خط چهارم ، عبارت b = a به این معنی نیست که a و b یک چیز هستند ، بلکه صرفا به این معنی است که محاسبه می کنه مقدار سمت راست چند است ( که در این حالت 12 است ) بعد این مقدار رو به b نسبت میده ، کاملا مستقل از اینکه این مقدار از کجا اومده.
در نتیجه a و b کاملا مستقل هستند.
اما در دنیای اشیا ، قضیه کاملا فرق می کنه. فرض کنید کلاسی به نام Person داریم که فیلدی به نام age داره. کد زیر رو در نظر بگیرید :
Person p1 ; Person p2 ; p1 = new Person() ; p1.age= 20 ; p2 = p1 ; p2.age= 12 ;
بعد از اجرای این کد ، سن p1 چقدر خواهد بود ؟ 20 ؟
نه !! بعد از اجرای این کد ، سن p1 و p2 و 12 خواهد بود !!
عملگر = ، بر خلاف اون اتفاقی که برای اعداد ( و بقیه انواع اولیه ، مانند char و boolean) می افته ، یک کپی از مقدار سمت راست تولید نمی کنه.
علت این امر اینه که متغیر هایی که از جنس یک کلاس تعریف می شوند و یک شی به اونها نسبت داده میشه ، ذاتا با متغیر های ساده ای که اعداد رو نگهداری می کنند ، فرق دارن.
زمانی که یک متغیر ساده (عددی) رو تعریف می کنید ، یک قسمت از RAM یا حافظه ، به اون متغیر اختصاص پیدا می کنه. این متغیر مستقیما به اون بخش از حافظه مرتبط شده. هر عددی که توی اون بخش از حافظه بنویسید ، مقدار متغیر همون خواهد بود.
اما در مورد اشیا قضیه فرق می کنه.
زمانی که یک شی رو new می کنید ، یک بخش از حافظه رو به اون شی نسبت دادید، زمانی که متغیری از جنس کلاس رو تعریف می کنید ، (مانند Person p1) یک بخش دیگه از حافظه رو به p1 اختصاص دادید.
در واقع وقتی که این دستور رو اجرا می کنید :
p1 = new Person();
اول شی ساخته می شه و در حافظه قرار می گیره ، بعد آدرس اون نقطه از حافظه توی p1 قرار می گیره.
وقتی می گید p2 = p1 ، اتفاقی که می افته اینه که آدرسی که درون p1 قرار داره ، درون p2 هم ریخته می شه. این به این معنیه که اگه اون شیئی رو که p1 بهش اشاره داره تغییر بدید ، متوجه می شید که p2 هم تغییر کرده ، چون p2 هم به همون شی اشاره داره.
مثالی که از این قضیه توی دنیای واقعی می شه زد ، اینه :
کارت دانشجویی شما به شما اشاره داره ، شناسنامه شما هم همینطور. اگر نام شما عوض بشه ، شناسنامه و کارت دانشجویی شما هم باید عوض بشه.
مثال بهتری که میشه زد ، shortcut ها در windows هستند.
شما از یک برنامه می تونید هزاران shortcut بسازید که همه اونها دقیقا به یک برنامه اشاره دارند.
اگر اون برنامه رو پاک کنید ، تمام shortcut ها از بین می رند. نکته جالب اینجاست که این برنامه است که حافظه شما رو اشغال می کنه ، نه shortcutها ، اگر میلیون ها shortcut هم بسازید ، تغییر آنچنانی توی حافظه شما اتفاق نمی افته.
برای خاتمه ، این مثال رو هم در نظر بگیرید . Person p1 ; Person p2 ; p1 = new Person() ; p2 = p1 ; p2.age = 12 ; p2 = new Person() ; p2.age = 14 ;
بعد از اتمام این قطعه کد ، p1.age و p2.age چه مقادیری خواهند داشت ؟
12 و 14