آموزش جاوا (J2SE) قسمت سوم

آموزش جاوا (J2SE)

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

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

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

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

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

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


package darkoobweb;

public class Pouria {

 public static String hariColor;
 public static int age;

 public static void main(String[] args) {


 }


 public static void khordan() {
 System.out.println("golabi khordam");
 }

 public static void khabidan() {
 System.out.println("khab mibinam alan");
 }


 public static void showHairColor() {

 System.out.println(Pouria.hariColor);

 }

 public static void showAge() {
 System.out.println(Pouria.age);
 }
}

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

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

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

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

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

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

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

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

Pouria.hariColor = "red";
Pouria.age = 12;
Pouria.showAge();
Pouria.showHairColor();


Pouria.khordan();
Pouria.khabidan();

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


public static int sum(int x, int y) {
int result = x + y;
return result;
}

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

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

int sabad = Pouria.sum(12, 5);
System.out.println(sabad);

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

picOneEOne

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

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

package darkoobweb;

public class Amir {
 public static String hairColor;
 public static int age;
}

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

public class Mohamad {
 public static void main(String[] args) {

 Amir mair = new Amir();
 Amir mir = new Amir();
 Amir ho = new Amir();

 Amir.hairColor = "gold";
 mair.hairColor = "red";
 mir.hairColor = "blue";
 ho.hairColor = "black";
 Amir.age=12;
 mir.age = 12;
 mair.age = 24;
 ho.age = 29;

 System.out.println(mair.hairColor);
 System.out.println(mir.hairColor);
 System.out.println(ho.hairColor);
 System.out.println(Amir.hairColor);
 System.out.println(Amir.age);
 System.out.println(mair.age);
 System.out.println(mir.age);
 System.out.println(ho.age);


 }
}

برای ساخت شی یا همان 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


package darkoobweb;

public class Amir {
 public String hairColor;
 public int age;
}

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


Amir.hairColor = "gold";
Amir.age=12;

System.out.println(Amir.hairColor);
System.out.println(Amir.age);

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

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


public class Mohamad {
 public static void main(String[] args) {

 Amir mair = new Amir();
 Amir mir = new Amir();
 Amir ho = new Amir();
 Amir amir = new Amir();

 mair.hairColor = "red";
 mir.hairColor = "blue";
 ho.hairColor = "black";
 amir.hairColor = "gold";

 mir.age = 12;
 mair.age = 24;
 ho.age = 29;
 amir.age = 30;

 System.out.println(mair.hairColor);
 System.out.println(mir.hairColor);
 System.out.println(ho.hairColor);
 System.out.println(amir.hairColor);
 System.out.println(amir.age);
 System.out.println(mair.age);
 System.out.println(mir.age);
 System.out.println(ho.age);


 }
}

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

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

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

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

 

 

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

پوریا

سلام ، من پوریا هستم با جاوا آشنایی دارم به هوش مصنوعی و امنیت علاقه مندم و امید وارم آموزش هایی که در وب سایت قرار می دم برای شما مفید باشه ، موفق باشید {^}

نظر دهید

Click here to post a comment

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