فصل دوم
جاوا چیست ؟
جاوا یک زبان برنامه نویسی است که در اوایل دهه 90
توسط Java Soft ، بخش نرم افزاری شرکت Sun توسعه
داده شد . هدف آن بود که جاوا زبانی ساده ، قوی و
همه منظوره باشد . جاوا تمام جنبه های مثبت C و ++C
را در خود دارد ، و آن چیزهایی که برنامه نویسان ++C از
آن نفرت داشته اند ( مانند وراثت چند گانه ، تحریف
اپراتورها و اشاره گرها ) را به کناری گذاشته است .
مهمترین ویژگیهای جاوا این است که اساساً شیء گرا
است . اولین ادعای OOP توانایی استفاده مجدد از کد
است : چیزی که ++C با تمام ادعاهایش هرگز نتوانست
بدان دست یابد . اما در اولین قدم خواهید دید جاوا در این
زمینه تا چه حد اندازه صحت دارد . تصورش را بکنید که با
صرف کمی وقت بتوانید برنامه ای بنویسید که در
سیستم های ویندوز ، یونیکس و مکینتاش براحتی اجرا
شود . همین که یک شرکت نرم افزاری بتواند برای تمام
پلاتفرم های موجود در آن واحد پروژه ای را تولید کند ( و
مقادیر عظیمی پول صرفه جویی کند ) خود می تواند
بهترین دلیل اقبال جاوا باشد و امروز دیگر همه ( و نه
فقط شرکتهای نرم افزاری ) به سمت جاوا کشیده شده
اند . با این ویژگی ( استقلال از پلاتفرم ) یک برنامه
نویس می تواند برای سیستمی برنامه بنویسد که هرگز
با آن کار نکرده است . این ویژگی اصلی ترین علت توفیق
جاوا در اینترنت است . اینترنت شبکه پیچیده ای است از
میلیونها کامپیوتر مختلف در سراسر دنیا ، و مقاومت در
مقابل این وسوسه که بتواند برنامه ای بنویسد که روی
تمام این سیستم های متفاوت و نا متجانس اجرا شود
چندان ساده نیست .
جاوا یک زبان بسیار ساده است چون شما را وادار نمی
کند تا در محیط جدید ( و نا آشنایی ) کار کنید و این برای
کسانی که اطلاعات فنی ناچیزی درباره کامپیوتر دارند
بسیار مهم است . ساختار زبان جاوا در نگاه اول بسیار
شبیه C و ++C است و این به هیچ وجه تصادفی
نیست . C زبانی است ساخت یافته و ++C زبانیست
شیء گرا و مهمتر از همه قسمت اعظم برنامه نویسان
دنیا از آنها استفاده می کنند از سوی دیگر این شباهت
حرکت به طرف جاوا را برای این قبیل افراد ساده خواهد
کرد بنابراین طراحان جاوا برای اجتناب از دوباره کاری از
زبانهای C و ++C بعنوان مدل استفاده کردند .
جاوا با دور انداختن اشاره گرها و بر دوش کشیدن بار
مدیریت حافظه ، برنامه نویسان C و++C را برای همیشه
از این کابوس ها رهایی بخشیده است . علاه بر آن چون
جاوا زبانی برای اینترنت است ، از ایمنی و حفاظت ذاتی
بالایی برخوردار است . طراحان جاوا از ابتدا یک محیط
برنامه نویسی امن را مد نظر داشته اند . مسئله حفاظت
سیستم ها رابطه تنگاتنگی با اشاره گرها دارد . اکثر
مهاجمان برای ورود غیر قانونی به سیستم های دیگران
از این اشاره گرها استفاده می کنند و جاوا با حذف
اشاره گرها این راه را سد کرده است . جاوا مکانیزم های
حفاظتی دیگری هم دارد که در جای خود به آنها اشاره
خواهیم کرد .
تکامل جاوا :
جاوا هم مانند اکثر اختراعات مهم حاصل تلاش
گروهی دانشمندان پیشتاز است . اما نکته جالب
درباره جاوا آن است که جاوا از ویرانه های یک پروژه
شکست خورده سر بر می آورد .
اگر پروژه گرین (Green) که شرکت Sun در سال 1991
آن را شروع کرد به موفقیت می انجامید امروز نه
سان دیگر یک شرکت کامپیوتری می بود و نه جاوا
در سال 1991 ، شرکت Sun Microsystems در آغاز
راه تبدیل شدن به بزرگترین تولید کننده
ایستگاههای کاری Unix بود و در طول فقط پنج
سال درآمدش را از 210 میلیون دلار به 5/2 میلیارد
دلار رسانده بود و به نظر می رسد هیچ چیز نمی
تواند جلودار آن باشد . عامل عمده موفقیت Sun
کارهای پیشتازانه در ایجاد شبکه های باز بود و در
این زمینه هیچ کس به پای آن نمی رسید .
مدیران Sun به این فکر افتادند تا کاری کنند که این
رشد برای مدتی طولانی ادامه یابد یکی از زمینه
های مورد علاقه Sun بازار لوازم الکترونیکی بود ،
پروژه Green بوجود آمد تا برای این بازار نرم افزاری
پیشرفته خلق کند .
مهندسان Sun توجه خود را به
میکروپروسسورهایی معطوف کردند تا دارای قابلیت
استفاده در این گونه سیستم ها باشند . اگر پروژه Green
می خواست موفق باشد باید کاری می کرد تا
سیستم مزبور بتواند به راحتی به بسترهای سخت
افزاری مختلف منتقل شود برای این منظور ابتدا از
کامپایلر C++ استفاده شد ولی بزودی نارسایی
های C++ در این زمینه خود را نشان دادند .
مهندسان Sun خیلی سریع دریافتند که برای ادامه
کار باید چیزی جدید و قوی خلق کنند . در همین
زمان بود که James Gosling کار بر روی زبان جدید
اوک Oak را شروع کرد تقدیر آن بود که این زبان
جاوا نامیده شود ، چون اداره ثبت نام های تجاری Oak
را رد کرد .
بتدریج مهندسین یک دستگاه شبه PAD- Personal Digital Assistant
ساختند که در آن از سیستم عامل ، زبان برنامه
نویسی و واسط کاربر جاوا استفاده شده بود و با
وجود ابتدایی بودن توانست توجه مدیران Sun را به
خود جلب کند .
بعدها گروهی که در پروژه Green کار کرده بودند
شرکت Java Soft را بنیان نهادند .
شکل زیر پایگاه وب این شرکت را نشان می دهد :

برای رفتن به این پایگاه اینترنتی می بایست به
آدرس زیر مراجعه کنید :
http://www.sun.com
متاسفانه بخت با پروژه Green یار نبود و بعد از چند
شکست متوالی Sun آن را کنار گذاشت . در همین
زمان بود که عده ای از محققان NCSA شرکت Net Scape
را تاسیس کردند و این اتفاقات با آتشی که به
سرعت دنیا را در می نوردید و شبکه تار عنکبوتی
جهانی WWW (که مخفف World Width Web می
باشد) نام داشت همزمان شد .
بنابراین اتفاقی نبود که مهندسان پروژه Green به
سمت اینترنت و وب به عنوان بستر پروژه Sun روانه
شوند و بعد از آن دیگر جزء تاریخ است .
چهار سال بعد پروژه Green به بار نشست و جاوا
تبدیل به داغترین موضوع اینترنت شد ، همه از
برنامه نویسان و طراحان صفحات وب گرفته تا
کاربران اینترنت می خواهند از جاوا استفاده کنند . Sun
بلافاصله برای جاوا یک کاوشگر هم تولید کرد . این
اولین کاوشگری بود که می توانست اپلت های
جاوا را اجرا کند و نام آن هم Hot Java بود .
ویژگیهای زبان برنامه نویسی Java :
جاوا ویژگیهای متعددی دارد که آن را منحصربه فرد
کرده است . جاوا هم کامپایلر دارد و اینترپرتر .
توضیح : ( کامپایلر برنامه ای است که متن برنامه را
گرفته و در پایان یک فایل exe تولید می کند . بعد از
کامپایل شدن یک برنامه ، دیگر به وجود کامپایلر
نیازی نیست و می توان برنامه exe را روی هر
کامپیوتر سازگاری اجرا کرد . اما اینترپرتر هیچ برنامه exe
ای تولید نمی کند و برنامه را خط به خط اجرا می
کند ، برای اجرای برنامه حتما باید اینترپرتر هم روی
کامپیوتر مورد نظر موجود باشد ) .
هر کامپایلر فقط برای یک سیستم خاص ( مانند
اینتل ، اپل یا آلفا ) می تواند کد اجرایی تولید کند
اما کامپایلر جاوا کد اجرایی Exe تولید نمی کند و در
عوض یک فایل بینابینی می سازد که بایت کد Byte code
نام دارد و بایت کد چیزی شبیه زبان اسمبلی
است ، اما این زبان مختص هیچ پروسسور خاصی
نیست بلکه زبان اسمبلی یک ماشین ویژه بنام
ماشین مجازی جاوا ( Java Virtual Mashing) دارد
که روی ماشین مجازی جاوا اجرا می شود ،
دستورات فایل بایت کد را به دستورات قابل فهم
برای پروسسوری که روی آن اجرا می شود تبدیل
خواهد کرد .
| برنامه های کاربردی جاوا |
| اشیاء جاوا |
| ماشین مجازی جاوا |
| یونیکس |
ویندوز -Os2 |
مکینتاش |
| سیستم عامل |
اما شاید از خود سئوال کنید که چرا جاوا این همه
کار را بر خود ( و دیگران ) سخت گرفته است ؟
این همه لایه و ماشین مجازی برای چیست ؟ یکی
از ادعاهای جاوا ، آزاد بودن از بستر سخت افزاری
است اما این یعنی چه ؟ اگر جاوا بخواهد در
اینترنت موفق باشد برنامه های آن باید بتوانند بدون
هیچ اشکالی روی تمام کامپیوترهای متصل به
اینترنت اجرا شوند . اما شما بهتر می دانید که
اینترنت شبکه عظیمی است از کامپیوترهای
نامتجانس ، از سوپر کامپیوترهای عظیم گرفته تا PC
های مبتنی بر پروسسور های اینتل و پاور پی
سی تا ماشین های یونیکس مبتنی بر
پروسسورهای آلفا و ... !
چگونه یک برنامه اجرایی می تواند روی این طیف
وسیع کامپیوترها اجرا شود ؟
ایده اولیه ساده است : برنامه ها برای ماشین
مجازی کامپایل شوند و این ماشین مجازی روی
تمام کامپیوترهای متصل به اینترنت نصب شود .
این دقیقاً همان روشی است که جاوا در پیش
گرفته است . برنامه تان را با یک کامپایلر جاوا
کامپایل کنید ، آن را در پایگاه وب خود قرار دهید و
به دیگران اطلاع دهید تا با یک کاوشگر مجهز به
جاوا (Java – Enabled Brower ) این برنامه را که
ممکن است در دل یک صفحه وب قرار داشته باشد
اجرا کنند .
شاید هرگز تصور نمی کردید که برنامه ای را که با
یک PC اینتل نوشته اید روی یک ماشین مکینتاش
یا یونیکس اجرا شود ولی اکنون به لطف جاوا این
دیگر آرزویی دست نیافتنی نیست .
شیء گرایی در جاوا به غایت خود رسیده است .
جاوا در استفاده از اشیاء بسیار مفید و سخت گیر
است و تخطی از اصول را نمی پذیرد . در C++
شما می توانید از اشیاء به موازات برنامه نویسی
به سبک قدیم استفاده کنید و اکثراً در پایان کار
چنان ملغمه ای بوجود می آید که مدیریت آن با
روش های برنامه نویسی شی ء گرا امکان دارد نه
با روش های قدیمی . جاوا دیگر به شما اجازه
نمی دهد تا خود را در چنین مخمصه ای گرفتار
کنید !
شروع برنامه نویسی با جاوا :
اولین برنامه ای که می نویسیم یک برنامه متکی
به خود است بنام Hello World . تفاوت یک برنامه
متکی به خود و یک اپلت آن است که در برنامه
متکی به خود ( که از این به بعد به آن فقط برنامه
خواهیم گفت ) از متدی بنام main( ) استفاده می
شود در حالیکه اپلت چنین متدی ندارد .
برنامه Hello World بسیار ساده است و فقط جمله
“Hello World” را نمایش می دهد با این حال می
توان از آن به عنوان سنگ بنای برنامه های
پیشرفته تر استفاده کرد چون تمام برنامه های جاوا
ساختار کلی مشابهی دارند . بطور مثال به لیست
زیر نگاه کنید :

برای کامپایل کردن برنامه باید از کامپایلر جاوا (javac
) استفاده کرد روش کار چنین است :
Java HelloWorld. java
کامپایلر بعد از پایان کار یک فایل کلاس بنام HelloWorld. Class
تولید خواهد کرد . اصولاً کامپایلر برای هر کلاس
برنامه یک فایل کلاس جداگانه تولید خواهد کرد .
فایل تولید شده یک فایل اجرایی مستقل نیست .
برای اجرای این فایل باید از اینترپرتر جاوا استفاده
کرد . اینترپرتر جاوا ، Java نام دارد . برای اجرای
فایل کلاس تولید شده چنین باید کرد :
Java HelloWorld
اگر همه چیز درست پیش رفته باشد ، باید جمله “Hello World
!” را روی صفحه کامپیوتر خود مشاهده کنید .
نکته : دقت کنید که کامپایلر جاوا و اینترپرتر جاوا دو
چیز متفاوتند . کامپایلر از فایل متن برنامه یک فایل
کلاس می سازد و اینترپرتر فایل کلاس را اجرا می
کند .
ایجاد یک اپلت جاوا :
ایجاد اپلت با ایجاد برنامه فرق دارد و قواعد متفاوتی
بر آن حمکفرماست . یک اپلت برای اجرا در صفحات
وب نوشته می شود ، بنابراین کمی پیچیده تر از
یک برنامه است . در واقع یک اپلت تا زمانی که در
یک کاوشگر اجرا نشود خروجی خود را نمایش
نخواهد داد .
باید سعی شود برنامه ها ، اپلت ها و صفحات وب
را در دایرکتوریهای جداگانه ذخیره کرد . اپلتی که در
این قسمت می نویسیم Hello World Applet نام
دارد . به لیست زیر نگاه کنید :

اپلت را با نام HelloWorldApplet. Java ذخیره کنید.
در مورد یک اپلت باید به چند نکته توجه کنید :
دستور import در خط 1 شبیه دستور #include در
زبان C است با این دستور اپلت می تواند از
کلاسهای JDK برای کارهای گرافیکی استفاده
کند .
متد Paint ( ) برای نمایش محتویات اپلت است در
این جا عبارت Hello World ! روی صفحه نمایش
داده خواهد شد اپلت ها متد main( ) ندارند و به
جای آن از متدهای init( ) و Start( ) یا Paint ( )
استفاده می کنند .
برای کامپایل کردن این اپلت چنین باید کرد java Hello World Applet. java
در این حالت هم کامپایلر یک فایل کلاس به نام Hello World Applet. Class
ایجاد خواهد کرد اما برای اجرای یک اپلت یک قدم
دیگر هم باید برداشت و آن ایجاد یک فایل HTML
است که اپلت در آن اجرا خواهد شد می توانید یک
فایل HTML را برای این منظور مشاهده کنید .
یک HTML برای اجرای اپلت Hello World :

تحلیل برنامه :
برای اجرای یک اپلت در فایل HTML باید از برچسب
< applet > استفاده کرد برای مشخص کردن نام
کلاسی که اپلت در آن است از صفت CODE
استفاده کنید . برای مشخص کردن ابعاد پنجره ای
که اپلت در آن اجرا خواهد شد از صفت های Width
و Height استفاده کنید . اعداد مشخص شده بر
حسب پیکسل هستند این فایل را با نام HelloWorldApplet.html
ذخیره کنید حالا آماده اید تا اپلت را اجرا کنید این
کار به دو روش امکانپذیر است :
1- استفاده از کاوشگرهای مجهز به جاوا مانند Net Scape
2- استفاده از برنامه Applet Viewer که با JDK می
آید . این برنامه کل صفحه وب را نمی تواند نمایش
دهد و فقط اپلت را نمایش خواهد داد .
برای دیدن اپلت در یک کاوشگر ، فایل html فوق را
باز کنید ، با این کار صفحه وب و اپلت درون آن به
نمایش در خواهد آمد . روش استفاده از applet viewer
چنین است .
نکته : با وجود اینکه می توان برنامه applet viewer
را از محل فایل html اجرا کرد ولی در این حالت
بدون بستن آن نمی توان اپلت را مجدداً بار کرد . در
حالیکه اگر مشاهده گر اپلت از محل دیگری اجرا
شود ( مانند دستور فوق) می توان یک اپلت را
تغییر داده ، مجدداً کامپایل کرده و سپس دوباره در
مشاهده گر بار کرد .
بطور کلی جاوا یک زبان برنامه نویسی است که با
آن می توان برنامه های متنوعی نوشت بیشترین
کاربرد جاوا در اینجا اپلتهایی است که در
کاوشگرهای وب قابل مشاهده هستند .
اپلتها برنامه هایی هستند که جزیی از صفحات وب
محسوب می شوند . تقریباً هر کاری با اپلت ها
امکانپذیر است .
قدرت جاوا در سادگی و استقلال از آن بستر سخت
افزاری ( چه در فایل منبع برنامه و چه در کد باینری
آن ) است . با جاوا می توان برنامه هایی هم
نوشت که بدون کاوشگرهای وب قابل اجرا باشند .
اپلت های جاوا را فقط در فایلهای HTML می توان
مورد استفاده قرار داد .
برنامه نویسی شی ء گرا و جاوا :
(Object Oriented Programming – OOP) یکی از
بزرگترین ایده های برنامه نویسی در دو دهه اخیر
است که نیاز به تسلط کامل دارد .
مفاهیم برنامه نویسی شی ء گرا :
برنامه نویسی شی ء گرا قصد دارد مدلی از دنیای
واقعی را وارد برنامه نویسی کامپیوتر کند دنیای
اطراف ما از اشیاء ساخته شده است .
اشیاء (Objects) و کلاسها (Classes) :
شیی ء کلیدی ترین مفهوم برنامه نویسی شی گرا
است هر شی ء یک حالت و رفتار دارد و برنامه
عبارت است از بر هم کنش بین اشیاء . حالت یک
شی ء عبارت است از متغییرهای عناصر داده ای
شییء و مقدار آنها . رفتار یک شی ء را متدهای آن
تعیین می کند . شیء در واقع مقداری کد است که
کار خاصیتی انجام می دهد .
هر شیء کپسولی است از مقداری متغییر و کد که
کار نگهداری و به روز در آوردن آنها را ساده می
کند . معمولاً درون یک شیء از دسترس دنیای
خارج به دور است و برای کار با آن باید از ارسال
پیام استفاده کرد . مزیتش آن است که کاربر برای
کار با آن هیچ نیازی به دانستن مکانیزم های درونی
آن ندارد و فقط باید ساختار پیام ها را بداند . معمولاً
ساختار پیام ها در اشیاء مختلف یکسان است . در
دنیای واقعی هم وضع به همین منوال است مثلاً
برای استفاده از یک تلویزیون شما هیچ نیازی به
آشنایی با پیچیدگیهای درون آن ندارید فقط کافی
است بدانید که باید آن را به برق زده و روشن کنید
و یک کانال را انتخاب کنید . کلاس در واقع الگویی
است برای ایجاد شیء . در واسط برنامه نویسی
جاوا (java API) چندین کلاس مختلف وجود دارد .
چندین کلاس با هم یک کتابخانه کلاس Class Library
می سازند .
برنامه نویسی جاوا اصولاً چیزی نیست جز طراحی
و پیاده سازی کلاس ها .
برنامه نویسی شیء گرا در جاوا :
برنامه نویسی شیء (OOP) یکی از بزرگترین ایده
های برنامه نویسی در دو دهه اخیر است ، اما
تسلط کامل بر این ایده به سالها زمان و ممارست
نیاز دارد . برنامه نویسی شیء در واقع پیوند دنیای
واقعی با برنامه نویسی کامپیوتر است . در اینجا با
مفاهیم برنامه نویسی شیء گرا در جاوا ، و ارتباط
این مفاهیم با ساختار برنامه ها آشنا می شویم :
• شیء و کلاس چیست و رابطه آنها چگونه
است .
• یک شیء یا کلاس دو جزء مهم دارد : رفتار و
حالت .
• وراثت و نقش آن در طراحی برنامه ها .
• بسته ها و واسط ها در جاوا .
ایجاد یک کلاس :
در این قسمت یک مثال عملی خواهیم آورد . در
این مثال یک موتور سیکلت را شبیه سازی می
کنیم . یک موتور سیکلت واقعی دارای حالت و رفتار
خاص خود است . حالت موتور سیکلت در واقع
همان خواص آن ( مانند رنگ ، مدل ، نوع و ... )
است . مجموع این خواص یک موتور سیکلت خاص
را مشخص خواهند کرد که از موتور سیکلت های
دیگر قابل تمیز است . هر شیء وهله ایست از یک
کلاس . کلاس موجودی قابل لمس نیست ، در
حالیکه شیء موجودی است قابل لمس که به
کلاس خود موجودیت داده است . مثلاً ، انسان یک
کلاس است در حالیکه شما نمونه ای هستید از
کلاس انسان ، شما موجودیت دارید در حالیکه
چیزی بنام انسان وجود خارجی ندارد، بلکه در
اشیاء خاص ( من ، شما ، دیگران ) موجودیت می
یابد .
موتور سیکلت ما دارای رفتارهایی هم هست ،
رفتارهایی مانند روشن شدن ، خاموش شدن ،
تعویض دنده ، سرعت گرفتن ، ترمز کردن و غیره .
ادیتور خود را اجرا کنید و کلاس موتور سیکلت را
مانند ذیل تعریف کنید :
البته این کلاس هنوز کار چندانی انجام نمی دهد
( در واقع هیچ کاری انجام نمی دهد !) اجازه دهید
کارمان را با تعریف چند متغییر حالت ادامه دهیم ،
این تعریف ها را بعد از { وارد کنید :
نکته :
بر خلاف C ، متغییرهای Boolean فقط مقادیر True
یا False می گیرند و نمی توانند عدد بگیرند .
حال چند رفتار (متد ) به این کلاس اضافه می
کنیم .
گفتیم که یک موتور سیکلت می تواند رفتارهای
متعددی داشته باشد ولی ما در اینجا برای سادگی
کار فقط متد روشن شدن موتور را پیاده سازی
خواهیم کرد .
کد ذیل را بعد از تعریف متغییرهای حالت اضافه
کنید :
این متد ابتدا تست می کند که آیا موتور روشن
است (engineState= =True) ، اگر چنین باشد
فقط با پیامی این موضوع را گوشزد می کند . اگر
موتور روشن نباشد، آن را روشن کرده و پیام می
دهد که کارش را به پایان رسانده است .
کلاس را با نام Motorcycle.java ذخیره کنید . این
کلاس تا اینجا باید چنین باشد :
قبل از کامپایل کردن این کلاس ، اجازه دهید یک
متد دیگر به آن اضافه کنیم . این متد ShowArts ،
مقدار فعلی متغییرهای حالت یک وهله خاص از این
کلاس را نمایش خواهند داد . این متد چنین است :
این متد دو خط اطلاعات روی صفحه نمایش خواهد
داد .
خط اول رنگ و نوع موتور سیکلت ، و خط دوم حالت
موتور آن را نمایش می دهد .
فایل را ذخیره کرده و سپس آن را با javac کامپایل
کنید :
Javac Motorcycle.java
اگر سعی شود این کلاس را با اینترپرتر جاوا اجرا
کنید ، با خطا مواجه خواهید شد چون اینترپرتر
دنبال متدی بنام main() می گردد و چون آن را
نمی یابد پیام خطای ذیل را نمایش خواهد داد :
In class Motorcycle:void mail (string args
[])is not defined
برای آنکه این کلاس را عملیاتی کنیم باید یک
برنامه جاوا بنویسیم و در آن از این کلاس استفاده
کنیم .
اما روش ساده تر آن است که به این کلاس یک
متد main() اضافه کنیم . لیست زیر این متد را
نشان می دهد .
با اضافه کردن این متد ، کلاس Motorcycle اکنون
یک برنامه است و می توان آنرا کامپایل و اجرا کرد .
خروجی برنامه شبیه ذیل خواهد بود :

تحلیل برنامه :
چیزهایی که در متد ()main می بینید خط 1 تعریف
متد main() است و شما آن را همواره به همین
شکل خواهید دید . در خط 2 یک شیء از کلاس Motorcycle
بنام m تعریف شده است . توجه کنید که با کلاس
ها به طور منظم کاری صورت نمی گیرد بلکه یک
وهله از آنها ( یک شیء ) مورد استفاده قرار می
گیرد . در خطهای 3 و 4 متغییرهای حالت این
شییء ست می شوند : Yamaha RZ350 و رنگ
زرد . در خط های 5 و 6 متد ShowArts() فراخوانی
می شود ( در حقیقت فقط خط 6 فراخوانی این متد
است و خط 5 فقط پیامی است مبنی بر فراخوان
آن ) . این متد نوع ، رنگ و روشن یا خاموش بودن
شییء موتور سیکلت را نمایش خواهد داد . توجه
کنید که در ابتدا موتور خاموش است .
خط 7 یک خط رسم می کند که قسمتهای مختلف
خروجی را از هم جدا می کند و فقط برای شکیل تر
شدن برنامه است . در خط 9 با فراخوانی متد startEngine
موتور روشن می شود . خط 12 دوباره متد showArts() را فراخوانی کرده و مقدار متغییرهای
حالت را نمایش می دهد . در این لحظه موتور
روشن است .
خط 15 سعی می کند که موتور را دوباره روشن
کند ، ولی موتور قبلاً روشن شده است و پیام داده
شده هم موید همین مطلب است .
وراثت -Inheritance :
وراثت یکی از کلیدی ترین مفاهیم برنامه نویسی
شیء گراست و تاثیر مستقیمی روی نحوه طراحی
و نوشتن کلاس های جاوا دارد . وراثت مکانیزمی
است برای تغییر شکل دادن به کلاس ها و استفاده
مجدد از آنها ، با مکانیزم وراثت می توان به طور
خودکار از اطلاعات کلاس های دیگر استفاده کرد .
اصطلاح جدید ( وراثت تمام کلاسها را در یک
سلسله مراتب گرد آورده و مرتب می کند .) به
شکل زیر نگاه کنید .
هر کلاس یک فوق کلاس (Super class) ، و یک یا
چند زیر کلاس (Sub Class) دارد .
هر کلاس از کلاسهای بالاتر خود در این سلسله
مراتب ارث می برد و به کلاس پایین تر از خود ارث
می دهد . هر زیر کلاس تمام متدها و متغییرهای
فوق کلاس خود را به ارث می برد و دیگر نیازی به
تعریف مجدد آنها وجود ندارد .
بالاترین کلاس در سلسله مراتب کلاس های جاوا
کلاس Object است و تمام کلاسهای دیگر از این
کلاس مشتق می شوند . این کلاس تعیین کننده
کلی ترین متدها و خواص تمام کلاس های ذیل
خود است . معمولاً کلاس ها ضمن ارث بردن از
کلاسهای بالاتر از خود ، چیزهایی را به آن اضافه و
پیاده سازی می کنند .
ایجاد سلسله مراتب کلاس :
وقتی تعداد کلاس ها زیاد است ، منطقی است که
آنها را در یک سلسله مراتب گرد آوریم تا بتوانیم
نحوه به ارث رسیدن متدها و خواص را بهتر کنترل
کنیم . بدین ترتیب نیاز به دوباره نویسی کدها به
حداقل رسیده و هنگام نیاز به تغییر کدها نیز
اصلاحات فقط در یک نقطه انجام خواهد شد و از
آنجا به تمام نقاط دیگر دسترسی خواهند یافت .
اجازه دهید با استفاده از مثال Motorcycle موضوع
را روشنتر کنیم . دیدید که کلاس Motorcycle
چگونه طراحی شد ( و بخوبی کار کرد ). حال فرض
کنید بخواهیم کلاس جدیدی بنام Car ( اتومبیل )
بسازیم . موتور سیکلت و اتومبیل شباهتهای زیادی
با هم دارند . در نظر اول بنظر می رسد که بهتر
است کلاس Motorcycle را باز کنیم و اطلاعات
درون آن را به داخل کلاس جدیدی بنام Car کپی
کنیم . اما ایده بهتری هم وجود دارد و آن انتقال
اطلاعات مشترک این دو کلاس به یک کلاس کلی
تر است . با اینکه این روش کار بیشتری می طلبد
ولی توسعه آن و ایجاد کلاسهای جدیدتر ( مانند
دوچرخه ، کامیون و غیره ) را ساده تر خواهد کرد .
اجازه دهید با شروع از بالاترین کلاس جاوا در
سلسله مراتب کلاس ها ، یعنی کلاس Object ،
یک سلسله مراتب جدید بسازیم . کلی ترین
کلاسی که می تواند این دو وسیله نقلیه را در خود
جای دهد را کلاس Vehicle می نامیم . یک وسیله
نقلیه (Vehicle) چیزی است که می تواند فردی را
از نقطه ای به نقطه دیگر منتقل کند . در کلاس Vehicle
فقط رفتار انتقال از نقطه a به نقطه b را تعریف
خواهیم کرد و نه هیچ چیز بیشتر .
در ذیل کلاس Vehicle چه چیزی باید قرار دهیم ؟
مثلاً ماشین متحرک با نیروی انسانی و ماشین
متحرک با موتور چطور است ؟ ماشین متحرک با
نیروی انسان مثلاً می تواند پدال داشته باشد ( و
یا هر مکانیزمی برای انتقال حرکت انسان به
ماشین ). ماشین متحرک با موتور هم ( به احتمال
زیاد! ) یک موتور دارد ، به سوخت نیاز دارد و به
وسیله ای برای تنظیم سرعت . در ذیل کلاس Engine Powered Vehicle
می توانیم چند کلاس مثل Car ، Motorcycle و Truck
قرار دهیم . ولی می توانیم با ایجاد یک کلاس
بینایی باز هم رفتارها را تقسیم بندی کنیم .
بالاخره کلاس Motorcycle را در ذیل کلاس Two Wheeled
( دو چرخ ) قرار داده ایم . اما شاید
بپرسید که خواصی مثل رنگ و نوع را کجا باید قرار
داد ؟ می توان این خواص را در کلاس Vehicle قرار
داد تا تمام زیر کلاسها آنها را به ارث ببرند . تنها
چیزی که باید به خاطر داشته باشید این است که
وقتی یک حالت ( خاصیت ) یا رفتار را تعریف کردید
، دیگر به طور خودکار در سلسله مراتب به تمام زیر
کلاسها انتقال خواهد یافت ( به ارث خواهد
رسید ).
سلسله مراتب کلاس Vehicle
وسایل نقلیه دوچرخ و چهار چرخ

وراثت چگونه عمل می کند :
وراثت چگونه عمل می کند ؟ چگونه یک شیء
متغییرها و متدهای کلاس بالاتر را به طور خودکار
بدست می آورد ؟ در مورد متغییرها ، وقتی شییء
بوجود می آید یک مسیر دسترسی به تمام
متغییرهای کلاس مربوطه را بدست می آورد . در
مورد متدها هم وضع به همین منوال است و تعریف
یک متد در اختیار تمام زیر کلاسها قرار خواهند
گرفت . وقتی در یک شیء متدی فراخوانی می
شود ، جاوا ابتدا در همان کلاسی که متد تعریف
شده به دنبال کد آن می گردد . اگر کد آن را نیافت
، در سلسله مراتب یک پله بالاتر رفته و در فوق کلاس بدنبال آن خواهد گشت تا زمانیکه کد متد را بیابند . به شکل زیر نگاه کنید .
نحوه تعیین محل متدها
وقتی در یک زیر کلاس متدی با نام مشابه متدی در
یک کلاس بالاتر تعریف شود، کارها کمی پیچیده
خواهد شد . در این حالت متدی که زودتر ( در
حرکت از پایین ) یافت شود اجرا خواهد شد . بدین
ترتیب متد تعریف شده در زیر کلاس متد فوق کلاس
را مخفی می کند . به این وضعیت تحریف (Override
) متد گفته می شود . شکل زیر را ببینید .
تحریف متدها
اصطلاح جدید :
به تعریف یک متد با نام مشابه متدی در یک فوق
کلاس ، تحریف می شود . متد زیر کلاس متد فوق
کلاس را مخفی می کند .
وراثت منفرد و چند گانه :
جاوا به گونه ای که دیدید از وراثت منفرد Single
استفاده می کند . وراثت منفرد یعنی هر کلاس
جاوا می تواند فقط یک فوق کلاس داشته باشد .
اما عکس آن درست نیست ، یعنی یک کلاس می
تواند چندین زیر کلاس داشته باشد .
در زبانهای شیء گرای دیگر ، مانند C++ ، یک
کلاس می تواند از چند فوق کلاس به ارث ببرد . به
این وضعیت وراثت چند گانه (Multiple) گفته می
شود . با وراثت چند گانه می توان کلاس های فوق
العاده جالبی بوجود آورد ، ولی کد نویسی آنها
بسیار دشوار است .
واسط ها -Interfaces و بسته ها -Packages :
دیدید که در جاوا هر کلاس فقط از یک فوق کلاس
ارث می برد . با اینکه وراثت منفرد برنامه نویسی را
ساده تر می کند ولی کمی محدودتر هم هست .
مثلاً ، اگر در شاخه های مختلف یک سلسله
مراتب متدهای مشابهی داشته باشید ، باید تمام
آنها را جداگانه پیاده سازی کنید . جاوا با استفاده
از مفهومی بنام واسط مشکل به اشتراک گذاشتن
متدها را حل کرده است .
توضیح :
واسط عبارت است از مجموعه ی نام چند متد ،
بدون تعریف آنها ، که واسط آنها در اختیار کلاس
استفاده کننده می گذارد .
یک کلاس جاوا می تواند در آن واحد از چندین
واسط استفاده کند ، و با این کار کلاس های بسیار
متفاوت می توانند رفتارهای مشابهی داشته
باشند .
در جاوا کلاس و واسط های مرتبط با هم در یک
بسته گرد آورده می شوند . کلاس های اصلی جاوا
در بسته ای بنام java گرد آورده شده اند و فقط
محتویات این بسته است که در تمام نسخه های
جاوا ثابت می ماند .
البته در بسته Java بسته های دیگری وجود دارند
ولی بسته Java.lang به طور پیش فرض در اختیار
تمام برنامه هاست . برای استفاده از بسته های
دیگر باید آنها را به طور صریح تعریف کرد . نام بسته
ها و کلاس ها در هنگام تعریف با نقطه (.) از هم
جدا می شوند . مثلاً برای استفاده از کلاس Color
که در بسته awt ( که خود در داخل بسته Java
می باشد ) قرار دارد ، باید چنین نوشت : java.awt.Color.
ایجاد یک زیر کلاس :
چگونه می توان یک زیر کلاس ساخت و چند متد را
در آن تحریف کرد . در این مثال با بسته ها هم
بیشتر آشنا خواهید شد .
فرض کنید می خواهید یک اپلت بوجود آورید . تمام
اپلت ها در جاوا زیر کلاس کلاسی بنام Applet
هستند ( که در بسته java.applet قرار دارد ) . با
ایجاد یک زیر کلاس از کلاس Applet می توانیم
تمام رفتارهای آن ( از قبیل کار با پنجره ها ، ارتباط
با سیستم و پاسخ به رویدادهای Keyboard و Mouse
را به ارث ببریم . در این مثال یک اپلت شبیه اپلت Hello World
خواهیم ساخت که این عبارات را با رنگ و اندازه
دیگری نمایش خواهد داد . ابتدا یک کلاس تعریف
می کنیم :
در اینجا کلاسی بنام HelloAgainApplet تعریف
شده است ، به قسمت extends… دقت کنید ، در
حقیقت این عبارت است که می گوید اپلت شما
یک زیر کلاس از کلاس Applet خواهد بود . به
مسیر کامل کلاس Applet دقت کنید ، چون این
بسته بطور پیش فرض برای جاوا تعریف نشده ،
باید مسیر کامل آن ذکر شود . کلمه Public می
گوید که این کلاس در اختیار تمام سیستم قرار
خواهد داشت . تا اینجا کلاس ما تمام متغییرها و
متدهایش را از کلاس بالاتر (Applet) به ارث برده و
کاملاً شبیه آن است . اجازه دهید فونت آن را عوض
کنیم :
در اینجا f متغییری است از کلاس Font که جزء
بسته java.awt است . با تعریف فوق فونت
سیستم از نوع TimesRoman ضخیم و با اندازه 36
خواهد شد . با استفاده از شییء فونت می توان
فونت اپلت را تغییر داد .
حال باید متدی تعریف کرد تا از این فونت استفاده
کند . متدی که عبارات را روی صفحه نمایش می
دهد متد paint() است که در اینجا آن را تعریف
خواهیم کرد تا عبارت Hello World با فونت جدید
رسم شود .
تعریف جدید متد مزبور چنین است :
در اینجا به دو نکته باید توجه کنید . اول اینکه این
متد Public است چون متدی که هم نام آن است
خود Public است . وقتی می خواهید متدی را
تحریف کنید باید میدان دید (Scope) آن مانند متد
فوق کلاس متناظرش باشد ، دوم اینکه ، متد Paint
() یک آرگومان ورودی ، که یک شیء از کلاس Graphics
است ، دارد . این کلاس یک روش مستقل از
سخت افزار برای عملیات گرافیکی است .
در متد Paint() سه کار انجام داده ایم :
• گفته شده که شیء گرافیکی از فونت f استفاده
کند .
• گفته شده که رنگ رسم عبارت رنگ قرمز (Color.red) است .
• در پایان هر عبارت “Hello Again” در نقطه (5,25)
رسم می شود .
کلاس جدید به همین راحتی تعریف شد ! اپلت ما
تا این جا باید مانند ذیل باشد :
اما مثال ما یک اشتباه دارد . اگر نمی توانید حدس
بزنید که این اشتباه چیست ، اپلت را کامپایل کنید .
کامپایلر با پیغام ذیل کارش را متوقف خواهد کرد :
این پیغام خطا برای چیست ؟ به یاد دارید که بسته
پیش فرض java بسته java.lang است ولی شما
در خط اول تعریف کلاس از بسته java.applet استفاده کرده اید . اما می بینید که کامپایلر از این
خط خطا نگرفته است چون مسیر کامل بسته را قید کرده ایم . یک راه حل برای رهایی از این قبیل مشکلات آن است که مسیر کامل تمام کلاسها را قید کنیم . اما اگر در یک اپلت بدفعات از یک یا چند کلاس استفاده کنیم ، هر بار نوشتن نام کامل مسیر کلاس ها بسیار خسته کننده و وقت گیر خواهد بود . در این موارد بهتر است از دستور import استفاده کنیم . در اپلت فوق از سه کلاس (Color , Font , Graphics) استفاده کرده ایم که همگی در بسته java.awt قرار دارند . بنابراین ، دستورات ذیل را به اول برنامه ، قبل از تعریف کلاس ، اضافه کنید :
نکته :
با استفاده از یک ستاره (*) می توان تمام کلاس های Public یک بسته را مورد استفاده قرار داد ، مانند ذیل :
حال که کلاس را تصحیح کردیم ، می توانیم اپلت Hello Again Applet را کامپایل کنیم . برای تست این اپلت ، فایل HTML جدیدی مانند ذیل بسازید :
این فایل را با نام HelloAgainApplet.html ذخیره کرده و آن را در یک کاوشگر مجهز به جاوا اجرا کنید .
یکی از سخت ترین جنبه های تسلط بر برنامه نویسی شییء گرا درک همین مفاهیم ( عجیب و غریب ) آن است .
در اینجا مرور مجددی بر این مفاهیم خواهیم داشت .
• کلاس : الگویی برای اشیاء که در آن رفتار و خواص شییء تعریف نشده اند .
• شییء: یک نمونه قابل لمس از یک کلاس از یک روی کلاس می توان چند شییء بوجود آورد که هر کدام رفتار و خواص خود را دارند .
• وهله : هر شییء یک وهله است از یک کلاس .
• فوق کلاس : کلاسی که به زیر کلاس هایش ارث می دهد .
• زیر کلاس : کلاسی که از والدینش ارث می برد .
• متد کلاس : متدی که در یک کلاس تعریف می شود .
نوشته شده توسط مانی در جمعه دوازدهم بهمن 1386 و ساعت 17:34