هنر برنامه نویسی

چرا و چطور برنامه نویس خوبی باشیم ؟!

هنر برنامه نویسی

چرا و چطور برنامه نویس خوبی باشیم ؟!

۵ مطلب با کلمه‌ی کلیدی «آموزش جاوا» ثبت شده است

اشاره گر ها و مقادیر در جاوا - بخش اول

فهیم آیت | پنجشنبه, ۲۸ ارديبهشت ۱۳۹۱، ۱۰:۱۱ ب.ظ | ۱۱ نظر

اگر پیش از این ، با زبان هایی مانند 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

 

  • فهیم آیت