برنامه نویسی جاوا – قسمت نهم (تعریف کلاس ها)

دوشنبه, ۱۰ام اسفند , ۱۳۸۸ | ۷ دیدگاه

کلاس ها در هسته مرکزی جاوا جا دارند. کلاس ها؛ساختار منطقی هستند که کل زبان جاوا بر روی آن ساخته شده است زیرا شکل و ماهیت شی ء ها را تعریف می کنند. بدین ترتیب کلاس ها پایه و اساس برنامه سازی شی ء گرا را در جاوا تشکیل می دهند . هر موضوعی که بخواهید در برنامه های جاوا پیاده سازی کنید؛می بایست در یک کلاس نهان encapsulated شود.
اصول کلاس ها :
شاید مهمترین نکته ای که باید در مورد کلاس ها یاد بگیریم آن است که نوع جدیدی از داده ها را تعریف می کند. داده های نوع جدید را پس از تعریف شدن می توان برای ایجاد شی ء های نوع مورد نظر به کار برد. از این رو هر کلاس؛ الگویی template برای یک شیء است و هر شیء هم نمونه ای instance از یک کلاس به شمار می آید. چون هر شی ء نمونه ای از یک کلاس است تغلب می بینیم که دو واژه شیء و نمونه به جای یکدیگر به کار برده می شوند.
شکل عمومی کلاس ها :
وقتی کلاسی را تعریف می کنید؛ ماهیت و فرم دقیق آن معرفی می شود. این کار با مشخص کردن داده های درون آن و روتین هایی که بر روی آن داده ها عمل می کنند؛انجام می گردد.روتین های هر کلاس؛ رابز منتهی به داده های آن را تعریف می کنند.
هر کلاس با استفاده از کلمه کلیدی class تعریف می شود. شکل عمومی تعریف هر کلاس در ذیل نشان داده شده است:

