موضوع: برنامه نویسی تاریخ انتشار: 1 سال قبل

تعریف متد و پراپرتی :

فرض کنید کلاسی به نام پوریا دارم ، خصوصیات یا پراپرتی های پوریا چه چیز هایی می تواند باشد ؟؟

رنگ مو ، رنگ چشم ، قد و….

رفتارها یا متدهای پوریا چیست ؟؟؟

خوردن ، خوابیدن ، ورزش کردن ، سیگار کشیدن و….

حال بیایید با هم این پراپرتی ها و متد ها را بنویسیم :

خوب در مثال بالا می بینید که من دو پراپرتی دارم به نام های hairColor و age ،

hariColor پابلیک است ، یعنی همه به آن دست رسی دارند ، استاتیک است ، این متغییر یک بار در قسمت stack رم قرار می گیرید ،و از نوع رشته است .

age پابلیک است ، استاتیک است و از نوع  عدد صحیح می باشد.

من چهار متد دارم ، khordan  , khabidan, showHairColor,showAge

khordan  پابلیک است ، یعنی همه به آن دست رسی دارند ، استاتیک است ، یعنی در قسمت stack رم قرار می گیرد و void است ، یعنی این متد چیزی به ما پس نمی دهد . این متد فقط چاپ می کند golabi khordam

متد khabidan مشابه khordan است ، اما متد showHairColor می خواهیم رنگ موی pouria را چاپ کنید برای این کار می نویسیم Pouria.hairColor

اما چگونه به پراپرتی ها مقدار بدیم ؟ و چطور متد ها را صدا بزنیم ؟؟؟ به این شکل :

کافیست درمتد main این کدها را بنویسم :

خوب اگر بخواهیم متد ما مقداری برگرداند چطور باید آن را بنویسیم ؟؟؟

در کد بالا متدی به نام sum  را می بینید ، ایم متد دو مقدار از نوع int عدد صحیح در یافت می کند در x و y قرار می دهد ، سپس آنها را باهم جمع کرده در متغییری به نام result میریزد ، و بعد result را بر می گرداند ، دقت کنید که بعد از  public static کلمه کلیدی int  آورده شده یعنی این متد عدد صحیح به ما می دهد .

و برای استفاده از این متد به شکل زیر عمل می کنیم:

بیاد به شکل دیگری عمل کنیم ، من دو کلاس می سازم به نام های Mohamd و Amir دو پراپرتی برای Amir ایجاد می کنم ، hairColor و age  حال می خواهم در کلاس Mohamad به پراپرتی های Amir دست رسی داشته باشم و به آنها مقدار بدم .

picOneEOne

در تصویر بالا مشاهده می کنید که کلاس Amir و Mohamad ایجاد شده است ، به کلاس های دیگر کاری نداریم ، همان طور که می بینید ، در پوشه src سورس کدهای من قرار دارد.

خوب این هم کدهای مربوط به کلاس Amir

چون پراپرتی های کلاس Amir استاتیک است می توانیم به این شکل به آنها دست رسی داشته باشیم Amir.hariColor = “red”  اما من می خواهم  چند شی از روی Amir ایجاد کنم تا با ساخت object یا شی هم آشنا بشید.

برای ساخت شی یا همان Object می نویسیم

نام کلاس ، کلمه کیدی new = نام دلخواه شی ، نام کلاس

Amir mair = new Amir();

به این ترتیب من ۳ شی از روی کلاس Amir ایجاد کردم سپس برای هر کدام رنگ مو و سن را مقدار دهی کردم ، در کد بالا می بینید که رنگ مو و سن را به صورت مستقیم هم مقدار دهی کرده ام یعنی Amir.hairColor = “gold”;

در انتها رنگ مو و سن همه اشیاء و خود کلاس را چاپ کردم ، به نظر شما چه چیزی چاپ می شود ؟

gold, red, blue,black ,12,12,24,29  ؟ اگر فکر می کنید این داده ها چاپ می شوند اشتباه می کنید

این چیزیست که چاپ خواهد شد :

black

black

black

black

۲۹

۲۹

۲۹

۲۹

می بینید که رنگ موی همه balck  و  سن ۲۹  چاپ می شود، اما چرا ؟؟

چون پراپرتی های Amir استاتیک هستند و در فضای  stack  رم قرار می گیرند ، اما آبجک های ایجاد شده در فضای هیپ در رم جای می گیرند ، و برای تمام آبجکت های ما فقط یک رنگ مو و یک سن وجود دارد ، پس هر گاه رنگ مو یا سن هر یک از آبجکت ها را تغییر دهیم ، رنگ مو یا سن همه تغییر می کند ، در کد بالا آخرین تغییر balck برای رنگ مو و ۲۹  برای سن بوده است ، (در مورد فضای استک و هیپ در رم تخقیق کنید )

برای رفع این مشکل من پراپرتی های hairColor  و    age  در Amir را غیر استاتیک می کنم به و کد به این شکل در می آید در کلاس Amir

اما در کلاس Mohamad دچار مشکل می شوم ، چهار خط از کد ما به مشکل بر خورده و کار نمی کند ، این خط کد ها :

چرا این کد ها دچار خطا شده اند ؟ چون ما نمی توانیم در فضای استک به متدها یا پراپرتی های غیر استاتیک دست رسی داشته باشیم ، به همین علت من نمی توانم مستقیم به صورت گذشته این پراپرتی ها را مقدار دهی کنم یا مقدار آنها را چاپ کنم ، برای دست رسی باید از روی کلاس آبجک بسازیم ، آبجک سازی را هم که در کد قبل آموختید .

پس کد ما به این شکل در می آید :

حالا اگر کد را اجرا کنید می بینید که مقدار رنگ مو و سن برای هر شی متفاوت چاپ شده است .

به خاطر داشته باشید ، از استاتیک کردن متدها و پراپرتی ها خود داری کنید ، مگر در مواقع نیاز وقتی پراپرتی یا متدی استاتیک می شود در داخل فضای استک رم می نشیند و تا زمانی که برنامه شما درحال اجراست آن پراپرتی پاک نمی شود ، فضای استک محدود است پس مراقب باشید که آن را بیهوده پر نکنید ، اما در مورد فضای هیپ جای نگرانی نیست ، چرا ؟

چون جاوا دارای GC یا Garbage Collector آشغال جمع کن می باشد ، وظیفه این فرد از بین بردن پراپرتی های است که برنامه ما دیگر از آنها استفاده نمی کند ، با این کار نمی گذارد فضای رم بی جهت پر شود .

پس در این دوره آموزشی پراپرتی های خود را استاتیک نکنید مگر آن که ضروری باشد ، می توانید در این باره در اینترنت بیشتر جستو جو کنید .

 

 

اشتراک گذاری:
http://darkoobweb.com/?p=216

درباره نویسنده پوریا

سلام. من پوریا هستم. به برنامه نویسی علاقه مندم. حدود دو سال است در سامانه‌ی آموزشی خدماتی دارکوب وب فعالیت می‌کنم. امیدوارم آموزش‌هایی که در وب‌سایت قرار می‌دهم برای شما مفید باشد. موفق باشید. {^}

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *