مقدمه
شرکت همراه نرم افزار نوین به عنوان اولین شرکت تولید کننده نرم افزار تلفن همراه نزدیک به 3 سال است در این زمینه فعالیت خود را آغاز نموده که نتیجه آن فارسی ساز رابط کاربر تلفن های سری 60 نوکیا و همچنین تولید برنامه ای جهت مدیریت های شخصی بر اساس تاریخ شمسی بوده است.
با توجه به امکانات قابل توجه تلفن های همراه جدید به موازات موارد فوق این شرکت اقدام به تولید نرم افزار های دیگری نظیر قرآن،مفاتیح الجنان اذان،مناسک حج،بانک اطلاعات مشاغل و… نموده است به دلیل پیشرو بودن در این زمینه این شرکت بخش قابل توجهی از منابع خود را به امور تحقیقات و ارائه راهکارهای جدید برای استفاده بهتر از تلفن های همراه اختصاص داده است.
من به مدت 240 ساعت در شرکت همراه نرم افزار نوین مشغول به کار شدم. هدف از این کار :
بمنظور آشنایی با محیط کاری و اینکه آنچه راکه در مدت کاردانی به صورت تئوری وتاحدودی عملی آموخته ام در جامعه کاری به صورت کاربردی از آن استفاده کنم و بکار گیرم.
این شرکت مجموعاً به چند بخش عمده تقسیم بندی شده است که شامل:
1- بخش تولید
2- بخش اداری- پرسنلی
3- بخش تبلیغات
4- بخش فروش
5- بخش خدمات پس از فروش
من در ابتدا مدتی در بخش فروش مشغول به کار شدم. نفرات متعددی در این بخش کار میکردند از جمله: مدیر بازاریابی و فروش – سرپرست فروش- سوپروایزر تهران و سوپروایزر شهرستانها. باشند
در این واحد نرم افزارهایی که توسط بخش تولید،تهیه و تایید شده و بارکد خورده باشند به فروش می رسد. این شرکت کاملاً به صورت مکانیزه عمل می کند.
هر نرم افزار در سایت این شرکت به صورت رایگان دانلود میشود اما برای اجرای آن باید مبلغی را به حساب شرکت مذکور واریز کنند، بعد از تایید واریز وجه کد فعال سازی به تعداد نرم افزار هایی که مشتری یا مشتریان خریداری می کنند در اختیار آنها قرار می گیرد و هر مشتری برای فعال سازی آن برنامه به صورت خودکار هنگامی که برنامه ها را فعال میکند اطلاعات او در سرور های شرکت ثبت و نگهداری می شود که البته قابل ذکر است که بخش(اتاق) سرور ها کاملاً ایزوله شده و هیچکس جز مسئول مربوطه اجازه دسترسی به آنها را ندارد.
سوپروایزر شهرستانها هم به امور نماینده ها در سراسر ایران نظارت میکند و به مشتری های شهرستانی شرکت خدمات می رساند.
بعد از آن مدتی در قسمت خدمات پس از فروش مشغول به کار شدم،این قسمت بسیار جالب بود چون تمام کاربران از اقسا نقات ایران و حتی خارج از ایران تماس گرفته و مشکلاتی که برای آنها از نسب برنامه گرفته تا مشکلاتی که هنگام نسب یا بعد از نسب نرم افزار پیش می آمد صحبت می کردند.
می توان گفت این قسمت یعنی همان بخش خدمات پس از فروش به نوعی قلب این شرکت میباشد و محبوبیت این شرکت در بین کاربران و حتی نمایندگان خود به دلیل خدمات نامحدود آن است و بدون اینکه وجهی دریافت کند تا مادامی که از آن نرم افزار استفاده می شود خدمات رایگان در اختیار آن کاربر گذاشته می شود.کاربران اغلب بصورت تماس تلفنی مشکلاتشان را مطرح کرده و مسئولین فنی و اپراتورها به آنها پاسخ میدهند تا مشکلات آنها را برطرف کنند و اگر مشکل آنها خیلی حاد بود به شرکت مراجعه میکنند ولی اکثراً با یک تماس مشکل برطرف میشود.در این بخش تمام خدمات به صورت رایگان در اختیار کاربران قرار میگیرد.
خدماتی که این بخش در اختیار یوزرهای خود میگذارد شامل :
1- نسب نرم افزار در کوتاهترین مدت ممکن
نکته:البته قابل ذکر است که تمام نرم افزارها به صورت پکیج به بازار عرضه شده که هرکدام از پکیج ها شامل: دفترچه راهنمای نسب و کد فعال سازی میباشد که با خواندن آن دفترچه به راحتی مراحل نسب انجام میشود. در این صورت حتی اگر کاربر نتواند این کار را انجام دهد مسئولین این بخش باکمال رضایت این خدمات را در اختیار کاربران
می گذارند.
2- چک کردن سرورها که حتی برای یک ثانیه هم متوقف نشوند.چون اگر چنین مسئله ای پیش بیاید در سراسر ایران فروشندگان و نمایندگان وعاملین فروش و موبایل فروشی ها کارشان مختل میگردد.
3- پاسخ گویی به مشتریانی که تماس تلفنی گرفته و میخواهند به صورت شنیداری و به کمک راهنمایی های اپراتور مشکلات خود را در زمینه ی نصب کردن برطرف نمایند.
4- حفاظت از سرورها کار کاملاً خطیری است که به این بخش محول شده و باید از نظر Security کاملاً واقب باشند که به هیچ یک از کدهای داخل سرور کوچکترین خدشه ای وارد نشود و تغییر و جابجایی در آنها صورت نگیرد.
5- نمایندگان استانها و شهرستانها که تماس میگیرند تا ببینند چه تعداد از کدهای آنها مصرف شده و چه تعداد از کدها باقی مانده است.مثلاً اگر کسی از مقررات سرپیچی کرده باشد(یعنی قانون کپی رایت را نادیده گرفته باشد)سریعاً باگزارشی که به این بخش میشود جلوی آن کد را گرفته و کد مذبور بلاک میشود تا فرد متخلف نتواند از آن برنامه استفاده کند بدین صورت که کد آنرا میسوزانند و اگر کاربر خطا کار بخواهد از آن استفاده کند پیغام :
" این کد فاقد اعتبار است" را نشان میدهد که این کار یکی از شاخص های شرکت است که هیچ یک از شرکتهای ایرانی تولید کننده نرم افزار به این مسئله توجه نکردند و بعد از مدت کوتاهی تمام نرم افزارهایی که آنها زحمات فراوانی برای تولید آن می کشند سریعاً هک میشود ولی تاکنون با گذشت پنج سال از تولیدات نرم افزارهای این شرکت هنوز هیچکس نتوانسته حتی یک نسخه را هم هک کند.
بخش بعدی مربوط به بخش تولید است که در آنجا دوگروه مشغول به فعالیت میباشند:
گروه اولProgramer ها هستند که استراکچرها و برنامه ها را مینویسند وبا برنامه های متعددی کار میکنند از جمله: C++ و java که در قسمت های بعدی به توضیح جامع و کاملتری از نرم افزار جاوا میپردازم.
گروه دوم Data intry ها هستند یعنی،افرادی که با نرم افزارها و ابزارهایی که توسط برنامه نویسان طراحی و ساخته شده است کار میکنند
که اطلاعات را وارد کرده و ایراد یابی میکنند تا در نهایت تایید شده و به مرحله بهره برداری برسد باید در نظر داشت که حتی کوچکترین خطا و اشتباه منجر به مشکلات بزرگی خواهد شد. این بخش نقش کلیدی و حیاتی را در تهیه برنامه ایفا میکند.
در قسمت ضمائم نیز چند نمونه از نرم افزارهای تولید شده توسط این شرکت و قابلیت های آنها را توضیح داده ام .
توضیحات ذکر شده مختصری از شرح کارآموزی من در این شرکت بود و من در طی این مدت با چگونگی عملکرد نرم افزار جاوا که یکی از نرم افزار های مورد استفاده در این شرکت بود تا حدودی آشنا شدم که در زیر به شرح قسمت هایی از آن پرداخته ام:
جاوا
جاوا یک زبان برنامه نویسی است که در اوایل دهه 90 توسط جاوا سافت، بخش نرم افزاری شرکت سان، توسعه داده شد. هدف آن بود که جاوا زبانی ساده، فوی و همه منظوره باشد. جاواتمام جنبه های مثبت C و C++را در خوددارد، و آن چیزهایی که برنامه نویسان از آن نفرت داشته اند ( مانند وراثت چند گانه، تحریف اپراتورها و اشاره گرها) را به کناری گذاشته است.
مهمترین ویژگی جاوا این است که اساساً شییء گر است. اولین ادعای oppتوانایی استفاده مجدد از کد است؛ چیزی که C++ با تمام ادعاهایش هرگز نتوانست بدان دست بابد، اما در اولین قدم خواهید دید که ادعای جاوا در این زمینه تا چه اندازه صحت دارد. تصورش را بکنید که با صرف کمی وقت بتوانید برنامه ای بنویسید که در سیستم های ویندوز، یونیکس و مکینتاش براحتی اجرا شود! همین که یک شرکت نرم افزاری بتواند برای تمام پلاتفرم های موجود در آن واحد پروژه ای را تولید کند ( و مقادیر عظیمی پول صرفه جویی کند) خود می تواند بهترین دلیل اقبال جاوا باشد . و امروزه دیگر همه ( و نه فقط شرکتهای نرم افزاری) به سمت جاوا کشیده شده اند.
با این ویژگی ( استقلال از پلاتفرم) یک برنامه نویس می تواند برای سیستمی برنامه بنویسید که هرگز با آن کار نکرده است. این ویژگی اصلی ترین علت توفیق جاوا در اینترنت است. اینترنت شبکه پچیده ای است از میلیونها کامپیوتر مختلف در سراسر دنیا، و مقاومت در مقابل این وسوسه که بتوانید برنامه ای بنویسید که روی تمام این سیستم های متفاوت و نامتجانس اجرا شود چندان ساده نیست.
جاوا یک زبان بسیار ساده است چون شما را وادار نمی کند تا در محیط جدید ( و ناآشنایی) کار کنید و این برای کسانی که اطلاعات فنی ناچیزی درباره کامپیوتر دارند بسیار مهم است . ساختار زبان جاوا در نگاه اول بسیار شبیه C و C++ است و این به هیچ وجه تصادفی نیست . C زببانی است ساخت یافته و C++ زبانیست شیی ء گرا ، و مهمتر از همه قسمت اعظم برنامه نویسان دنیا از آنها استفاده می کنند. از سوی دیگر این شباهت حرکت به طرف جاوا از برای این قبیل افراد ساده خواهد کرد بنابراین طراحان جاوا برای اجتناب از دوباره کاری از زبانهای C وC++ بعنوان مدل استفاده کردند. ( و آیا این خود به تنهایی نشانه نبوغ طراحان جاوا نیست؟) .
جاوا با دور انداختن اشاره گرها و بر دوش کشیدن بار مدیریت حافظه، برنامه نویسانC++ /C را برای همیشه از این کابوس ها رهایی بخشیده است. علاوه برآن، چون جاوا زبانی برای اینترنت است، از ایمنی و حفاظت ذاتی بالایی برخودار است. طراحان حاوا از ابتدا یک محیط برنامه نویسی امن را مد نظر داشته اند. مسئله حفاظت سیستم ها رابطه تنگاتنگی با اشاره گرها دارد؛ اکثر مهاجمان برای ورودی غیر قانونی به جاوا مکانیزم های حفاظتی دیگری هم دارد که در جای خود به آنها اشاره خواهیم کرد.
برای آشنایی بیشتر با جاوا بهتر است نگاه مختصری به تاریخچه آن بیندازیم. اما چون جاوا رابطه تنگاتنگی با اینترنت دارد، آوردن تاریخچه ای از اینترنت و وب خالی از فایده نیست.
تاریخچه مختصر اینترنت وب
اینترنت به عنوان یک پروژه دولتی ایالات متحده امریکا در سال 1969 بدنیا آمد. این پروژه ، که درابتدا آرپانت (arpanet) نام داشت. فقط چهار کامپیوتر را در نقاط مختلف ایالات متحده به هم متصل می کرد. آرپانت بتدریج رشد کردو در سال 1972 پنجاه دانشگاه و مرکز تحقیقاتی نظامی در آن فعال بودند. در اواخر دهه 1980 متجاوز از هشتاد هزار کامپیوتر در این شبکه عظیم به هم متصل شده بودند. این کامپیوترها خود به دستجات ( شبکه های) کوچکتری تقسیم شده بوددند و شبکه شبکه ها ( یا اینترنت) آنها را به یکدیگر متصل می کرد. در تمام این مدت اینترنت ملک اختصاصی محققان و دانشگاهیان بود و با آن که شرکتهای خصوصی هم می توانستند به آن دسترسی داشته باشند ولی سیاست حاکم بر آن مانع استفاده تجاری از اینترنت شده بود. در سال 1991 با حذف ممنوعیت تجارت در اینترنت اوضاع دگرگون شد؛ ولی کماکان محدوده تجارت و تحقیق از هم جدا بود. از همین نقطه بود که رشد انفجاری اینترنت شروع شد به طوری که هم اکنون نزدیک به 100 میلیون کاربر در این شبکه عضویت دارند و اینترنت به تمام زاویای زندگی رسوخ کرده است.
با آن که اینترنت چندان جوان نیست اما از تولد وب ( یا شبکه تار عنکبوتی جهانی، World Wide Wed-WWW) زمان زیادی نمی گذرد. وب در سال 1989 در آزمایشگاه اروپایی فیزیک ذرات (CERN) متولد شد. وب حاصل زحمات تیم برنرز – لی_(tim berners-lee) بود که تلاش داشت تا فیزیکدانان سراسر دنیا بتواند اطلاعات خود را در شبکه اینترنت و به صورت اَبَرمتن(hypertext) با هم در در میان بگذرند . وی براساس زبان عمومی علامتگذاری استاندارد SGML یک زبان جدید بنام زبان علامتگذاری اَبَرمتن HTML بوجود آورد. برای انتقال اسناد HTMLهم یک پروتکل جدید ابداع شد که پروتکل انتقال اَبرمتن HTTPنام گرفت. این پروتکل وسیله ای بود برای جستجو، یافتن، بازیابی و نمایش سریع اسناد. با استفاده از ابرمتن می توان در شبکه ای از منابع، با برنامه ای بنام کاوشگر BROWSER بدنبال اسنادی با ویژگیهای خاص کاوش کرد. چون اولین کاوشگر فقط می توانست متون را نمایش دهد با اقبال کمی مواجه شد. در حقیقت درسال 1993 فقط پنجاه پایگاه وب در تمام دنیا وجود داشت. شروع محبوبیت وب ورشد برق آسای آن با ورود کاوشگر گرافیکی موزائیک MOSAIC همراه بود. این کاوشگر در NCSA ( مرکز ملی کاربردهای سوپر کامپیوتر) توسعه داده شد. امروزه در دنیا دهها کاوشگر گرافیکی و متجاوز از یکصد هزار پایگاه وب وجوددارد. موفقیت موزائیک باعث شد تا عده ای از محققان NCSA شرکت نت اسکیپ NETSCAPE را تاسیس کنند و این همان شرکتی است که معروفترین کاوشگر وب یعنی NetsCape Navigator را تولید کرده است. کاوشگر نت اسکیپ علاوه بر HTML قابلیت های متعددی در زمینه مالتی مدیا دارد که باعث تسریع در روند رشد اینترنت و وب شده است.
اما سال 1995 یکی از مهمترین سالها در تاریخ اینترنت و وب است: در این سال بود که میکروسافت ویدئوی اینترنتی را توسعه داد و صوت را تبدیل به یکی از اجزاء تفکیک ناپذیر اسناد ابرمتن کرد؛ نت اسکیپ با افزودن قابلیت های بی شمار به کاوشگر خود همه را شگفت زده کرد؛ اولین ویرایش زبان مدلسازی واقعیت مجازی VRML به بازار آمده و سان جاوا را در یک سینی طلایی بدنیا عرضه کرد.
توسعه دهندگان وب با جاو ابزاری را یافتند که باآن می توانستند صفحات تعاملی مالتی مدیا در اینترنت بوجود آورند و این نقطه عطف جدیدی در تاریخچه اینترنت به شمار می آید.
تکامل جاوا
جاوا هم مانند اکثر اختراعات مهم حاصل تلاش گروهی دانشمند پیشتاز است. اما نکته جالب درباره جاوا آن است که جاوا از ویرانه های یک پروژه شکست خورده سر برآورد . اگر پروژه گرین Greenکه شرکت سان در سال 1991 آن را شروع کرد به موفقیت می انجامد امروز نه سان دیگر یک شرکت کامپیوتری می بود و نه جاوا متولد می شد.
در سال 1991، شرکت سان میکروسیستمز در آغاز راه تبدیل شدن به بزرگترین تولید کننده ایستگاههای کاری یونیکس بود و در طول فقط پنج سال در آمدش را از 210 میلیون دلار به 5/2 میلیارد دلار رسانده بود و بنظر می رسد هیچ چیز نمی تواند جلودار آن باشد. عامل عمده موفقیت سان کارهای پیشتازانه اش در ایجاد شبکه های باز بود و در این زمینه هیچ کس به پای آن نمی رسید.
مدیران سان به این فکر افتادند تا کاری کنند که این رشد برای مدتی طولانی ادامه یابد. یکی از زمینه های مورد علاقه سان بازار لوازم الکترونیکی بود؛ پروژه گرین بوجود آمد تا برای این بازار نرم افزاری پیشرفته خلق کند. مهندسان سان توجه خود را به میکروپروسسورهایی معطوف کردند که دارای قابلیت استفاده در این گونه سیستم ها باشند. اگر پروژه گرین می خواست موفق باشد باید کاری می کرد تا سیستم مزبور بتواند براحتی به بسترهای سخت افزاری مختلف منتقل شود. برای این منظور ابتدا از کامپایلر C++ استفاده شد ولی بزودی نارسایی هایC++ در این زمینه خود را نشان دادند. مهندسان سان خیلی سریع دریافتند که برای ادامه کار باید چیزی جدید و قوی خلق کنند. در همین زمان بود که جیمز گاسلینگ کار بر روی زبان جدید اوکOak را شروع کرد . تقدیرآن بود که این زبان جاواJava نامیده شود، چون اداره ثبت نام های تجاری نام اوک را رد کرده بود.
بتدریج مهندسین یک دستگاه شبه PDA ساختند که در آن از سیستم عامل ، زبان برنامه نویسی و واسط کاربر جاوا استفاده شده بود و با وجود ابتدایی بودن توانست توجه مدیران سان را به خود جلب کند. بعدها گروهی که در پروژه گرین کار کرده بودند شرکت جاواسافت را بنیان نهادند.
متاسفانه بخت با پروژه گرین یار نبود و بعد از چند شکست متوالی، سان آن را کنار گذاشت. در همین زمان بود که عده ای از محققان NCSA شرکت نت اسکیپ را تاسیس کردند و این اتفاقات با آتشی که به سرعت دنیا را در می نوردید و شبکه تار عنکبوتی جهانی Wwwنام داشت همزمان شد. بنابراین اتفاقی نبود که مهندسان پروژه گرین به سمت اینترنت و وب به عنوان بستر پروژه سان جلب شوند. بعد از آن دیگر جزء تاریخ است، چهار سال بعد پروژه گرین به بار نشست و جاوا تبدیل به داغترین موضوع اینترنت شد: همه، از برنامه نویسان و طراحان صفحات وب گرفته تا کاربران اینترنت، می خواهند از جاوا استفاده کنند.
سان بلافاصله برای جاوا یک کاوشگر هم تولید کرد. این اولین کاوشگری بود که می توانست اپلت های جاوا را اجرا کند و نام آن هم هات جاواHotJava بود.
ویژگی های زبان برنامه نویسی جاوا
جاوا ویژگیهای متعددی دارد که آن را منحصر به فرد کرده است. جاوا هم کامپایلر دارد و هم اینترپرتر. ( توضیح: کامپایلر برنامه ای است که متن برنامه را گرفته و در پایان یک فایلexe تولید می کند. بعد از کامپایل شدن یک برنامه، دیگر به وجود کامپایلر نیازی نیست و می توان برنامه exe را روی هر کامپیوتر سازگاری اجرا کرد. اما اینترپرتر هیچ برنامه exe ای تولید نمی کند و برنامه را خط به خط اجرا می کند. برای اجرای برنامه حتماً باید اینترپرتر هم روی کامپیوتر مورد نظر موجود باشد). هر کامپایلر فقط برای یک سیستم خاص ( مانند اینتل، اپل یا آلفا) می تواند کد اجرایی تولید کند. اما کامپایلر جاوا کد اجراییexe تولید نمی کند و در عوض یک فایل بینابینی می سازد که بایت کد نام دارد. بایت کد چیزی شبیه زبان اسمبلی است، اما این زبان مختص هیچ پروسسور خاصی نیست بلکه زبان اسمبلی یک ماشین ویژه به نام ماشین مجازی جاوا jvm است. در هنگام اجرای چنین برنامه ای اینترپرتر زمان اجرای جاوا ، که روی ماشین مجازی جاوا اجرا می شود، دستورات فایل بایت کد را به دستورات قابل فهم برای پروسسوری که روی آن اجرا می شود تبدیل خواهد کرد.
اماشاید از خود سوال کنید که چرا جاوا این همه کار را بر خود( و دیگران) سخت گرفته است؟ این همه لایه و ماشین مجازی برای چیست؟ یکی از بزرگترین ادعاهای جاوا آزاد بودن از بستر سخت افزاری است. اما ، این یعنی چه؟ اگر جاوا بخواهد در اینترنت موفق باشد برنامه های آن باید بتوانند بدون هیچ اشکالی روی تمام کامپیوترهای متصل به اینترنت اجرا شود، اما شما بهتر می دانید که اینترنت شبکه عظیمی است از کامپیوترهای نامتجانس، از سوپر کامپیوترهای عظیم گرفته تا PC های مبتنی بر پروسسورهای اینتل و پاورپی سی تا ماشین های یونیکس مبتنی بر پروسسورهای آلفا و …! چگونه یک برنامه اجرایی می تواند روی این طیف وسیع کامپیوترها اجرا شود؟ ایده اولیه ساده است: برنامه ها برای یک ماشین مجازی کامپایل شوند و این ماشین مجازی روی تمام کامپیوترهای متصل به اینترنت نصب شود. این دقیقاً همان روشی است که جاوا در پیش گرفته است. برنامه تان را با یک کامپایلر جاوا کامپایل کنید؛ آن را در پایگاه وب خود قرار دهید و به دیگران اطلاع دهید تا با یک کاوشگر مجهز به جاوا این برنامه را ( که ممکن است در دل یک صفحه وب قرار داشته باشد) اجرا کنند. شاید هرگز تصور نمی کردید که برنامه ای را که با یک PCاینتل نوشته اید روی یک ماشین مکینتاش یا یونیکس اجرا شود، ولی اکنون به لطف جاوا این دیگر آرزویی دست نیافتنی نیست.
با آن که C و C++ بدون شک زبانهایی بسیار قدرتمندی هستند اما اشکالاتی ذاتی دارند که شاید هرگز نتواند از آن رهایی یابند. عمده ترین این اشکالات در مدیریت حافظه و اشاره گرهای آنها است. برای اکثر برنامه نویسانC++ /C مدیریت حافظه و اشاره گرها یک کابوس واقعی است. با آن که جاوا بدلیل محبوبیت فوق العاده C++ ظاهری شبیه آن دارند ولی در جاوا مدیریت حافظه به طور خودکار انجام می شود و اشاه گر هم اساساً در جاوا آرایه ها عضوی از یک کلاس هستند که تمام مشکلات کار با آرایه را از دوش برنامه نویس بر می دارد. جاوا در زمینه بهینه کردن استفاده از حافظه بسیار قویتراز اسلافش است، یکی از ویژگیهای جاوا پاکسازی خود کار حافظه از چیزهای بی مصرف است. ( این برنامه نام بامسمای آشغال جمع کن gc را دارد!) .
شیئ گرایی در جاوا به غایت خود رسیده است. جاوا در استفاده از اشیاء بسیار مفید و سخت گیر است و تخطی از اصول را نمی پذیرد. در C++ شما می توانید از اشیاء به موازات برنامه نویسی به سبک قدیم استفاده کنید و اکثراً در پایان کار چنان ملغمه ای بوجود می آید که مدیریت آن نه با روش های برنامه نویسی شیئ ء گرا امکان دارد نه با روش های قدیمی. جاوا دیگر به شما اجازه نمی دهد تا خود را در چنین مخمصه ای گرفتار کنید!
شروع برنامه نویسی با جاوا
اولین برنامه ای که می نویسم یک برنامه متکی به خود است بنامhello worldتفاوت یک برنامه متکی به خود و یک اپلت آن است که در برنامه متکی به خود ( که ازاین به بعد به آن فقط برنامه خواهیم گفت) از متدی بنام main() استفاده می شود در حالیکه اپلت چنین متدی ندارد.
برنامه helloworld بسیار ساده است و فقط جمله"Hello World!" را نمایش می دهد. با این حال، از آن می توان به عنوان سنگ بنای برنامه های پیشرفته تر استفاده کرد چون تمام برنامه های جاوا ساختار کلی مشابهی دارند .
class Helloworld{
public static void main(string args[]) {
system.out.println("hello world!");
}
}
این برنامه پنج خطی دارای تمام ویژگیهای یک برنامه کامل و مفصل شیئ گرا است .
نکته: برای نوشتن برنامه های جاوا از هر ادیتوری که خروجیASCII تولید کند می توانید استفاده کنید.
برنامه را با نام helloworld.java ذخیره کنید . نام برنامه باید همان نام کلاس برنامه باشد.
این برنامه دو قسمت مهم دارد:
-تمام برنامه در واقع یک تعریف کلاس است.
-کل برنامه در متد main() قرار دارد.
برای کامپایل کردن برنامه باید از کامپایلر جاوا Javac استفاده کرد . روش کار چنین است: javac helloworld.java نکته : در تمام این کتاب از کامپایلر سان، که با JDKمی آید، استفاده کرده ایم، اگر شما از کامپایلر دیگری استفاده می کنید به مستندات آن مراجعه کنید.
کامپایلر بعد از پایان کار یک فایل کلاس بنام helloworld.class تولید خواهید کرد. اصولاً کامپایلر برای هر کلاس برنامه یک فایل کلاس جداگانه تولید خواهد کرد. فایل تولید شده یک فایل اجرایی مستقل نیست. برای اجرای فایل باید از اینترپرتر جاوا استفاده کرد. اینتر پرتر جاوا ، java نام دارد. برای اجرای فایل کلاس تولید شده چنین کنید: Java heloworld اگر همه چیز درست پیش رفته باشد، جمله "hello world" را روی صفحه کامپیوتر خود مشاهده می کنید.
نکته: دقت کنید که کامپایلر جاواو ینتر پرتر جاوا دو چیز متفاوتند. کامپایلر از فایل متن برنامه یک فایل کلاس می سازد و اینتر پرتر فایل کلاس را اجرا می کند.
ایجاد یک اپلت جاوا
ایجاد اپلت با ایجادبرنامه فرق دارد و قواعد متفاوتی بر آن حکمفرماست، یک اپلت برای اجرا در صفحات وب نوشته می شود بنابراین کمی پیچیده تر از یک برنامه است. در واقع یک اپلت تا زمانی که در یک کاوشگر اجرا نشود خروجی خود را نمایش نخواهد داد .
نکته : سعی کنید برنامه ها، اپلت ها و صفحات وب را در دایر کتوریهای جدا گانه ذخیره کنید.
اپلتی که در این قسمت می نویسیم،HelloWorld Applet نام دارد.
Import java.awt.graphics;
Public class helloworldapplet extends java. applet.Applet{
Public void paint (graphics g) {
g.drawstring ("hello world!" , 5, 25);
}
}
اپلت را با نامHelloWordApplet.java ذخیره کنید. در موردیک اپلت باید به چند نکته توجه کنید:
– دستور import در خط 1 شبیه دستور#include در C است، با این دستور اپلت می تواند از کلاس های jdkبرای کارهای گرافیکی استفاده کند.
-متد paint() برای نمایش محتویات اپلت است. در این جا عبارتhello world! روی صفحه نمایش داده خواهد شد . اپلت ها متد main() ندارند و به جای آن از متدهای paint() یا start(), init() استفاده می کنند.
برای کامپایل کردن این اپلت چنین کنید:
درا ین حالت هم کامپایلر یک فایل کلاس به نام helloworld.class ایجاد خواهد کرد. اما برای اجرای یک اپلت یک قدم دیگر هم باید برداشت و آن ایجاد یک فایل html است که اپلت در ان اجرا خواهد شد .
<HTML>
<HEAD>
<TITLE>HELLO TO EVERYONE</TITEL>
</HEAD><BODY>
<P>MY JAVA APPLET SAYS:
<APPLETCODE="HELLOWORLDAPPLET.CLASS"WIDTH=150HEIGHT=25>
</APPLET>
</BODY>
</HTML>
تحلیل برنامه
برای اجرای یک اپلت در فایلHTML باید از بر چسب<APPLET> استفاده کرد به دو نکته ذیل دقت کنید:
-برای مشخص کردن نام کلاسی که اپلت در آن است از صفت CODE استفاده کنید.
-0برای مشخص کردن ابعاد پنجره ای که اپلت در آن اجرا خواهد شد از صفت های WIDTH و HEIGHT استفاده کنید. اعداد مشخص شده بر حسب پیکسل هستند.
این فایل را با نامHELLOWORLDAPPLE.HTML ذخیره کنید.حالا آماده اید تا اپلت را اجرا کنید. این کار به دو روش امکانپذیر است:
-استفاده از کاوشگرهای مجهز به جاوا مانند نت اسکیپ.
-استفاده از برنامه APPLETVIEWER که با JDK می آید. این برنامه کل صفحه وب را نمی تواند نمایش دهد و فقط اپلت را نمایش خواهد داد.
برای دیدن اپلت در یک کاوشگر، فایل HTML فوق را باز کنید، با این کار صفحه وب و اپلت درون آن به نمایش در خواهند امد. روش استفاده از APPLETVIEWER چنین است:
نکته: با اینکه می توان برنامه APPLETVIEWER را از محل فایل HTML اجرا کرد ولی در این حالت بدون بستن آن نمی توان اپلت را مجدداً بار کرد. در حالیکه اگر مشاهده گر اپلت از محل دیگری اجرا شود. ( مانند دستور فوق) می توان یک اپلت را تغییر داده، مجدداً کامپایل کرده و سپس دوباره در مشاهده گر بار کرد.
خلاصه
جاوا یک زبان برنامه نویسی است که با آن می توانید برنامه های متنوعی بنویسید. بیشترین کاربرد جاوا در ایجاد اپلت هایی است که در کاوشگرهای وب قابل مشاهده هستند. اپلت ها برنامه هایی هستند که جزیی از صفحات وب محسوب می شوند . تقریباً هر کاری با اپلت ها امکانپذیر است.
قدرت جاوا در سادگی و استقلال از آن از بستر سخت افزاری ( چه در مقابل منبع برنامه، و چه در کد باینری آن) است. باجاوا می توان برنامه هایی هم نوشت که بدون کاوشگرهای وب قابل اجرا باشند. امروز هم یک برنامه جاوا نوشتید و هم یک اپلت جاوا، و تفاوت آن دو را دیدید. اپلت های جاوا را فقط در فایل های HTML می توان مورد استفاده قرار داد.
برنامه نویسی شیئی گرا
یکی از بزرگترین ایده های برنامه نویسی در دو دهه اخیر است ، اما تسلط کامل بر این ایده به سالها زمان و ممارست نیاز دارد. برنامه نویسی شیئی گرا در واقع پیوند دنیای واقعی با برنامه نوسی کامپیوتر است. امروز با مفاهیم برنامه نویسی شیئی گرا در جاوا، و ارتباط این مفاهیم با ساختار برنامه ها آشنا می شوید:
-شیئی و کلاس چیست و رابطه آنها چگونه است.
-یک شییء یا کلاس دو جزءء مهم دارد: رفتار و حالت
-وراثت و نقش آن در طراحی برنامه ها
– بسته ها و واسط ها در جاوا
اگر از قبل با برنامه نویسی شی گرا آشنا هستید می توانید امروز را استراحت کنید و برای درس فردا آماده شوید.
مفاهیم برنامه نویسی شیئء گرا
برنامه نویسی شیئی گرا قصد دارد مدلی از دنیای واقعی را وارد برنامه نویسی کامپیوتر کند. دنیای اطراف ما از اشیاء Object ساخته شده است.
اشیاء Object و کلاس هاclasses
شیئء کلیدی ترین مفهوم برنامه نویسی شیی ء گرا است. هر شیئء یک حالت ( یا خاصیت) و رفتار دارد، و برنامه عبارت است بر هم کنش بین اشیاء حالت یک شیئ عبارت است از متغیرهای ( عناصر داده ای) شیئی و مقدار آنها رفتار یک شیئ را متدهای آن تعیینن می کنند ( نزدیکترین مفهوم به متد همان تابع است) . شیئ در واقع مقداری کد است که کار خاصی انجام می دهد.
هر شیئ کپسولی است از مقداری متغیر و کد، که کار نگهداری و به روز در آوردن آنها را ساده می کند. معمولاً درون یک شیئ ( مانند یک کپسول در بسته ) از دسترس دنیای خارج بدور است و برای کار با آن باید از ارسال پیام استفاده کرد. مزیت کپسول آن است که کاربر برای کار با آن هیچ نیازی به دانستن مکانیز م های درونی آن ندارد و فقط باید ساختار پیام ها را بداند. معمولاً ساختار پیام ها در اشیاء مختلف یکسان است. در دنیای واقعی هم وضع به همین منوال است، مثلاً برای استفاده از یک تلویزیون شما هیچ نیازی به آشنایی با پیچیدگیهای درون آن ندارید فقط کافیست بدانید که باید آن را به برق بزنید، آن را روشن کنید و یک کانال را انتخاب کنید.
کلاس در واقع الگویی است برای ایجاد شیئی در واسط برنامه نویسی جاوا java APIچندین کلاس مختلف وجود دارد که در جای خود به آنها خواهیم پرداخت.
نکته : اگر باC آشنا باشید، می توانید کلاس را چیزی مانند struct و typedef تصور کنید؛ اما یک کلاس بسیار پیچیده تر و کارآتر از struct است.
چند کلاس با هم یک کتابخانه کلاس class library می سازند. برنامه نویسی جاوا اصولاً چیزی نیست جز طراحی و پیاده سازی کلاس ها.
ایجاد یک کلاس
برای درک بهتر مفاهیمی که تعریف شدند در این قسمت یک مثال عملی خواهیم آورد. در این مثال یک موتور سیکلت را شبیه سازی می کنیم . یک موتور سیکلت واقعی دارای حالت و رفتاری خاص خود است. حالت موتور سیکلت در واقع همان خواص آن ( مانند رنگ، مدل، نوع و .. ) است . مجموع این خواص یک موتور سیکلت خاص را مشخص خواهند کرد که از موتور سیکلت هاای دیگر قابل تمیز است. هر شئی وهله ایست از یک کلاس ، کلاس موجودی قابل لمس نیست، در حالیکه شئی موجودی است قابل لمس که به کلاس خود موجودیت داده است. مثلاً ، انسان یک کلاس است در حالیکه شما نمونه ای هستید از کلاس انسان؛ شما موجودیت دارد در حا لیکه چیزی به نام انسان وجود خارجی ندارد ، بلکه در اشیاء خاص ( من ، شما، دیگران) موجودیت می یابد.
موتور سیکلت ما دارای رفتارهایی هم هست، رفتارهایی مانند روشن شدن ، خاموش کردن، تعویض دنده،سرعت گرفتن، ترمز کردن و غیره.
وراثت، واسط ها و بسته ها
وراثت ( InheritanCe)
وراثت یکی از کلیدی ترین مفاهیم برنامه نویسی شیئی گراست و تایثر مستقیمی روی نحوه طراحی و نوشتن کلاس ها جاوا دارد. وراثت مکانیزمی است برای تغییر شکل دادن به کلاس ها و استفاده مجدد از آنها: با مکانیزم وراثت می توان به طور خودکار از اطلاعات کلاس های دیگر استفاده کرد.
هر کلاس یک فوق کلاس superclass و یک یا چند زیر کلاس subclass دارد. هر کلاس از کلاس های بالاتر خود در این سلسله مراتب ارث می برد و به کلاس پایین تر از خود ارث می دهد. هر زیر کلاس تمام متدها و متیرهای فوق کلاس خود را به ارث می برد و دیگر نیازی به تعریف مجدد آنها وجود ندارد.
بالاترین کلاس در سلسله مراتب کلاس های جاوا کلاسobject است و تمام کلاس های دیگر از این کلاس مشتق می شوند. این کلاس تعیین کننده کلیترین متدها و خواص تمام کلاس های ذیل خود است. معمولاً کلاس ها ضمن ارث بردن از کلاس های بالاتر از خود چیزهایی رابه آن اضافه و پیاده سازی می کنند.
ایجاد سسلسله مراتب کلاس
وقتی تعداد کلاس ها زیاد شود ، منطقی است که آنها را در یک سلسله مراتب گرد آوریم تا بتوانیم نحوه به ارث رسیدن متدها و خواص را بهتر کنترل کنیم بدین ترتیب نیاز به دوباره نویسی کدها به حداقل رسیده و هنگام نیاز به تغیر کدها نیز این اصلاحات فقط در یک نقطه انجام خواهند شد و از آنجا به تمام نقاط دیگر تسری خواهند یافت.
وراثت چگونه عمل می کند؟
وراثت چگونه عمل می کند؟ چگونه یک شیئ متغیرها و متدهای کلاس بالاتر را به طور خودکار بدست می آورد؟ در مورد متغیرها، وقتی شیئی بوجود می آید یک مسیر دسترسی به تمام متغیرهای کلاس مربوطه را بدست می آورد. در مورد متدها هم وضع به همین منوا ل است و تعریف یک متد در اختیار تمام زیر کلاس ها قرار خواهد گرفت. وقتی در یک شیئی متدی فراخوانی می شود، جاوا ابتدا در همان کلاسی که متد تعریف شده به دنبال کد آن می گردد اگر کد آن را نیافت. در سلسله مراتب یک پله بالاتر رفته و در فوق کلاس بدنبال آن خواهد گشت تا زمانیکه کد متد را بیابید.
وقتی در یک زیر کلاس متدی با نام مشابه متدی در یک کلاس بالاتر تعریف شود، کارها کمی پیچیده خواهد شد. در این حالت متدی که زودتر ( در حرکت از پایین) یافت شود اجرا خواهد شد. بدین ترتیب متد تعریف شده در زیر کلاس متد فوق کلاس را مخفی می کند. به این وضعیت تحریف overrideمتد گفته می شود.
وراثت منفرد و چند گانه
جاوا به گونه ای که دیدید از وراثت منفرد single استفاده می کند. وراثت منفرد یعنی هر کلاس جاوا می تواند فقط یک فوق کلاس داشته باشد. اما عکس آن درست نیست، یعنی یک کلاس می تواند چندین زیر کلاس داشته باشد.
در زبانهای شیئی گرای دیگر، مانندC++یک کلاس می تواند از چند فوق کلاس به ارث ببرد. به این وضعیت وراثت چندگانهmultipleگفته می شود . با وراثت چند گانه می توان کلاس های فوق العاده جالبی بوجود آورد. ولی کد نویسی آنها بسیار دشوارتر است.
واسط ها (InterfaCes) و بسته ها (PaCkages)
دیدیدکه در جاوا هر کلاس فقط از یک فوق کلاس ارث می برد. با اینکه وراثت منفرد برنامه نویسی را ساده تر می کند ولی کمی محدود کننده هم هست. مثلا اگر در شاخه های مختلف یک سلسله مراتب متدهای مشابهی داشته باشید، باید تمام آنها را جداگانه پیاده سازی کنید. جاوا با استفاده از مفهومی بنام واسط مشکل به اشتراک گذاشتن متدها را حل کرده است.
اصطلاح جدید
واسط عبارت است مجموعه نام چند متد، بدون تعریف آنها، که واسط آنها را در اختیار کلاس استفاده کننده می گذارد.
یک کلاس جاوا می تواند در آن واحد از چندین واسط استفاده کند، وبا این کار کلاس های بسیار متفاوت می توانند رفتارهای مشابهی داشته باشند.
در جاوا کلاس و واسط های مرتبط با هم در یک بسته گرد آورده می شوند. کلاس های اصلی جاوا در بسته ای بنام javaگرد آورده شده اند و فقط محتویات این بسته است که در تمام نسخه های جاوا ثابت می ماند. البته در بسته java بسته های دیگری وجود دارند ولی بستهjava.longبه طور پیش فرض در اختیار تمام برنامه هاست . برای استفاده از بسته های دیگر باید آنها را به طور صریح تعریف کرد. نام بسته ها و کلاس ها در هنگام تعریف با نقطه (. ) از هم جدا می شوند. مثلاً برای استفاده از کلاس color که در بسته awt( که خود در داخل بسته javaمی باشد) قرار دارد، باید چنین نوشت : .java.awt.color
ایجاد یک زیر کلاس
می خواهید یک اپلت بوجود آورید. تمام اپلت ها در جاوا زیر کلاس کلاسی بنام Applet هستند ( که در بسته java.applet قرار دارد). با ایجاد یک زیر کلاس از کلاسApplet می توانیم تمام رفتارهای آن ( از قبیل کار با پنجره ها، ارتباط با سیستم و پاسخ به رویدادهای کی بورد و ماوس ) را به ارث ببریم. در این مثال یک اپلت شبیه اپلت Hello world خواهیم ساخت که این عبارت را با رنگ و اندازه دیگری نمایش خواهد داد. ابتدا یک کلاس تعریف می کنیم:
Public class HelloAgainApplet extends java.applet.applet{
}
در اینجاکلاسی بنام HelloAgainApplet تعریف شده است ؛ به قسمت extends دقت کنید. در حقیقت این عبارت است که می گوید اپلت شما یک زیر کلاس از کلاسAppletخواهد بود. به مسیر کامل کلاس Appletدقت کنید، چون این بسته به طور پیش فرض برای جاوا تعریف نشده باید مسیر کامل آن ذکر شود:
کلمه public می گوید که این کلاس در اختیار تمام سیستم قرار خواهد داشت. تا اینجا کلاس ما تمام متغیرها و متدهایش را از کلاس بالاترAppletبه ارث برده و کاملا شبیه آن است اجازه دهید فونت آن را عوض کنیم:
Font f= new font ("TimesRoman" , font , bold, 36);
در اینجا f متغیری است که از کلاس font که جز بسته java.awt است. با تعریف فوق فونت سیستم از نوع TimesRoman ضخیم و با اندازه 36 خواهد شد. ( در مثال روز قبل فونت اپلت همان فونت پیش فرض سیستم بود). با استفاده از شئی فونت می توان فونت اپلت را تغییرداد.
حال باید متدی تعریف کرد تا از این فونت استفاده کند. متدی که عبارات را روی صفحه نمایش می دهد متدpaint()است که در اینجا آن را تحریف خواهیم کرد تا عبارت Hello world با فونت جدید رسم شود. تعریف جدید متد مزبور چنین است:
در اینجا به دو نکته باید توجه کنید. اول اینکه این متد public است چون متدی که همنام آن است خود public است. وقتی می خواهید متدی را تحریف کنید باید میدان دید scope آن مانند متد فوق کلاس متناظرش باشد دوم اینکه، متد paint() یک از آرگومان ورودی، که یک شئی از کلاسGraphics است، دارد . این کلاس یک روش مستقل از سخت افزار برای عملیات گرافیکی است .
در متد paint() سه کار انجام داده ایم:
-گفته شده که شیئی گرافیکی از فونت fاستفاده کند.
– گفته شده که رنگ رسم عبارت رنگ قرمز color.red است.
– در پایان هم عبارت "Hello Again" در نقطه (5,25) رسم می شود.
کلاس جدید به همین راحتی تعریف شد! اپلت ما تا این جا باید مانند ذیل باشد:
Public class HelloAgainApplet extends java. Applet.Applet{
Font f= new font("TimeRoman", font.bold, 36);
Public void paint (graphics g) {
g.setfont(f);
g.setcolor(color.red);
g.drawstring("Hello again!",5,40);
}
}
مثال ما یک اشتباه دارد . اپلت را کامپایل کنید. کامپایلر با پیغام ذی کاوش را متوقف خواهد کرد:
HelloAgainApplet.java:7:class Graphics not found in type declaration.
این پیغام خطا برای چیست؟ به یاد دارید که بسته پیش فرضjava بستهjava.longاست ولی شما در خط اول تعریف کلاس از بسته java.Appletاستفاده کرده اید. اما می بینید که کامپایلر از این خط خطا نگرفته است. چون مسیر کامل بسته را قید کرده ایم. یک راه حل برای رهایی از این قبیل مشکلات آن است که مسیر کامل تمام کلاس ها را قید کنیم. اما اگر در یک اپلت بدفعات از یک یا چند کلاس استفاده کنیم، هربار نوشتن نام کامل مسیر کلاس ها بسیار خسته کننده و وقت گیر خواهد بود. درا ین موارد بهتر است از دستور import استفاده کنیم. در اپلت فوق از سه کلاس (color,font,graphics) استفاده کرده ایم که همگی در بسته java.awt قرار دارند. بنابراین، دستورات ذیل را به اول برنامه،قبل از تعریف کلاس، اضافه کنید.
Import java.awt.graphics;
Import java.awt.font;
Import java.awt.color;
نکته : با استفاده از یک ستاره (*) می توان تمام کلاس هایpublic یک بسته را مورد استفاده قرار داد مانند ذیل:
Import java.awt.*;
حال که کلاس را تصحیح کرده ایم، می توانیم اپلت HelloAgainApplet را کامپایل کنیم.
خلاصه
یکی از سخت ترین جنبه های تسلط بر برنامه نویسی شیئی گرا درک همین مفاهیم ( عجیب و غریب) آن است. در اینجا مرور مجددی بر این مفاهیم خواهیم داشت.
کلاس : الگویی برای اشیاء که در آن رفتار و خواص شیئ، تعریف شده اند.
شئی: یک نمونه قابل لمس از یک کلاس، از یک روی کلاس می توان چند شیئ بوجود آورد که هر کدام رفتار و خواص خود را دارند.
وهله: هر شیئی یک وهله است از یک کلاس.
فوق کلاس: کلاسی که زیر والدینش ارث می برد.
متد کلاس: متدی که در یک کلاس تعریف می شود.
ایجاد اشیاء جدید
هر برنامه جاوا مجموعه ای از یک یا چند کلاس است . یک کلاس الگوی بوجود آوردن شیئی است،شئی وهله ایست از یک کلاس که کار واقعی روی آن انجام می شود بنابراین ،
یک واژه رشته ای ( که مجموعه ایست از چند کاراکتر) وهله ایست از کلاس .string کلاسstring از این نظر یکی از کلاس های غیر عادی جاواست چون ایجاد وهله های آن بسیار ساده است . اما کلاس های دیگر به این سادگی نیستند و برای ایجاد وهله هایی از آنها باید از عملکردnewاستفاده کرد.
نکته : دیگر واژه های جاوا و انواع داده اولیه آن شیئی واقعی نیستند.
استفاده از new
برای ایجاد یک شئی جدید ، از یک کلاس ، باید از عملگر new استفاده کرد.
پرانتزهای بعد از نام کلاس بسیار مهم هستند. این پرانتزها می توانندخالی باشند ، که در این صورت یکی شیئی ساده از آن کلاس بوجود می آید. درون این پرانتزها می توان آرگومانهایی قرار داد که متدی بنام سازنده کلاسclass constructor مورد استفاده قرار خواهند گرفت.
تذکر : بعضی از کلاس ها اجازه نمی دهند بدون آرگومان یک وهله جدید از آنها درست کنید. در این موارد به مستندات کلاس مراجعه کنید.
New چه کاری انجام می دهد
وقتی از عملگرnew استفاده می کنید، اتفاقات مختلفی روی می دهد : ابتدا یک وهله جدید از کلاس مشخص شده ایجاد، و سپس حافظه به آن تخصیص داده می شود. علاوه بر این ( و مهمتر از همه) وقتی شیئ جدید ایجاد شد ، یک متد خاص در آن کلاس فراخوانی می شود. این متد خاص متد سازنده نام دارد.
اصلاح جدید
متد سازنده برای آماده سازی شیئی ایجاد شده مورد استفاده قرار می گیرد. متد سازنده تمام اعمالی را که یک شئی برای عملکرد صحیح نیاز دارد .انجام می دهد.
یک کلاس می تواند چند نوع متد سازنده با آرگومانهای مختلف داشته باشد. کلاسهایی که می توانند به چندین روش مختلف آرگومان بگیرید ( مانند کلاس Data) دارای چند متد سازنده هستند.
نکته ای درباره مدیریت حافظه
مدیریت حافظه در جاوا خودکار و دینامیک است . وقتی شما یک شیئ جدید بوجود می آورید. جاوا به طور خودکار مقدار حافظه لازم را به آن اختصاص می دهد و نیازی به دخالت مستقیم شما نیست.
اما وقتی کارتان با یک شئی به پایان رسید، چه خواهد شد؟ چگونه حافظه اشغال شده توسط آن شیئ را آزاد می کنید؟ باز هم جواب در مدیریت خودکار حافظه است. وقتی کارتان با یک شیئ به پایان رسید تمام ارجاعات به آن شیئ در برنامه از بین خواهد رفت و جاوا به طور خودکار تمام اشیاء بی مصرف را از حافظه پاک خواهد کرد، فقط کافیست که شما تمام ارجاعات به آن شیئی را قطع کنید. و بقیه کارها را به عهده جاوا بگذارید.
دسترسی به عمل کلاس ها و متغیرهای وهله و ست کردن آنها
حال که دیگر خودتان می توانید از روی کلاس ها شئی بسازید ( و اشیاء هم دارای متغیرهایی هستند) شاید از خود بپرسید که چگونه باید با این متغیرها کار کرد؟ ساده است! نحوه رفتار متغیرهای وهله و کلاس دقیقاً مانند متغیرهای محلی، که دیروز با آنها آشنا شدید است ؛ فقط نحوه دسترسی به آنها کمی متفاوت است .
گرفتن مقدار متغیرها
برای خواندن مقدار متغیرهای وهله باید از نامگذاری با نقطه dot notation استفاده کنید.
اصطلاح جدید
در نامگذاری با نقطه، نام هر متغیر دو قسمت دارد: نام شیئ در سمت چپ نقطه ، و نام متغیر در سمت راست نقطه.
مثلاً ، اگر یک شیئ بنام myobjectدارای متغیری بنام varباشد، برای ارجاع به مقدار این متغیر باید چننن نوشت:
Myobject.var
این نوع نامگذاری در وقع یک نوع عبارت است ( چون مقدار برگشتی دارد) و هر دو سمت نقطه هم عبارت هستند. این بدان معناست که دسترسی چند مرحله ای هم امکانپذیر است. اگر متغیر var خود یک شیئ باشد که دارای متغیری به نام state است. برای دسترسی به این متغیر می توان چنین نوشت:
Myobject.var.state;
ارزیابی عبارتهای نقطه ای از چپ براست صورت می گیرد .
تغییر دادن مقدار متغیرها
تغییر دادن مقدار متغییرها هم بسیار ساده است. کافیست از یک عملکرد انتساب در سمت راست عبارت استفاده کنید:
Myobject.var.state=true
متغیرهای کلاس
متغیرهای کلاس متغیرهایی هستند که در خود کلاس تعریف می شوند. به همین دلیل، مقدار آنها به کلاس و تمام وهله های آن می رسد. در مورد متغیرهای وهله چنین نیست چون در هر وهله از کلاس یک کپی جدید از آنها ایجاد می شود. متغیر کلاس در میان تمام وهله های کلاس مشترک است و فقط یک کپی از آن وجود دارد.
برای تعریف یک متغیر کلاس باید از کلمه کلیدی static استفاده کرد.
Class familymember{
Static string sumame= "johnson";
String name;
Int age;
…
}
هر وهله از کلاس familymember دارای متغیرهای name, age خاص خود است ولی در میان تمام این وهله ها متغیرsurnameمشترک است.
برای خواندن متغیرهای کلاس از همان روش نامگذاری نقطه ای استفاده می شود، ولی در این مورد می توان از نام کلاس هم استفاده کرد.
چون هر تغییری که یکی از وهله ها روی متغیرهای کلاس اعمال کند به سایر وهله ها هم سرایت می کند. امکان اشتباه در این موارد زیاد است. در این موارد بهتر است از نام کلاس برای نامگذاری متغیرهای کلاس استفاده کنید.
فراخوانی متدها
برای فراخوانی متدهای یک شیئ هم باید از نامگذاری نقطه ای استفاده کرد:
Myobject.methodone(arg1,arg2,arg3);
متدها حتماً باید()راداشته باشند، حتی گر هیچ آرگومانی نداشته باشند:
Myobject.methodNoArgs();
فراخوانی متدها هم می تواند چند مرحله ای باشد:
Myobject.var.methodTwo(arg1,arg2);
بهترین نمونه فراخوانی چند مرحله ای یک متد، دستور system.out.printin()است.
متدهای کلاس
یک کلاس علاوه بر متغیرهای کلاس می تواند دارای متدهای خاص خود هم باشد متدهای کلاس به وهله خاصی مربوط نیستند و مستقیماً به خود کلاس وابسته اند. مثلا کلاس string متدی دارد بنام valueOf() که یک آرگومان ( عدد صحیح، متغیر منطقی و از این قبیل) را گرفته و مقدار آن را بر می گرداند. این متد روی شیئی خاصی عمل نمی کند اما چون کاری که می کند به رشته ها مربوط است، در کلاس string تعریف شده است.
متدهای کلاس برای گرد آوردن متدهای کلی هم مناسب هستند، مانند کلاس math که دارای مجموعه برگی از اعمال ریاضی است. ولی برای استفاده از این اعمال هیچ نیازی به ایجاد وهله های کلاس math نداریم.
روش فراخوانی متدهای کلاس هم مانند متغیرهای کلاس است و به همان دلیلی که قبلا گفتیم بهتر از نام کلاس به جای نام شیئ استفاده شود.
ارجاع به اشیاء
هنگام کار با اشیاء بدفعات لازم می شود که ارجاعاتی به آنها داشته باشیم .وقتی یک شیئ را به متغیری نسبت می دهید، یایک شیئی را به عنوان آرگومان به متدی می فرستید در واقع دارید از ارجاع به آن اشیاء استفاده می کنید نه از خود آنها .
تغییر نوع اشیاء و انواع اولیه
گاهی در یک برنامه پیش می آید که نوع یک متغییر بدلایلی اشتباه است؛ ممکنست آن یک عدد صحیح باشد که میل دارید اعشاری باشد. برای تغییر نوع داده ها در جاوا روش هایی وجود دارد.
اصلاح جدید
تغییر نوع casting داده برای تبدیل مقدار یک شیئ از نوعی به نوع دیگر است تغییر نوع باعث ایجاد یک ارجاع جدید می شود و شیئی اصلی را تغییر نمی دهد.
مفهوم تغییرنوع ساده است و لی چون در جاوا انواع داده مختلفی وجود دارد، کار می تواند کمی پیچیده شود
تغییر انواع اولیه
با این نوع تغییر می توانید یک متغیر از انواع اولیه ( صحیح ، اعشاری ، …) را به نوع دیگری تبدیل کنید. البته فقط انواع عددی رامی توان به یکدیگر تبدیل کرد و نوع boolean قابل تبدیل به انواع دیگر نیست.
اگر متغیرهایی که تبدیل می کنید به انواع بزرگتر مثلاً intبهlong ویا intبه flotتبدیل شوند. معمولا هیچ مشکلی پیش نخواهد آمد. ولی هنگام تبدیل یک نوع به نوع کوچکتر مشکلاتی بروز خواهد کرد که برای جلوگیری از آنها باید از تغییر نوع صریح استفاده کنید . برای تغییر نوع صریح یک مقدار باید چنین کنید.
(typename)value
مثال ذیل مقدار حاصل از عبارت y/x را به نوع int تبدیل می کند:
(int)(x /y);
چون تقدم تغییر نوع بیشتراز اعمال ریاضی است باید از پرانتز استفاده کنید.
تغییر نوع اشیاء
می توان نوع اشیاء را هم به یکدیگر تبدیل کرد، اما در این میان یک محدودیت وجود دارد. کلاس هایی که به هم تبدیل می شوند باید بوسیله وراثت به هم مربوط باشند و نمی توان هر کلاسی را به کلاس دیگر تبدیل کرد.
هنگام تبدیل یک زیر کلاس به یک فوق کلاس نیاز به هیچ اقدام خاصی نیست و اغلب می توان یک زیر کلاس را به جای یک فوق کلاس به کار برد. مثلاً فرض کنید متدی دارید که دو آرگومان می گیرد: یکی از نوع Object و دیگری از نوعNumberدر اینجا شما می توانید به جای Object هر شیئ دیگری را بفرستید چون تمام اشیاء زیر کلاس Object هستند، و به جای Number هم می توانید هر نوع عددی بفرستید چون تمام انواع داده جاوا (int,float و …) زیر کلاس Number هستند.
هنگام تبدیل یک زیر کلاس به فوق کلاس باید از تغییر نوع صریح استفاده کنید:
(classname)object
به مثال ذیل توجه کنید، در این مثال یک وهله از کلاس GreenApple به یک وهله از کلاس Apple ( که فوق کلاس GreenApple است) تبدیل می شود:
GreenApple a;
Apple a2;
a=new GreenApple();
a2(apple) a;
علاوه بر تغییر نوع کلاس ها ، می توان یک شیئی را به یک واسط هم تبدیل کرد . البته مشروط به این که آن شیئ (با یکی از فوق کلاس های آن) واسط مورد نظر را پیاده سازی کرده باشند. با این کار یک شیئ می تواند بدون ساده سازی یک متد از متدهای آن واسط استفاده کند. درباره واسط ها در هفته سوم بیشتر صحبت خواهیم کرد.
تغییر نوع انواع اولیه به اشیاء و بالعکس
با تغییر نوع انواع اولیه و اشیا ء آشنا شدید. ولی آیا می توان این دو را به هم تبدیل کرد؟ پاسخ منفی است . انواع اولیه و اشیاء با هم بسیار فرق دارند و نمی توانید آنها را به طور خودکار به هم تبدیل کنید. با این حال، جاوا برای هر نوع اولیه یک کلاس ویژه دارد: integer برای float,int برای boolean و الی آخر . با استفاده از متدهای این کلاس ها می توانید برای تمام انواع اولیه شبه اشیایی تولید کنید. در مثال ذیل یک وهله از کلاس integer با مقدار 35 ایجاد شده است:
Integer intObject = new Integer(35);
برای خواندن مقدار این شیی می توانید از متد intValue() استفاده کنید:
Int thelnt = intObject.intValue(); // returns 35
برای آشنایی با متدهای تغییر نوع در این کلاس ها می توانید به مستندات API جاوا مراجعه کنید.
چند نکته دیگر
در این قسمت با چند نکته دیگر درباره کار با اشیاء آشنا خواهید شد:
-مقایسه اشیاء
– کپی کردن اشیاء
– پیدا کردن کلاس یک شیئ خاص
– تست اینکه آیایک شیئ و هله ای از یک کلاس خاص است یا خیر
مقایسه اشیاء
عملگرهای مقایسه مقادیر: تساوی ، عدم تساوی، بزرگتر، کوچکترو غیره. اکثر این عملگرها فقط روی انواع اولیه کار می کنند، نه روی اشیاء تنها استثناء در این مورد عملگرهای تساوی = = و نامساوی!= هستند. این عملگرها روی اشیاء هم عمل می کنند، اما فقط می گویند که دو عملوند یک شیئ هستند یا خیر. مثلاً اگر دو شیئ ازکلاس string داشته باشید که حرف به حرف مانند هم باشند، مقایسه آنها با عملگر= =منجر به درستی true نخواهد شد چون آن دو در واقع یک شیئ نیستند. این مقایسه برابری دو شیئ باید از متدهای ویژه در آن کلاس ها استفاده کرد.
نکته جاوا ( بر خلافC++) دارای مفهوم تحریف عملگر نیست ، عملگرهای جاوا فقط در مورد اعداد قابل استفاده اند.
تعیین کلاس یک شیی
آیا می خواهید بدانید یک شیئ از چه کلاسی است؟ روش کار چنین است:
String name = obj.getclass().getname();
در این مثال نام کلاس شیی رشته ایobj بر گشت داده خواهد شد . متد getclass()از متدهای کلاس object است؛ مقدار برگشتی این متد یک شیئ class است که دارای متدیست نام getname() .متد getname() نام آن کلاس را بر می گرداند.
برای تست اینکه آیا یک شیئ و هله ای از یک کلاس خاص است یا نه، می توانید از عملگر instanceof استفاده کنید:
"foo" instanceof string // true
Point pt = new point(10,10);
Pt instanceof string // false
عملگر instanceof دو عملوند دارد: یک شیئ در سمت چپ و نام یک کلاس در سمت راست، مقدار برگشتی عبارت شامل instanceof می تواند true یا falseباشد. از عملگر instanceof برای واسط ها هم می توان استفاده کرد.
کتابخانه کلاس جاوا
برای پایان دادن به درس امروز، اجازه دهید نگاهی به کتابخانه کلاس جاوا بیندازیم. این قسمت نباید زیاد برایتان نا آشنا بشد چون قبلاً هم با آنها کار کرده اید.
هر کتابخانه جاوا مجموعه ایست از چند کلاس، این کلاس ها دربسته javaقرار دارند. مستندات این کتابخانه ها همراه JDKمی آید؛ آشنایی با کتابخانه های جاوا شما را با قوتها و ضعفهای آن آشنا می کند. در ذیل چند بسته را که جزیی از کتابخانه کلاس جاوا هستند، مختصراً توضیح داده ایم:
-java.lang کلاس های زبان جاوا از جمله کلاس object، کلاس string و کلاس system کلاس های خاص انواع اولیه هم در همین بسته قرار دارند.
-java.util کلاس های کمکی جاوا مانند vector,date و hashtable
– java.io کلاس های ورودی و خروجی برای کار با استریم ها و فایل ها.
– java.net کلاس های پشتیبانی از شبکه، از جملهsocket وURL ( کلاسی برای ارجاع به سندهای WWW).
-java.awt ( جعبه ابزار پنجره سازی) کلاسهایی برای پیاده سازی واسط کاربر گرافیکی، از جمله window,menu,button,font,checkbox و غیره. کلاس های پردازش تصاویر هم در همنین بسته قرار دارند. Java.Image
-java.appletکلاس های پیاده سازی اپلت های جاوا، از جمله کلاسApplet و واسط AudioClip
هر کیت نرم افزاری جاوا می تواند علاوه بر کلاس های استاندارد فوق دارای کلاسهایی خاص خو د باشد. با اینکه نمی توان مفید بودن این قبیل کلاس ها را انکار کرد ولی استفاده از آنها یک خطر دارد، ممکنست سیستمی که برنامه های شما باید روی آن اجرا شوند دارای این کلاس های خاص ( وغیراستاندارد) نباشد و برنامه شمانتواند اجرا شود. بنابر این سعی کنید حتی الامکان از آنها استفاده نکنید.
خلاصه
مهمترین قسمت هر زبانی همانا متدهای آن است. با آن که کلاس ها و اشیاء چارچوب یک برنامه را می سازند اما رفتار یک برنامه را متدهای آن تعیین می کنند.
ایجاد متدهایی با نام مشابه و آرگومانهای متفاوت
در جاوا متدها می توانند یکدیگر را تحریف overloud کنند – یعنی چند متد با نام مشابه و امضاهای متفاوت مجاز است . با این ویژگی دیگر نیازی نیست برای کارهای بسیار شبیه هم متدهای مختلف بنویسید و کار کاربران برنامه هم ساده تر خواهد شد. وقتی در یک برنامه متدی فراخوانی می شود، جاوا نه تنها نام بلکه تعداد و نوع آرگومانهای آن را هم بررسی می کند.
برای تحریف متدها کافیست در یک کلاس چند متد با نام مشابه و فهرست ارگومانهای متفاوت تعریف کنید ( فقط بیاد داشته باشید که دو متد با امضای مشابه در جاوا مجاز نیست ) . در جاوا تفاوت متدها نه از مقدار برگشتی آنها بلکه از تعداد و نوع پارامترهای آنها استنباط می شود.یعنی اگر دو متد نام و پارامترهای یکسان داشته باشند ولی مقدار برگشتی آنها متفاوت باشد، خطای کامپایلر بروز خواهد کرد. در ضمن نام پارارمترها هم اهمیتی ندارد فقط تعداد و نوع آنها مهم است.
Class myrect{
Int x1 = 0;
Int y1 = 0;
Int x2 = 0;
Int y2 = 0;
}
وقتی وهله جدیدی از کلاسmyrectایجاد می شود تمام متغیرها مقدار 0می گیرند. برای آن که این یک مستطیل واقعی باشد . متدی بنام buildrect() تعریف می کنیم و در آن مقدار نقاط راست خواهیم کرد ( دقت کنید که چون نام پارامترهای این متد با متغیرهای وهله مشابه است، برای دسترسی به متغیرهای وهله از this استفاده کرده ایم).
Myrect buildrect(int x1,int y1,int x2,int y2){
this. x1 = x1;
this .y1 = y1;
this .x2 = x2;
this .y2 = y2;
return this;
}
حال اگر بخواهیم مستطیل را به روش دیگرآماده سازی کنیم ، چه باید بکنیم؟ آیا باید متد دیگری تعریف کنیم؟ خیر ، می توان از همان متد buildrect()برای این کار استفاد کرد. در ذیل از همان متدبا دو آرگومان استفاده کرده ایم:
Myrect buildrect(point topleft, point bottomright){
X1=topleft.x;
Y1=topleft.y;
X2=bottomright.x;
Y2=bottomright.y;
Return this;
}
( چونpointیکی از کلاس های جاوا است باید با دستور import قبل از تعریف کلاس ، آن را برای برنامه تعریف کنیم تا جاوا بتواندآن را پیدا کند).
برای پیچیده تر کردن اوضاع، متد buildrect() را به گونه ای دیگر هم تعریف می کنیم، یک راس، طول و عرض:
Myrect buildrect(point topleft, int w, int h){
X1=topleft.x;
Y1=topleft.y;
X2=(x1+w);
Y2=(y1+h);
Return this;
}
برای آنکه بتوانیم برنامه را تست کنیم یک متد main() به آن اضافه کرده ایم و از متد دیگری هم برای چاپ مختصات مستطیل استفاده شده است.
متدهای سازنده
علاوه بر متدهای معمولی ، هر کلاس می تواند یک متد سازنده constructor method هم داشته باشد.
اصطلاح جدید متد سازنده متد خاصی است که شیی ایجاد شده را آماده سازی می کند.
بر خلاف متدهای دیگر، متد سازنده را خود شما نمی توانید فراخوانی کنید، این متد را جاوا به طور خودکار هنگام ایجاد وهله جدیدی از یک کلاس فراخوانی می کند. وقتی جاوا ( با عملگر new) شییء جدیدی می سازد، سه اتفاق می افتد:
– به شییء جدید حافظه اختصاص می دهد
– – به متغیرهای وهله در آن شییء مقادیر پیش فرض می دهد (0 برای اعداد، null برای اشیاء false برای متغیرهای منطقی ، "