Class classname{
Type instance-variable1;
Type instance-variable2;
//…
Type instance-variable N;

Type methodname1(parameter-list){
//body of method
}
Type methodname2(parameter-list){
//body of method
//…
Type methodnameN(parameter-list){
//body of method
}

داده ها یا متغیر هایی که در هر کلاس تعریف می شوند؛ نمونه متغیر instance variable نامیده می شوند. روتین ها نیز در متد ها جای میگیرند. به طور کلی؛ به متد ها و متغیر هایی که در هر کلاس تعریف می شوند؛اعضای member کلاس گفته می شود. در بیشتر کلاس ها؛ متد های تعریف شده برای هر کلاس هستند که بر روی نمونه متغیر ها کار می کنند و به آنها دستیابی دارند. از این رو؛ این متد ها هستند که چگونگی استفاده از داده های هر کلاس را تعیین می کنند.
دلیل اینکه متغیرهای هر کلاس ، نمونه متغیر خوانده می شوند ، آن است که هر نمونه از یک کلاس (یعنی ، هر شی از یک کلاس) ، کپی خاص خود را از متغیرها دارد . از این رو ، داده های هر شیء ،جداگانه و خاص خود آن بوده و با داده های یک شیء دیگر یکسان نیستند . به زودی به بررسی این نکته خواهیم پردداخت ، اما این نکته مفهوم مهمی است که باید پیشاپیش فرابگیرید.
تمام متدها همان شکل عمومی main() را دارند که تا به حال به کاربرده ایم . اما ، بیشتر متدها به عنوان یک متد ایستا یا عمومی مشخص نمی شوند . توجه داشته باشید که در شکل عمومی کلاس ها ، متدی به نام main() مشخص نمی شود . کلاس های جاوا نیاز به متد main() ندارند . تنها زمانی چنین متدی مشخص می شود که کلاس مورد نظر ، نقطه آغازین برنامه تان باشد . به علاوه ، اپلت ها اصلا نیاز به متدی به نام main() ندارند .
توجه : برنامه سازان C++ توجه داشته باشند که معرفی کلاس و پیاده سازی متدها در یکچا ذخیره می شوند و به طور جداگانه تعریف نمی شوند . این امر گاهی اوقات سبب ایجاد فایل های java . بسیار بزرگ می شود ، چه آنکه هر کلاس باید کلا در یک فایل واحد تعریف شود . دلیل گنجاندن این ویژگی در طراحی جاوا آن است که احساس می شد که در دراز مدت ، داشتن

یک کلاس ساده
مطالعه کلاس ها را با یک مثال ساده آغاز می کنیم . برای این کار کلاسی به نام BOX تعریف می کنیم که دارای سه نمونه متغیر به نام Width , height , depth است . در حال حاضر ، BOX فاقد هر گونه متد است .

Class box {
   Double width ;
   Double height ;
   Double depth ;
}

همان گونه که گفته شد ، هر کلاس ، نوع جدیدی از داده ها را تعریف می کند . در این مثال خاص ، نوع جدیدی که ایجاد می شود ، BOX نامیده شده است . از این نام برای تعریف شیء های نوع BOX استفاده خواهد شد . مهم است به خاطر بسپارید که تعریف هر کلاس جدید تنها سبب اینجاد یک الگو می شود ؛ یک شیء واقعی ایجاد نمی شود . از این رو ، تعریف کلاس BOX در بالا سبب ایجاد هیچ شیئی از نوع BOX نمی شود .
برای آنکه یک شیء BOX ایجاد شود ، می بایست از عباراتی همچون سطر زیر استفاده کنید .

BOX mybox = new box () ;
 // creat a box object called mybox

پس از آنکه عبارت بالا اجرا شد ، mybox به عنوان نمونه ای از BOX ایجاد خواهد شد . از این رو ، یک واقعیت «فیزیکی» از کلاس BOX ایجاد خواهد شد . فعلا ، نگران جزئیات این عبارت نباشید .
باز هم لازم به ذکر است که هر گاه نمونه ای از یک کلاس را ایجاد می کنید ، شیئی ایجاد می شود که نسخه خاص خودش را از هر یک از نمونه متغیرهای تعریف شده در آن کلاس خواهد داشت . از این رو ، هر شی BOX ، نسخه های خاص خودش را از نمونه متغیرهای Width , height , depth خواهد داشت . برای دستیابی به این متغیرها باید از عملگر نقطه (.) استفاده کنید . این عملگر ، نام شیء را با نام «نمونه متغیر» مرتبط می کند . به عنوان مثال ، برای آنکه مقدار ۱۰۰ را به متغیر Width از mybox تخصیص دهید ، از عبارت زیر استفاده کنید :

Mybox . width = 100

عبارت بالا برای کامپایلر مشخص می کند که مقدار ۱۰۰ را به نسخه ای از width که در شی mybox است تخصیص دهد . به طور کلی ، از عملگر نقطه (.) برای دستیابی به نمونه متغیرها و متدهای موجود در یک شیء استفاده می شود . در برنامه زیر از کلاس BOX استفاده شده است :

/* A program that uses the BOX class.
Call this file BOXDemo.java
*/
Class BOX  {
   Double width ;
   Double height ;
   Double depth ;
}

//this class declares an object of type BOX .
Class boxvemo {
Public static void main (string args[])  {
Box mybox = new box ();
Double vol ;
// assign values to mybox’s instance variables
Mybox.width = 10;
Mybox.height = 20;
Mybox.depth = 15;
// compute volume of box
Vol = mybox.width*mybox .height *mybox.depth;
System.out.println(“volume is ”+vol) ;
     }
}

می بایست فایل حاوی این برنامه را Boxdemo.java بنامید ، چرا که متد main() در کلاسی است که Boxdemo نام دارد ، و نه BOX . کامپیوتر جاوا هر کلاس را به طور خودکار در فایل .class ایجاد خواهد شد ؛ یکی برای Box و یکی هم برای Boxdemo . کامپیوتر جاوا هر کلاس را به طور خودکار در فایل .class خاص خودش قرار می دهد . لزومی ندارد که هر دو کلاس BOX و Boxdemo دریک فایل دخیره شوند. هر یک از کلاس ها را می توانید در فایل های خاص خودشان قرار دهید : box.java و boxdemo.java .
برای آنکه این برنامه را اجرا کنید ، باید boxdemo.class را اجرا کنید. وقتی این کار را انجام می دهید ، خروجی زیر را خواهید دید :

Volume is 3000.0

همان گونه که پیش از این گفته شد ، هر شیء نسخه های خاص خودش را از نمونه متغیرها خواهد داشت. این بدین معناست که اگر دو شی نوع BOX داشته باشید ، هر یک از آنها ، نسخه های خاص خودشان را از width.depth و height خواهند داشت . مهم است بدانید که تغییراتی که در نمونه متغیرهای یک شی ایجاد می شوند، هیچ تاثیری بر نمونهه متغیرهای شیء دیگر نخواهند داشت. به عنوان مثال ، در برنامه زیر دو شیء BOX تعریف شده است :

// this program declares two box objects .
Class Box {
   Double width ;
   Double height ;
   Double depth ;
}
Class boxDemo2 {
Public static void main (string args[]) {
Box mybox1 = new box ();
Box mybox2 = new box ();
Double vol ;

// assign values to mybox’s instance variables
Mybox1.width = 10;
Mybox1.height = 20;
Mybox1.depth = 15;
/* assign different values to mybox’s instance variables*/
Mybox2.width = 3;
Mybox2.height = 6;
Mybox2.depth = 9;

// compute volume of first box
Vol = mybox1.width*mybox1 .height *mybox1.depth;
System.out.println(“volume is ”+vol) ;

// compute volume of second box
Vol = mybox2.width*mybox2 .height *mybox2.depth;
System.out.println(“volume is ”+vol) ;
     }
}

خروجی این برنامه در زیر نشان داده شده است :

Volume is 3000.0
Volume is 162.0

همانگونه که می بینید ، داده های mybox1 ، کاملا جدای از داده های موجود در mybox2 هستند .

شیوه تعریف کردن شیءها
همان گونه که در بالا شرح داده شد ، وقتی کلاسی را ایجاد می کنید ، در واقع یک نوع جدید برای داده ها ایجاد می شود . از این نوع جدید می توانید برای تعریف کردن شیئ هایی از آن نوع استفاده کنید . اما رسیدن به شئ های یک کلاس ، نوعی فرآیند دو مرحله ای است . نخست اینکه ، باید متغیری است که می تواند به یک شئ ارجاع داشته باشد. دوم اینکه ، می بایست یک نسخه فیزیکی واقعی از شئ به دست آورید و آن را به آن متغیر تخصیص دهید. این کار را می توانید با استفاده از عملگر new انجام دهید. عملگر new ، حافظه ای را به طور پویا (یعنی در زمان اجرا) به شئ تخصیص می دهد و نشانی آن را بر می گرداند. این نشانی سپس در متغیر ذخیره می شود . از این رو ، تمام شئ های نوع کلاس در جاوا باید به طور پویا تخصیص یابند . اینک به جزئیات این رویه می پردازیم .
درنمونه برنامه های زیر از سطری مشابه عبارت زیر برای تعریف شیئی از نوع BOX استفاده خواهد شد:

Box mybox = new box();

دو مرحله پیش گفته در عبارت بالا ترکیب شده اند . عبارت بالا را می توان برای نشان دادن هر یک از مراحل به صورت زیر بازنویسی کرد :

Box mybox ; // declare refrence to object
Mybox = new box (); // allocate a box object

درسطر نخست ، mybox به عنوان نشانی شیئی از نوع box تعریف می شود . پس از اجرای این خط ، مقدار null در mybox ذخیره خواهد شد که نشانگر آن است که متغیر هنوز به هیچ شیء واقعی ارجاع ندارد . هر گونه اقدام برای استفاده از mybox در این مرحله منجر به بروز خطای زمان کامپایل خواهد شد . سطر دوم هم موجب تخصیص شیء واقعی و تخصیص نشانی آن به mybox می شود . پس از اجرای سطر دوم ، می توانید از mybox می شود . پس از اجرای سطر دوم ، می توانید از mybox به گونه ای استفاده کنید که گویی یک شیء Box است. اما mybox صرفا نشانی حافظه شیء BOX واقعی را نگهداری می کند . تاثیر این دو سطر در شکل ۱-۶ به تصویر کشیده شده است .
توجه : خوانندگانی که با C/C++ آشنایی دارند ، احتمالا متوجه شده اند که به نظر می رسد که نشانی شیء ها مشابه نشانه روها باشد . این گمان و تصور واقعا درست است . نشانی هر شیء ف مشابه نشانه رو نقطه ای از حافظه است . تفاوت اصلی – و کلید امنیت جاوا – آن است که نشانی همچون نشانه رو ها قابل پردازش و مدیریت نیست . از این رو ، ارجاع آنها را نمی توان به نقطه دلخواهی از حافظه تغییر داد و یا همچون یک صیحیح با آنها کار کرد .

نگاهی دقیقتر به new
همانگونه که در قسمت پیش شرح داده شد ، عملگر new ، حافظه هر شیء را به طور پویا تخصیص می دهد .شکل کلی آن در ذیل نشان داده شده است :

Class-var = new classname();

Class-var ، متغیری از نوع کلاسی است که ایجادمی شود ، classname نام کلاسی است که نمونه ای از آن ایجاد می شود . constructor کلاس با نام کلاس و دو پرانتزی که پس از آن قرار گرفته اند ، مشخص می شود . constructor مشخص می کند که هنگام ایجاد شیئی از نوع کلاس ، چه اتفاقی رخ می دهد . constructor های خاص خودشان را در تعریف کلاس مشخص می کنند . اما ، اگر constructor به طور صریح مشخص نشود ، در آن صورت جاوا آن را به طور خودکار تامین می کند . در خصوص کلاس box همین طور است . فعلا از constructor پیش فرض استفاده می کنیم . به زودی خواهید دید که چگونه می توانید constructor های خاص خود را تعریف کنید .
در این مقطع ممکن است از خود بپرسید که چرا نیازی به استفاده از new برای مواردی چون اعداد صحیح یا کارکترها نیست . پاسخ این پرسش آن است که انواع داده های پایه جاوا به صورت شیء پیاده سازی نمی شوند. بلکه ، به صورت متغیرهای «معمولی» پیاده سازی می شوند . این کار به خاطر بازدهی بیشتر انجام می گیرد . همان گونه که خواهید دید ، شیء ها ،ویژگیها و خصوصیات زیادی دارند که لازم است طرز برخورد با آنها نسبت به انواع داده های پایه متفاوت باشد . با عدم تحمیل سرباز خاص شیء ها به انواع داده های پایه ، جاوا قادر به پیاده سازی کارآمدتر انواع داده های پایه می شود . در آینده ، با آن دسته از نگارشهای «شیئی» انواع داده های پایه آشنا خواهید شد که برای استفاده در شرایطی مهیا شده اند که همان نوع شیء ها مورد نیاز می باشند .
مهم است به خاطر داشته باشید که new حافظه شیء ها را در طی اجرا ایجاد کنند . اما ، از آنجایی که حافظه محدوداست ، این احتمال وجود دارد که new به دلیل عدم وجود حافظه کافی نتواند حافظه لازم برای یک شیء را تخصیص دهد . اگر چنین اتفاقی رخ دهد . استثنا زمان اجرا پیش خواهد آمد (چگونگی مدیریت این استثنا ها را د آینده بررسی خواهیم کرد)..
تمایز بین کلاس ها و شیء ها را یک مرتبه دیگر مرور می کنیم . هر کلاس، نوع جدیدی از داده ها را ایجاد می کند که می توان برای ایجاد شیء ها به کار برد . یعنی ، هر کلاس نوعی چارچوب منطقی ایجاد می کند که رابطه بین اعضایش را تعریف می کند . وقتی شیئی از یک کلاس معین را تعریف می کنید ، در واقع نمونه ای از آن کلاس ایجاد می کنید . از این رو ، هر کلاس ، نوعی ساختار منطقی است . هر شیء نیز نوعی واقعیت فیزیکی است (یعنی هر شیء فضایی را در حافظه اشغال می کند) . مهم است که این تمایز را به ذهن خود بسپارید .
تخصیص متغیرهای ارجاع به شیء
وقتی عمل تخصیص انجام می گیرد، عملکرد متغیرهای ارجاع به شیء با آنچه انتظار دارید تفاوت دارد . به عنوان مثال ، فکر می کنید دو عبارت زیر چه عملی انجام می دهند؟

Box b1 = new Box () ;
Box b2 = b1;

ممکن است چنین تصور کنید که نشانی نسخه ای از شیئی که b1 به آن ارجاع دارد ، به b2 تخصیص می یابد . یعنی ، ممکن است چنین فکر کنید که b1 و b2 هر دو به یک شیء ارجاع خواهند داشت . تخصیص b1 و b2 موجب تخصیص حافظه یا کپی کردن بخشی از شیء اولیه نمی شود . بلکه صرفا سبب می شود که b2 نیز به همان شیئی که b1 به آن ارجاع دارد ، ارجاع داشته باشد . از این رو ، هر گونه تغییر در شیء از طریق b2 ، بر شیئی که b1 به آن ارجاع دارد ، تاثیر خواهد گذاشت ، چرا که هر دو آنها یک شیء هستند .
این وضعیت در زیر به تصویر کشیده شده است :

اگر چه b1 و b2 هر دو به یک شیء ارجاع دارند ، اما به هیچ شکل دیگر مرتبط نیستند . به عنوان مثال ، تخصیص مقداری دیگر به b1 صرفا سبب قطع ارتباط آن با شیء اولیه می شود که البته ، هیچ تاثیری بر b2 نخواهد داشت . به عنوان مثال :

Box b1 = new Box();
Box b2 = b1 ;
// …
B1= null ;

B1 در اینجا با null مقدار دهی شده ، اما b2 هنوز به همان شیء اولیه ارجاع دارد .
نکته : وقتی مقدار متغیر ارجاع به شیء را به متغیر دیگری از همان نوع تخصیص می دهید ، هیچ نسخه ای شیء ایجاد نمی شود ، بلکه تنها نسخه ای از همان نشانی (ارجاع) ایجاد می شود.
خوب این هم از درسنامه و کلاس ها. Unit بعدی در مورد ادامه کلاس ها است و کلا دیگه تمام مطالب به نوعی به کلاس ها مربوط میشه پس از ابتدای این درسنامه با دقت مطالعه داشته باشید و سوالاتتون رو برام بهshoneDame2294@yahoo.com ارسال کنید.

پستهای مرتبط :

برنامه نویس جاوا – قسمت ۸

برنامه نویس جاوا – قسمت ۷

برنامه نویس جاوا – قسمت ۶

برنامه نویس جاوا – قسمت ۵

برنامه نویس جاوا – قسمت ۴

برنامه نویس جاوا – قسمت ۳

برنامه نویس جاوا – قسمت ۲

برنامه نویس جاوا – قسمت ۱

Be Sociable, Share!


۷ دیدگاه


  1. مينا
    ۱۱ اسفند ۱۳۸۸

    بابت دیر شدن درسنامه از همه دوستان معذرت می خوام




  2. مهدی
    ۳ فروردین ۱۳۸۹

    بی صبرانه منتظر ادامه درسنامه ها هستم
    با تشکر



  3. […] برنامه نویس جاوا – قسمت ۹(تعریف کلاسها) […]




  4. neda
    ۵ اردیبهشت ۱۳۸۹

    سلام ، مطالب داخل سایت خوب بود




  5. امام الدین
    ۸ دی ۱۳۸۹

    بی صبرانه منتظر ادامه درسنامه ها دهم
    با تشکر




  6. ايمان
    ۱ مرداد ۱۳۹۰

    سلام
    وب سایت پر باری دارید ، خوشحالم با وب شما آشنا شدم

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




  7. eslam
    ۳ آذر ۱۳۹۰

    وب سایت بسیار جالبی دارید.



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