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

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

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

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

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

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

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

 

نظرات  (۴)

بسیار واضح و ساده و با مثال های عالی، أصل مطلب بیان شده است
دستتون دردنکنه 
دمت گرم داداش کولاک کردی.
 زبان ساده وقابل فهمت واقعا مشکل منو حل کرد
 سپاسگذارم
:)
عالی بود
دمتون گرم

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی