loading...
طراحی وب سایت

nariman بازدید : 32 دوشنبه 04 شهریور 1392 نظرات (0)

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

کلاس ها

شايد مهمترين نکته اي که بايد در مورد کلاس ها ياد بگيريم آن است که نوع جديدي از داده ها را تعريف مي کند. داده هاي نوع جديد را پس از تعريف شدن مي توان براي ايجاد شي ء هاي نوع مورد نظر به کار برد. از اين رو هر کلاس؛ الگويي template براي يک شيء است و هر شيء هم نمونه اي instance از يک کلاس به شمار مي آيد. چون هر طراحی وب سایت شي ء نمونه اي از يک کلاس است تغلب مي بينيم که دو واژه شيء و نمونه به جاي يکديگر به کار برده مي شوند.

 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.java03*

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 هنوز به همان شيء اوليه ارجاع دارد .

ارسال نظر برای این مطلب

کد امنیتی رفرش
اطلاعات کاربری
  • فراموشی رمز عبور؟
  • آرشیو
    آمار سایت
  • کل مطالب : 19
  • کل نظرات : 5
  • افراد آنلاین : 1
  • تعداد اعضا : 0
  • آی پی امروز : 4
  • آی پی دیروز : 11
  • بازدید امروز : 6
  • باردید دیروز : 7
  • گوگل امروز : 0
  • گوگل دیروز : 0
  • بازدید هفته : 14
  • بازدید ماه : 13
  • بازدید سال : 37
  • بازدید کلی : 2,598