Professional Documents
Culture Documents
.Archivetempjava Be Zabane Sade
.Archivetempjava Be Zabane Sade
:جاوا به زبان ساده /مؤلف :یونس ابراهیمی عنوان و نام پدید آورنده
: شابک
این اثر مشمول قانون حمایت مؤلفان ،مصنفان و هنرمندان مصوب 0631است .هر کس تمام یا قسمتی از این اثر را بدون اجازه ناشر ،نشر یا پخش کند
متد 336........................................................................................................................................................................
کالس 333................................................................................................................................................................
316.......................................................................................................................................................... Override
کلکسیونها)536....................................................................................................................................... (Collections
550............................................................................................................................................................ Vector
513................................................................................................................................................................. List
515................................................................................................................................................................ Map
511.................................................................................................................................................................. Set
516......................................................................................................................................................... HashSet
533....................................................................................................................................................... LinkedList
531............................................................................................................................................................ Queue
516.......................................................................................................................................................... TreeSet
510................................................................................................................................................. PriorityQueue
511............................................................................................................................................................. BitSet
501...................................................................................................................................................... Properties
SWING
135 ................................................................................................................................................ برنامه نویسی ویژوال
133.............................................................................................................................................. JOptionPaneکالس
115.................................................................................................................................................. JButtonکنترل
161........................................................................................................................................ JTabbedPaneکنترل
کالس306............................................................................................................................... RandomAccessFile
کالس361........................................................................................................................ ByteArrayOutputStream
کالس133........................................................................................................................................ BufferedWriter
همگام با پیشرفت فناوریهای دیگر ،زبانهای برنامه نویسی نیز ارتقا پیدا کردند .وقتی زبان JAVAطراحی و پیاده سازی شد ،تحول بزرگی در
دنیای برنامه نویسی به وجود آمد .این زبان برنامه نویسی موفق که در سال ۵۹۹۱به طور رسمی به بازار معرفی شد ،توانست چنان محبوبیتی در
جهان پیدا کند که در حال حاضر در بیش از ۳میلیارد سیستم مورد استفاده قرار گرفته و تاکنون بیش از ۵۱۱۱جلد کتاب پیرامون آن به رشته تحریر
درآمده است .خوشبختانه JAVAاین روزها به عنوان یکی از دروس رشتههای کامپیوتر در دانشگاههای کشور تدریس میشود و این نشان از
تواناییها و اهمیت این زبان است .منابع متعددی برای معرفی و به کارگیری زبان JAVAعرضه شده است که جای تقدیر و تشکر دارد .اما کتاب
حاضر دارای ویژگیهای بارزی از جمله ،بیان ساده مطالب ،ارائه مثالهای متنوع ،بررسی دقیق و موشکا فانه موضوعات و سلسله مراتب آموزشی
است .مثالهایی که در کتاب ارائه شدهاند همگی دارای هدف خاصی هستند به طوریکه هر کدام ،یک یا چند نکته زبان جاوا را به خواننده آموزش
میدهند .در این کتاب ما به شما نحوه برنامه نویسی به زبان جاوا را به صورت تصویری آموزش میدهیم .سعی کنید حتما بعد از خواندن مباحث ،
آنها را به صورت عملی تمرین کنید و اینکه قابلیت و مفهوم کدها را بفهمید نه آنها را حفظ کنید .
برای دریافت فایلها و آپدیتهای جدید این کتاب به سایت www.w3-farsi.comمراجعه فرمایید.
جاوا چیست؟
جاوا ) (JAVAیک زبان برنامه نویسی شیءگراست که نخستین بار توسط ( James Goslingجیمز گاسلینگ) در شرکت Sun
Microsystemsایجاد گردید .در سال 3663شرکت Sun Microsystemsدر حال توسعه نرمافزاری برای استفاده ابزارهای الکترونیکی
بود که مسئولیت تیم ،که آن را ،تیم پروژه Greenنامیدند ،جیمز گاسلینگ بر عهده گرفت.
در سال 3663تیم تصمیم گرفت که زبان جدید را ( OAKبلوط) بنامند .علت این نام گذاری وجود درختان بلوط در محوطه اطراف
ساختمان محل کار اعضای تیم Greenبود .در سال 3665تیم پروژه Greenزبان جدیدی را معرفی کرد که با ابزارهای مختلف خانگی
و لمسی کار میکرد .در سال 3661وب جهانی توسعه یافت و زبان OAKبا معرفی Appletکه قابلیت های زیادی به کامپیوترهای
در سال 3661زبان OAKبه JAVAتغییر نام پیدا کرد و توسط Microsoftو Netscapeپشتیبانی شد .از آنجا که مراسم تغییر
نام در کافی شاپ برگزار شده بود و همچنین عالقه اعضای تیم Greenبه قهوه ،یک فنجان قهوه داغ به عنوان نماد جاوا در نظر
گرفته شد .معتبرترین داستان درباره دلیل این نامگذاری این است که ،جیمز گاسلینگ به نوعی قهوه عالقه داشت ،که در جزیرهای
به نام جاوا ،که در اندونزی در جنوب شرقی آسیا است ،می روید .کال زبان برنامه نویسی جاوا به سه دسته کلی تقسیم می شود:
JAVA SEیا JAVA Standard Editionبرای نوشتن برنامه های کوچک دسکتاپی کاربرد دارد.
JAVA MEیا JAVA Micro Editionبرای برنامه نویسی برای منابع سخت افزاری ( )MEMORY ،CPUمحدود ،مثل
JAVA EEیا JAVA Enterprised Editionبرای برنامه های بزرگ که معموال بر روی شبکه های بزرگ مخصوصا
تاریخچه جاوا
از زمان انتشار اولین نسخه جاوا ) (java 1.0تا به امروز ،شرکت Sunتقریبا هر دو سال یکبار نسخه ای جدیدی از این زبان را
منتشر می نماید .در این نسخه تازه ،معموال قابلیت های جدیدی افزوده شده و ایرادهای نسخه قبل رفع می شوند .نکته قابل توجه
در مورد شماره گذاری نسخه های مختلف جاوا آن است که تا چهارمین نسخه آن شماره گذاری بصورت Java 1.xبود که xهمان
شماره نسخه مورد نظر می باشد .از نسخه پنجم به بعد شماره گذاری بصورت Java xتغییر یافت .یعنی بجای اینکه نسخه پنجم
را بصورت Java 1.5نامگذاری کنند ،بصورت java 5.0نامگذاری کردند .در ادامه به معرفی نسخه های مختلف جاوا بر اساس
نسخه پایه ای آن یا همان نسخه استاندارد )) (Standard Edition(SEمی پردازیم .این نسخه شامل همه ملزومات مورد نیاز
جهت Desktop Programmingمی باشد .در جدول زیر نسخه های مختلف جاوا و ویژگی های آنها ذکر شده است:
برای آشنایی بیشتر با این زبان به لینک های زیر مراجعه کنید:
)https://en.wikipedia.org/wiki/Java_(programming_language
https://en.wikipedia.org/wiki/Java_version_history
۵۱ مبانی زبان جاوا
ضریب اطمینان عملکرد برنامههای نوشته شده به این زبان باال است و وابسته به سیستم عامل خاصی نیست ،به عبارت دیگر
میتوان آن را روی هر رایانه با هر نوع سیستم عاملی اجرا کرد و این ،همان شعار جاوا است“ :یک بار بنویس ،همه جا اجرا کن".
JVMچیست ؟
برای اجرای برنامههای نوشته شده و کامپایل شده به زبان جاوا نیاز به سکویی یا برنامهای است که به آن ماشین مجازی جاوا
)(Java Virtual Machineیا به اختصار JVMگفته می شود .این ماشین کدهای کامپایل شده به زبان جاوا را گرفته و آنها را
اجرا می کند .شاید این جمله را شنیده باشید که کدهای زبان جاوا بر روی هر ماشین قابل اجرا میباشند و اصطالحا جاوا Multi
Platformاست.شخصی که دستگاهی با سیستم عامل ویندوز دارد ،از سایت سان میکروسیستمز JVMمربوط به سیستم عامل
ویندوز را نصب میکند .سپس برنامهای را به زبان جاوا مینویسد و آن را کامپایل مینماید .پس از آن برنامه کامپایل شده را برای
دوست خود که دستگاه دیگری با سیستم عامل لینوکس دارد ارسال میکند .این شخص قبال JVMمخصوص سیستم عامل لینوکس
را از سایت سان برداشته و بر روی دستگاه خود نصب نموده است .به همین دلیل هیچکدام از این دو نفر الزم نیست نگران باشد
که سیستم عامل دستگاهایشان با یکدیگر متفاوت است .می توان نحوه اجرای کدهای جاوا را به صورت زیر خالصه کرد:
وقتی برنامه نویس برنامه خود را اجرا می کند ،کدهای برنامه توسط کمپایلر جاوا به bytecodeتبدیل میشوند و
درون فایلی با همان نام قبلی اما این بار با پسوند .classذخیره میشوند.
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 31
ماشین مجازی جاوا ) (Java Virtual Machineفایل .classرا اجرا میکند.
ماشین مجازی جاوا یا JVMبر روی تمام سیستمعاملهای مطرح (ویندوز ،مکینتاش و لینوکس) قابل نصب است .به همین دلیل
فایل .classبرنامه شما در تمام این سیستم عاملها میتواند اجرا شود و به همین دلیل است که به جاوا زبان مستقل از سیستم
عامل گفته میشود .شعار جاوا این است« :یک بار بنویس ،همه جا اجرا کن»!
NetBeansو JDK
Netbeansمحیط توسعه یکپارچه ای است که دارای ابزارهایی برای کمک به شما برای توسعه برنامههای JAVAمیباشد .توصیه
میکنیم که از محیط Netbeansبرای ساخت برنامه استفاده کنید ،چون این محیط دارای ویژگیهای زیادی برای کمک به شما
جهت توسعه برنامههای JAVAمیباشد .توسط Netbeansمیتوان در استانداردهای مختلف جاوا مانند J2EE ،J2SEو J2ME
برنامه نویسی کرد .همچنین از محیط زبانهای C ،HTML ،PHPو نیز Groovyپشتیبانی میکند .قبل از نصب Netbeans
میبایست JDKرا نصب نمایید ،در غیر این صورت برای نصب دچار مشکل خواهید شد JDK .که مخفف عبارت Java
Development Toolkitمیباشد ترکیبی از کمپایلر زبان جاوا ،کالسهای کتابخانه ای ( )Java Class Librariesو JVMو
فایلهای راهنمای آنها میباشد .برای اینکه ما بتوانیم با استفاده از زبان برنامه نویسی جاوا ،برنامه بنویسیم به این مجموعه نیاز
داریم .تعداد زیادی از پردازشها که وقت شما را هدر میدهند به صورت خودکار توسط NetBeansانجام میشوند .یکی از این
ویژگیها اینتلی سنس ) (Intellisenseاست که شما را در تایپ سریع کدهایتان کمک میکند NetBeans .برنامه شما را خطایابی
میکند و حتی خطاهای کوچک (مانند بزرگ یا کوچک نوشتن حروف) را برطرف میکند .با این برنامههای قدرتمند بازدهی شما
افزایش مییابد و در وقت شما با وجود این ویژگیهای شگفت انگیز صرفه جویی میشود NetBeansآزاد است و میتوان آن را
دانلود و از آن استفاده کرد .این برنامه ویژگیهای کافی را برای شروع برنامه نویسی JAVAدر اختیار شما قرار میدهد.در آموزشها
از NetBeansنسخه 0.3.5استفاده شده است و استفاده از این نسخه برای انجام تمرینات این سایت کافی میباشد .برای دانلود
نرم افزارهای مورد نیاز به سایت w3-farsi.comو لینک زیر مراجعه کنید:
http://www.w3-farsi.com/?p=7529
۵1 مبانی زبان جاوا
در درس آینده مراحل نصب و راه اندازی دو نرم افزار JDKو NetBeansرا توضیح میدهیم.
در درس قبل در مورد نرم افزارهای NetBeansو JDKتوضیحات مختصری ارائه دادیم .در این درس میخواهیم شما را با نحوه
نصب این دو نرم افزار آشنا کنیم .نصب این نرم افزارها مانند اکثر نرم افزارهای دیگر بسیار آسان بود و بعد از زدن چند دکمه Next
نصب میشوند .در زیر مراحل تصویری نصب این دو نرم افزار نشان داده شده است.
نصب JDK
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 30
۵۹ مبانی زبان جاوا
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 53
1۵ مبانی زبان جاوا
نصب NetBeans
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 55
1۳ مبانی زبان جاوا
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 53
وقتی برای اولین بار بر روی آیکون NetBeansبر روی دسکتاپ کلیک کرده و آن را اجرا میکنید ،صفحه اول برنامه به صورت زیر
پیکربندی JDK
در درس قبل ما نسخه نهایی JDKیا Java Development Kitرا بر روی سیستم عامل مان نصب کردیم .ولی این پایان کار
نیست .برای اجرای برنامه های جاوا الزم است که مسیر پوشه binاین نرم افزار را در متغیر pathمعرفی کنیم .برای این کار ابتدا
از پنل سمت چپ این صفحه Advanced system settingsرا باز کنید:
11 مبانی زبان جاوا
در قسمت پایین و بخش System Variablesروی گزینه Pathکلیک کرده و سپس گزینه Editرا بزنید:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 50
در پنجره باز شده اگر قسمت Variable Valueخالی بود مسیر پوشه binرا در آن کپی کنید:
و اگر از قبل مسیرهای دیگری وجود داشت ابتدا عالمت سمیکالن (;) را در انتهای آنها گذاشته و سپس مسیر پوشه binرا کپی
می کنید:
1۹ مبانی زبان جاوا
Javac –version
مشاهده می کنید که خطا برطرف شده و نسخه JDKنمایش داده می شود که نشان دهنده این است که مراحل را درست انجام
داده اید:
C:\Users\JavaTutorials>javac -version
javac 1.7.0_25
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 13
>C:\Users\JavaTutorials
و دستور زبان یک برنامه ساده جاوا را توضیح دهم .قبل از ایجاد برنامه به این نکته توجه کنید که کدهای جاوا را میتوان در داخل
یک ویرایشگر متن ساده مانند NotePadنوشت و اجرا کرد .فقط کافیست که JDKبر روی سیستم شما نصب باشد .استفاده از
نرم افزارهایی مانند NetBeansفقط برای راحتی در کدنویسی و کاهش خطا میباشد.
همانطور که گفته شد ،شما برای کامپایل و اجرای برنامههای جاوا به ابزاری به نام JDKنیاز دارید JDK .مخفف عبارت Java
Development Kitاست و شامل ابزارهای مورد نیاز شما برای اجرای برنامههای جاوا میشود .این مجموعه شامل ابزاری به نام
JVMیا Java Virtual Machineاست که ماشین مجازی جاوا نام دارد و وظیفهی کامپایل و اجرای کدهای شما را برعهده دارد.
خود JVMهم شامل ابزارهای دیگری است .مثال javacیا java compilerاختصاصا وظیفهی کامپایل کردن برنامهها را برعهده
دارد .در درس قبل JDKرا نصب کردیم و االن فرض میکنیم که شما هیچ IDEمانند netbeansو یا eclipseدر اختیار ندارید
و میخواهید یک برنامه جاوا بنویسید .در این برنامه میخواهیم پیغام Welcome to JAVA Tutorialsچاپ شود .ابتدا یک
ویرایشگر متن مانند Notepadرا باز کرده و کدهای زیر را در داخل آن نوشته :
نگران توضیح کدهای باال نباشید ،در ادامه در مورد آنها توضیح می دهیم .پس شکل نهایی برنامه ،باید به صورت زیر باشد:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 15
فایل ما در درایو Dقرار دارد .ابتدا cmdرا باز کرده و کد زیر را در داخل آن نوشته و دکمه Enterرا می زنید:
C:\Users\JavaTutorials>d:
D:\>javac MyFirstProgram.java
>\D:
با اجرای کد باال هیچ پیغامی چاپ نمی شود چون که دستور javacبرنامه را کامپایل کرده و یک فایل همنام با کالس
اگر فایل ایجاد شده یعنی MyFirstProgram.classرا با برنامه NotePadباز کنید مشاهده می کنید که شامل کدهایی نا مفهوم
می باشد:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 13
به این کدهای نامفهوم که برای ماشین مجازی جاوا ) (JVMقابل فهم می باشد ByteCode ،گفته می شود .حال برای اجرای
C:\Users\JavaTutorials>d:
D:\>javac MyFirstProgram.java
D:\>java MyFirstProgram
!Welcome to JAVA Tutorials
>\D:
مشاهده می کنید که فایل جاوا اجرا و پیغام Welcome to JAVA Tutorialsچاپ شد.
یک نکته را متذکر می شویم و آن این است که نام فایل دارای پسوند javaباید با نام کالسی که در داخل آن است ،یکی باشد،
در غیر اینصورت با خطا مواجه می شوید .فرض کنید ما نام فایل باال را به Program.javaتغییر داده و آن را کامپایل می کنیم.
1 error
خطای باال به این معنی است که کالسی با نام MyFirstProgramباید در فایلی با نام MyFirstProgram.javaتعریف شود.
برنامه NetBeansرا اجرا کنید .از مسیری که در شکل زیر نشان داده شده است یک پروژه جدید ایجاد کنید:
حال با یک صفحه مواجه میشوید .طبق شمارههایی که در شکل زیر نمایش داده شدهاند گزینهها را انتخاب کرده و به مرحله بعد
بروید:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 11
با زدن دکمه Nextصفحه ای به صورت زیر نمایش داده میشود .در این پنجره نام پروژهتان ) (MyFirstProgramرا نوشته و
بعد از فشردن دکمه ،Finishوارد محیط کدنویسی برنامه به صورت زیر میشویم:
۳1 مبانی زبان جاوا
محیط کدنویسی یا IDEجایی است که ما کدها را در آن تایپ میکنیم.کدها در محیط کدنویسی به صورت رنگی تایپ میشوند
در نتیجه تشخیص بخشهای مختلف کد را راحت میکند .همانطور که در شکل باال مشاهده میکنید ما کدهای پیشفرض را به سه
قسمت تقسیم کردهایم .قسمت اول ،Packageقسمت دوم کالس و قسمت سوم متد )( .mainنگران اصطالحاتی که به کار بردیم
نباشید آنها را در فصول بعد توضیح خواهم داد .در محل کد نویسی کدهایی از قبل نوشته شده که برای شروع شما آنها را پاک
مثال باال سادهترین برنامه ای است که شما میتوانید در جاوا بنویسید .هدف در مثال باال نمایش یک پیغام در صفحه نمایش
است .هر زبان برنامه نویسی دارای قواعدی برای کدنویسی است .اجازه بدهید هر خط کد را در مثال باال توضیح بدهیم .در خط
اول Packageتعریف شده است که شامل کدهای نوشته شده توسط شما است و از تداخل نامها جلوگیری میکند .درباره
Packageدر درسهای آینده توضیح خواهیم داد .در خط ،3آکوالد ( } ) نوشته شده است .آکوالد برای تعریف یک بلوک کد به
کار میرود .جاوا یک زبان ساخت یافته است که شامل کدهای زیاد و ساختارهای فراوانی میباشد .هر آکوالد باز ( { ) در جاوا باید
دارای یک آکوالد بسته )}( نیز باشد .همه کدهای نوشته شده از خط 3تا خط 6یک بلوک کد است.
در خط 3یک کالس تعریف شده است.درباره کالسها در فصلهای آینده توضیح خواهیم داد .در مثال باال کدهای شما باید در
داخل یک کالس نوشته شود.بدنه کالس شامل کدهای نوشته شده از خط 3تا 6میباشد .خط 1متد )( mainیا متد اصلی نامیده
میشود .هر متد شامل یک سری کد است که وقتی اجرا میشوند که متد را صدا بزنیم .در باره متد و نحوه صدا زدن آن در فصول
بعدی توضیح خواهیم داد .متد )( mainنقطه آغاز اجرای برنامه است .این بدان معناست که ابتدا تمام کدهای داخل متد )(main
و سپس بقیه کدها اجرا میشود.درباره متد )( mainدر فصول بعدی توضیح خواهیم داد .متد )( mainو سایر متدها دارای آکوالد
و کدهایی در داخل آنها میباشند و وقتی کدها اجرا میشوند که متدها را صدا بزنیم .هر خط کد در جاوا به یک سیمیکولن ( ; )
ختم میشود .اگر سیمیکولن در آخر خط فراموش شود برنامه با خطا مواجه میشود .مثالی از یک خط کد در جاوا به صورت زیر
است:
این خط کد پیغام ! Welcome to JAVA Tutorialsرا در صفحه نمایش نشان میدهد.از متد )( printlnبرای چاپ یک
رشته استفاده میشود .یک رشته گروهی از کاراکترها است که به وسیله دابل کوتیشن (“) محصور شده است ،مانند :
یک کاراکتر میتواند یک حرف ،عدد ،عالمت یا ….باشد.در کل مثال باال نحوه استفاده از متد )( printlnنشان داده شده است.
این متد یک متد از کالس PrintStreamبوده و از آن برای چاپ مقدیر استفاده میشود out .یک فیلد استاتیک کالس System
۳۹ مبانی زبان جاوا
و کالس Systemهم یک کالس از پیش تعریف شده در جاوا میباشد .جاوا فضای خالی و خطوط جدید را نادیده میگیرد .بنابراین
شما میتوانید همه برنامه را در یک خط بنویسید .اما اینکار خواندن و اشکال زدایی برنامه را مشکل میکند .یکی از خطاهای معمول
در برنامه نویسی فراموش کردن سیمیکولن در پایان هر خط کد است .به مثال زیر توجه کنید:
جاوا فضای خالی باال را نادیده میگیرد و از کد باال اشکال نمیگیرد .اما از کد زیر ایراد میگیرد :
;(System.out.println
;)"!"Welcome to JAVA Tutorials
به سیمیکولن آخر خط اول توجه کنید.برنامه با خطای نحوی مواجه میشود چون دو خط کد مربوط به یک برنامه هستند و شما
فقط باید یک سیمیکولن در آخر آن قرار دهید .همیشه به یاد داشته باشید که جاوا به بزرگی و کوچکی حروف حساس است.یعنی
به طور مثال MANو manدر جاوا با هم فرق دارند .رشتهها و توضیحات از این قاعده مستثنی هستند که در درسهای آینده
توضیخ خواهیم داد .مثال کدهای زیر با خطا مواجه میشوند و اجرا نمیشوند:
تغییر در بزرگی و کوچکی حروف از اجرای کدها جلوگیری میکند .اما کد زیر کامال بدون خطا است:
{
;statement1
}
این کار باعث میشود که کدنویسی شما بهتر به چشم بیاید و تشخیص خطاها راحت تر باشد .یکی از ویژگیهای مهم جاوا نشان
دادن کدها به صورت تو رفتگی است بدین معنی که کدها را به صورت تو رفتگی از هم تفکیک میکند و این در خوانایی برنامه
برای ذخیره پروژه و برنامه میتوانید به مسیر File > Save Allبروید یا از کلیدهای میانبر Ctrl+Shift+Sاستفاده کنید.
و برای اجرای برنامه هم از فلش سبزرنگ موجود در Toolbarو یا دکمه F6استفاده کنید:
با اجرای برنامه باال مشاهده میکنید که رشته ! Welcome to JAVA Tutorialsدر خروجی برنامه به صورت زیر نمایش داده
میشود:
وجود خط سبز در پایین فلش قرمز در شکل باال نشان دهنده اجرای بدون نقص برنامه میباشد .حال که با خصوصیات و ساختار
اولیه جاوا آشنا شدید در درسهای آینده مطالب بیشتری از این زبان برنامه نویسی قدرتمند خواهید آموخت.
1۵ مبانی زبان جاوا
استفاده از Package
برای دسته بندی کالسها و قرار دادن کالسهای مرتیط با هم در یک مکان ،جاوا از مفهومی به نام بسته یا packageاستفاده
میکند .پکیج معادل فضای نام در سی شارپ می باشد .یک دلیل برای گروه بندی کالسها در packageاین است که امکان دارد
دو برنامه نویس از دو کالس هم نام استفاده کنند .با این کار از چنین برخوردهایی جلوگیری به عمل میآید .یعنی اگر دو کالس هم
نام در دو Packageغیر همنام باشند مشکلی به وجود نمیآید .همانطور که در مثال باال دیدید به طور پیشفرض NetBeatns
هنگام ایجاد برنامه یک Packageهمنام با اسمی که برای برنامه انتخاب کردهایم با حروف کوچک و در داخل این Packageهم
;package myfirstprogram
برای وارد کردن کالس یک Packageدر داخل Packageدیگر از کلمه کلیدی importبه صورت زیر استفاده میشود:
import PackageName.ClassName
همانطور که در مثال باال مشاهده میکنید برای استفاده از کالسی که در یک Packageقرار دارد در Packageدیگر ابتدا کلمه
importسپس نام ،Packageبعد عالمت نقطه و در آخر نام کالس را مینویسیم .مثال برای استفاده از کالس MyFirstProgram
;import myfirstprogram.MyFirstProgram
بستهها را میتوان به صورت تو در تو تعریف کرد .در این حالت در تعریف بسته یک کالس ،از بیرونیترین بسته شروع کرده و هر
import firstPackage.secondPackage.ClassName
نکته ای که بهتر است در همین جا به آن اشاره کنم این است که اگر بخواهید کد زیر را بدون استفاده از NetBeansکامپایل و
اجرا کنید ،کامپایل می شود ولی در زمان اجرا با خطای Error: Could not find or load main class MyFirstProgram
مواجه می شوید:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 35
;package myfirstprogram
کد باال را با نام و پسوند MyFirstProgram.javaو در درایو Dذخیره کنید .حال cmdرا اجرا کرده و سعی کنید کد باال را کامپایل
و اجرا نمایید:
C:\Users\YounesJava>d:
D:\>javac MyFirstProgram.java
D:\>java MyFirstProgram
Error: Could not find or load main class MyFirstProgram
همانطور که مشاهده می کنید برای کامپایل کد باال به صورت زیر عمل کرده ایم:
javac MyFirstProgram.java
اما برای اجرای کد ،اگر از دستور زیر استفاده کنیم با خطا مواجه می شویم:
java MyFirstProgram
دلیل وجود خطا ،خط اول کد ،یعنی ; package myfirstprogramمی باشد .برای رفع این مشکل یا باید خط مذکور را از برنامه
حذف و برنامه را مجددا کامپایل و اجرا کرد یا اگر آن را پاک نکنید باید از کد زیر برای اجرای کد استفاده کنید:
که در این صورت برنامه اجرا و پیغام ! Welcome to JAVA Tutorialsچاپ می شود .در درس های آینده توصیه می کنیم که
اگر می خواهید از NotePadو cmdبرای اجرای کدها استفاده کنید این خط را از اول هم فایل ها حذف و سپس برنامه را کامپایل
و اجرا کنید.
1۳ مبانی زبان جاوا
و….دسترسی پیدا کنیم .وقتی که شما در محیط کدنویسی حرفی را تایپ کنید IntelliSenseفورا فعال میشود .کد زیرا را در
اولین حرف را تایپ کرده و سپس دکمههای ترکیبی Ctrl+Spaceرا فشار دهید تا IntelliSenseفعال شود:
IntelliSenseلیستی از کلمات به شما پیشنهاد میدهد که بیشترین تشابه را با نوشته شما دارند .شما میتوانید با زدن دکمه
tabگزینه مورد نظرتان را انتخاب کنید .با تایپ نقطه ( ) .شما با لیست پیشنهادی دیگری مواجه میشوید:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 33
اگر بر روی گزینه ای که میخواهید انتخاب کنید لحظه ای مکث کنید توضیحی در رابطه با آن مشاهده خواهید کرد مانند شکل
زیر:
1۱ مبانی زبان جاوا
هر چه که به پایان کد نزدیک میشوید لیست پیشنهادی محدود تر میشود .برای مثال با تایپ ،pاینتل الیسنس فقط کلماتی را
با تایپ حرفهای بیشتر لیست محدودتر میشود .اگر IntelliSenseنتواند چیزی را که شما تایپ کردهاید پیدا کند هیچ چیزی
را نمایش نمیدهد .برای ظاهر کردن IntelliSenseکافیست دکمه ترکیبی Ctrl+Spaceرا فشار دهید .برای انتخاب یکی از
متدهایی که دارای چند حالت هستند ،میتوان با استفاده از دکمههای مکان نما (باال و پایین) یکی از حالتها را انتخاب کرد .مثال
متد )( printlnهمانطور که در شکل زیر مشاهده میکنید دارای چندین حالت نمایش پیغام در صفحه است:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 31
IntelliSenseبه طور هوشمند کدهایی را به شما پیشنهاد میدهد و در نتیجه زمان نوشتن کد را کاهش میدهد.
رفع خطاها
بیشتر اوقات هنگام برنامه نویسی با خطا مواجه میشویم .تقریبا همه برنامههایی که امروزه میبینید حداقل از داشتن یک خطا
رنج میبرند .خطاها میتوانند برنامه شما را با مشکل مواجه کنند .در جاوا سه نوع خطا وجود دارد:
خطای کمپایلر ی
این نوع خطا از اجرای برنامه شما جلوگیری میکند .این خطاها شامل خطای دستور زبان میباشد .این بدین معنی است که شما
قواعد کد نویسی را رعایت نکردهاید .یکی دیگر از موارد وقوع این خطا هنگامی است که شما از چیزی استفاده میکنید که نه وجود
دارد و نه ساخته شده است .حذف فایلها یا اطالعات ناقص در مورد پروژه ممکن است باعث به وجود آمدن خطای کمپایلری
شود.استفاده از برنامه بوسیله برنامه دیگر نیز ممکن است باعث جلوگیری از اجرای برنامه و ایجاد خطای کمپایلر ی شود.
11 مبانی زبان جاوا
خطاهای منطقی
این نوع خطا در اثر تغییر در یک منطق موجود در برنامه به وجود میآید .رفع این نوع خطاها بسیار سخت است چون شما برای
یافتن آنها باید کد را تست کنید.نمونه ای از یک خطای منطقی برنامه ای است که دو عدد را جمع میکند ولی حاصل تفریق دو
عدد را نشان میدهد.در این حالت ممکن است برنامه نویس عالمت ریاضی را اشتباه تایپ کرده باشد.
استثناء
این نوع خطاها هنگامی رخ میدهند که برنامه در حال اجراست .این خطا هنگامی روی میدهد که کاربر یک ورودی نامعتبر به
برنامه بدهد و برنامه نتواند آن را پردازش کند NetBeans .دارای ابزارهایی برای پیدا کردن و برطرف کردن خطاها هستند .وقتی در
محیط کدنویسی در حال تایپ کد هستیم یکی از ویژگیهای NetBeansتشخیص خطاهای ممکن قبل از اجرای برنامه است.زیر
هنگامی که شما با ماوس روی این خطوط توقف کنید توضیحات خطا را مشاهده میکنید .شما ممکن است با خط سبز هم مواجه
شوید که نشان دهنده اخطار در کد است ولی به شما اجازه اجرای برنامه را میدهند .به عنوان مثال ممکن است شما یک متغیر را
تعریف کنید ولی در طول برنامه از آن استفاده نکنید( .در درسهای آینده توضیح خواهیم داد).
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 30
در باره رفع خطاها در آینده توضیح بیشتری میدهیم .پنجره Outputکه در شکل زیر با فلش قرمز نشان داده شده است به شما
همانطور که در شکل زیر مشاهده میکنید هرگاه برنامه شما با خطا مواجه شود لیست خطاها در پنجره Outputنمایش داده
میشود.
1۹ مبانی زبان جاوا
در شکل باال علت به وجود آمدن خطا و شماره خطی که خطا در آن رخ داده است ،نمایش داده شده است .اگر برنامه شما دارای
مربع کوچک داخل پنجره باال را تیک زنید چون دفعات بعد که برنامه شما با خطا مواجه شود دیگر این پنجره به عنوان هشدار نشان
داده نخواهد شد .با کلیک بر روی دکمه Run Anywayبرنامه با وجود خطا نیز اجرا میشود .اما با کلیک بر روی دکمه Cancel
اجرای برنامه متوقف میشود و شما باید خطاهای موجود در پنجره Outputرا بر طرف نمایید.
کاراکترهای کنترلی
کاراکترهای کنترلی کاراکترهای ترکیبی هستند که با یک بک اسلش )\( شروع میشوند و به دنبال آنها یک حرف یا عدد میآید
و یک رشته را با فرمت خاص نمایش میدهند .برای مثال برای ایجاد یک خط جدید و قرار دادن رشته در آن میتوان از کاراکتر
;)"!System.out.println("Hello\nWorld
Hello
World
مشاهده کردید که کمپایلر بعد از مواجهه با کاراکتر کنترلی \nنشانگر ماوس را به خط بعد برده و بقیه رشته را در خط بعد نمایش
میدهد .متد )( Printlnهم مانند کاراکتر کنترلی \nیک خط جدید ایجاد میکند ،البته بدین صورت که در انتهای رشته یک
;)"!System.out.println("Hello World
;)"System.out.print("Hello World!\n
متد )( Printکارکردی شبیه به )( Printlnدارد با این تفاوت که نشان گر ماوس را در همان خط نگه میدارد و خط جدید ایجاد
نمیکند .جدول زیر لیست کاراکترهای کنترلی و کارکرد آنها را نشان میدهد:
ما برای استفاده از کاراکترهای کنترلی از بک اسلش )\( استفاده میکنیم.از آنجاییکه \ معنای خاصی به رشتهها میدهد برای
یکی از موارد استفاده از \\ ،نشان دادن مسیر یک فایل در ویندوز است:
از آنجاییکه از دابل کوتیشن )“( برای نشان دادن رشتهها استفاده میکنیم برای چاپ آن از ”\ استفاده میکنیم:
;)"System.out.println("Left\tRight
Left Right
هر تعداد کاراکتر که بعد از کاراکتر کنترلی \rبیایند به اول سطر منتقل و جایگزین کاراکترهای موجود میشوند:
;)"System.out.println("Mitten\rK
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 15
K
مثال در مثال باال کاراکتر Kبعد از کاراکتر کنترلی \rآمده است.کاراکتر کنترلی حرف Kرا به ابتدای سطر برده و جایگزین Mitten
میکند .برای مشاهده لیست مقادیر مبنای 31برای کاراکترهای یونیکد به لینک زیر مراجعه نمایید :
http://www.ascii.cl/htmlcodes.htm
اگر کمپایلر به یک کاراکتر کنترلی غیر مجاز برخورد کند ،برنامه پیغام خطا میدهد.بیشترین خطا زمانی اتفاق میافتد که برنامه
توضیحات
وقتی که کد ی تایپ می کنید شاید بخواهید که متنی جهت یادآوری وظیفه آن کد به آن اضافه کنید .در جاوا (و بیشتر زبانهای
برنامه نویسی) می توان این کار را با استفاده از توضیحات انجام داد .توضیحات متونی هستند که توسط کمپایلر نادیده گرفته می
هدف اصلی از ایجاد توضیحات ،باال بردن خوانایی و تشخیص نقش کدهای نوشته شده توسط شما ،برای دیگران است .فرض کنید
که می خواهید در مورد یک کد خاص ،توضیح بدهید ،می توانید توضیحات را در باالی کد یا کنار آن بنویسید .از توضیحات برای
مستند سازی برنامه هم استفاده می شود .در برنامه زیر نقش توضیحات نشان داده شده است:
در کد باال ،خط 1یک توضیح درباره خط 0است که به کاربر اعالم می کند که وظیفه خط 0چیست ؟ با اجرای کد باال فقط جمله
Hello Worldچاپ شده و خط 1در خروجی نمایش داده نمی شود چون کمپایلر توضیحات را نادیده می گیرد .توضیحات بر
سه نوعند:
توضیحات تک خطی
/* multi
line
comment */
**/
Documentation Comments
*/
توضیحات تک خطی همانگونه که از نامش پیداست ،برای توضیحاتی در حد یک خط به کار می روند .این توضیحات با عالمت //
شروع می شوند و هر نوشته ای که در سمت راست آن قرار بگیرد جز توضیحات به حساب می آید .این نوع توضیحات معموال در
باال یا کنار کد قرار می گیرند .اگر توضیح درباره یک کد به بیش از یک خط نیاز باشد از توضیحات چند خطی استفاده می شود.
توضیحات چند خطی با * /شروع و با */پایان می یابند .هر نوشته ای که بین این دو عالمت قرار بگیرد جز توضیحات محسوب
می شود .نوع دیگری از توضیحات ،توضیحات مستند سازی نامیده می شوند .این نوع با ** /شروع و به */ختم می شوند .از این
نوع برای مستند سازی برنامه استفاده می شود و در درس های آینده در مورد آنها توضیح خواهیم داد.
متغیر
متغیر مکانی از حافظه است که شما میتوانید مقادیری را در آن ذخیره کنید .میتوان آن را به عنوان یک ظرف تصور کرد که دادههای
خود را در آن قرار دادهاید .محتویات این ظرف میتواند پاک شود یا تغییر کند .هر متغیر دارای یک نام نیز هست.که از طریق آن
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 13
میتوان متغیر را از دیگر متغیرها تشخیص داد و به مقدار آن دسترسی پیدا کرد .همچنین دارای یک مقدار میباشد که میتواند
توسط کاربر انتخاب شده باشد یا نتیجه یک محاسبه باشد .مقدار متغیر میتواند تهی نیز باشد .متغیر دارای نوع نیز هست بدین
معنی که نوع آن با نوع داده ای که در آن ذخیره میشود یکی است .متغیر دارای عمر نیز هست که از روی آن میتوان تشخیص
داد که متغیر باید چقدر در طول برنامه مورد استفاده قرار گیرد .و در نهایت متغیر دارای محدوده استفاده نیز هست که به شما
میگوید که متغیر در چه جای برنامه برای شما قابل دسترسی است .ما از متغیرها به عنوان یک انبار موقتی برای ذخیره داده استفاده
میکنیم .هنگامی که یک برنامه ایجاد میکنیم احتیاج به یک مکان برای ذخیره داده ،مقادیر یا دادههایی که توسط کاربر وارد
میشوند داریم .این مکان همان متغیر است .برای این از کلمه متغیر استفاده میشود چون ما میتوانیم بسته به نوع شرایط هر
جا که الزم باشد مقدار آن را تغییر دهیم .متغیرها موقتی هستند و فقط موقعی مورد استفاده قرار میگیرند که برنامه در حال
اجراست و وقتی شما برنامه را میبندید محتویات متغیرها نیز پاک میشود .قبال ذکر شد که به وسیله نام متغیر میتوان به آن
دسترسی پیدا کرد .برای نامگذاری متغیرها باید قوانین زیر را رعایت کرد:
نمیتوان از کلمات رزرو شده در جاوا برای نام متغیر استفاده کرد.
اسامی متغیرها نسبت به بزرگی و کوچکی حروف حساس هستند .در جاوا دو حرف مانند aو Aدو کاراکتر مختلف به
حساب میآیند.
دو متغیر با نامهای myNumberو MyNumberدو متغیر مختلف محسوب میشوند چون یکی از آنها با حرف کوچک mو دیگری با
حرف بزرگ Mشروع میشود .شما نمیتوانید دو متغیر را که دقیق شبیه هم هستند را در یک ( scopeمحدوده) تعریف کنیدScope .
به معنای یک بلوک کد است که متغیر در آن قاب ل دسترسی و استفاده است .در مورد Scopeدر فصلهای آینده بیشتر توضیح
خواهیم داد .متغیر دارای نوع هست که نوع داده ای را که در خود ذخیره میکند را نشان میدهد .معمولترین انواع داده ،int
Boolean ،char ،float ،double ،byte ،long ،shortمیباشند .برای مثال شما برای قرار دادن یک عدد صحیح در متغیر باید
انواع ساده
انواع ساده انواعی از دادهها هستند که شامل اعداد ،کاراکترها و مقادیر بولی میباشند .به انواع ساده انواع اصلی نیز گفته میشود
چون از آنها برای ساخت انواع پیچیده تری مانند کالسها و ساختارها استفاده میشود .انواع ساده دارای مجموعه مشخصی از
مقادیر هستند و محدوده خاصی از اعداد را در خود ذخیره میکنند .در جدول زیر انواع ساده و محدوده آنها آمده است:
دامنه نوع
جدول زیر انواعی که مقادیر با ممیز اعشار را میتوانند در خود ذخیره کنند را نشان میدهد:
برای به خاطر سپردن آنها باید از نماد علمی استفاده شود .نوع دیگری از انواع ساده برای ذخیره دادههای غیر عددی به کار میروند
نوع charبرای ذخیره کاراکترهای یونیکد استفاده میشود.کاراکترها باید داخل یک کوتیشن ساده قرار بگیرند مانند (’ .)‘aنوع
boolفقط میتواند مقادیر درست ) (trueیا نادرست ) (falseرا در خود ذخیره کند و بیشتر در برنامههایی که دارای ساختار
استفاده از رشتهها
از رشته برای ذخیره گروهی از کاراکترها مانند یک پیغام استفاده میشود.مقادیر ذخیره شده در یک رشته باید داخل دابل کوتیشن
قرار گیرند تا توسط کمپایلر به عنوان یک رشته در نظر گرفته شوند ،مانند (” .)“massageجاوا دارای نوعی به نام رشته نیست ،بلکه
رشتهها اشیایی هستند که از روی کالس ( Stringحرف Sبه صورت بزرگ نوشته میشود) ساخته میشوند .با مفاهیم شیء و
کالس در درسهای آینده آشنا میشوید .فقط در همین حد کافی است که بدانید که از رشتهها برای نمایش متن استفاده میشود.
مثال برای نمایش متن Hello Worldمیتوان به صورت زیر عمل کرد :
دلیل اینکه در این قسمت درباره رشتهها مختصری توضیح دادیم این است که ممکن است در آموزشهای بعدی با آنها سر و کار
داشته باشیم .در آینده به طور مفصل در مورد رشتهها توضیح میدهیم.
استفاده از متغیرها
در مثال زیر نحوه تعریف و مقدار دهی متغیرها نمایش داده شده است:
num1 = 1
num2 = 2
num3 = 3.54
num4 = 4.12
boolVal = true
myChar = R
تعریف متغیر
ابتدا باید نوع دادههایی را که این متغیرها قرار است در خود ذخیره. متغیرهایی با نوع و نام متفاوت تعریف شدهاند33-31 در خطوط
همیشه به یاد داشته باشید که قبل از.کنند را مشخص کنیم و سپس یک نام برای آنها در نظر بگیریم و در آخر سیمیکولن بگذاریم
int num1;
int num2;
double num3;
double num4;
boolean boolVal;
char myChar;
data_type identifier;
نیز نام متغیر است که به ما امکان استفاده و دسترسیIdentifier . ... وdouble ،int همان نوع داده است مانندdate_type
: برای تعریف چند متغیر از یک نوع میتوان به صورت زیر عمل کرد.به مقدار متغیر را میدهد
مثال
در مثال باال 1متغیر از نوع صحیح تعریف شده است .توجه داشته باشید که بین متغیرها باید عالمت کاما ) (,باشد.
نامگذاری متغیرها
نام متغیر باید با یک حرف یا زیرخط و به دنبال آن حرف یا عدد شروع شود.
نمیتوان از کاراکترهای خاص مانند & ،% ،#یا عدد برای شروع نام متغیر استفاده کرد مانند .2numbers
نام متغیر نباید دارای فاصله باشد .برای نامهای چند حرفی میتوان به جای فاصله از عالمت زیرخط یا ...استفاده
کرد.
نامهای مجاز:
اگر به نامهای مجاز در مثال باال توجه کنید متوجه قراردادهای به کار رفته در نامگذاری آنها خواهید شد .یکی از روشهای نامگذاری،
نامگذاری کوهان شتری است .در این روش که برای متغیرهای دو کلمه ای به کار میرود ،اولین حرف اولین کلمه با حرف کوچک و
اولین حرف دومین کلمه با حرف بزرگ نمایش داده میشود مانند .myNumber :توجه کنید که اولین حرف کلمه Numberبا حرف
بزرگ شروع شده است .مثال دیگر کلمه numberOfStudentsاست .اگر توجه کنید بعد از اولین کلمه حرف اول سایر کلمات با
محدوده متغیر
در کد ابتدای درس ،متغیرها در داخل متد )( mainتعریف شده اند .در نتیجه ،این متغیرها فقط در داخل متد )( mainقابل
دسترسی و استفاده هستند .محدوده یک متغیر مشخص میکند که متغیر در کجای کد قابل دسترسی است .هنگامیکه برنامه به
پایان متد )( mainمیرسد متغیرها از محدوده خارج و بدون استفاده میشوند تا زمانی که برنامه در حال اجراست.محدوده متغیرها
انواعی دارد که در درسهای بعدی با آنها آشنا میشوید .تشخیص محدوده متغیر بسیار مهم است چون به وسیله آن میفهمید
که در کجای کد میتوان از متغیر استفاده کرد .باید یاد آور شد که دو متغیر در یک محدوده نمیتوانند دارای نام یکسان باشند .مثال
;int num1
;int num1
از آنجاییکه جاوا به بزرگی و کوچک بودن حروف حساس است میتوان از این خاصیت برای تعریف چند متغیر هم نام ولی با حروف
متفاوت (از لحاظ بزرگی و کوچکی) برای تعریف چند متغیر از یک نوع استفاده کرد مانند:
;int num1
;int Num1
;int NUM1
مقداردهی متغیرها
میتوان فورا بعد از تعریف متغیرها مقادیری را به آنها اختصاص داد .این عمل را مقداردهی مینامند .در زیر نحوه مقدار دهی
همچنین میتوان چندین متغیر را فقط با گذاشتن کاما بین آنها به سادگی مقدار دهی کرد:
تعریف متغیر با مقدار دهی متغیرها متفاوت است .تعریف متغیر یعنی انخاب نوع و نام برای متغیر ولی مقدار دهی یعنی اختصاص
در زیر نحوه اختصاص مقادیر به متغیرها نشان داده شده است:
;num1 = 1
;num2 = 2
;num3 = 3.54
;num4 = 4.12
;boolVal = true
;'myChar = 'R
به این نکته توجه کنید که شما به متغیری که هنوز تعریف نشده نمیتوانید مقدار بدهید .شما فقط میتوانید از متغیرهایی استفاده
کنید که هم تعریف و هم مقدار دهی شده باشند .مثال متغیرهای باال همه قابل استفاده هستند .در این مثال num1و num2هر دو
تعریف شدهاند و مقادیری از نوع صحیح به آنها اختصاص داده شده است .اگر نوع داده با نوع متغیر یکی نباشد برنامه پیغام
خطا میدهد.
جانگهدار)(Placeholders
به متد )( formatاز کالس MessageFormatدر خطوط ( )51-15توجه کنید .برای استفاده از متد )( formatو کالس
;import java.text.MessageFormat
این متد دو آرگومان قبول میکند .آرگومانها اطالعاتی هستند که متد با استفاده از آنها کاری انجام میدهد .آرگومانها به وسیله
کاما از هم جدا میشوند .آرگومان اول یک رشته قالب بندی شده است و آرگومان دوم مقداری است که توسط رشته قالب بندی
شده مورد استفاده قرار میگیرد .اگر به دقت نگاه کنید رشته قالب بندی شده دارای عدد صفری است که در داخل دو آکوالد محصور
شده است .البته عدد داخل دو آکوالد میتواند از صفر تا nباشد .به این اعداد جانگهدار می گویند .این اعداد بوسیله مقدار آرگومان
بعد جایگزین میشوند .به عنوان مثال جانگهدار } {0به این معناست که اولین آرگومان (مقدار) بعد از رشته قالب بندی شده در آن
1۵ مبانی زبان جاوا
قرار میگیرد .متد )( formatعمال میتواند هر تعداد آرگومان قبول کند اولین آرگومان همان رشته قالب بندی شده است که جانگهدار
در آن قرار دارد و دومین آرگومان مقداری است که جایگزین جانگهدار میشود .در مثال زیر از 3جانگهدار استفاده شده است:
System.out.println(MessageFormat.format("The values are {0}, {1}, {2}, and {3}.", value1, value2,
;)value3, value4
جانگهدارها از صفر شروع میشوند .تعداد جانگهدارها باید با تعداد آرگومانهای بعد از رشته قالب بندی شده برابر باشد .برای مثال
اگر شما چهار جانگهدار مثل باال داشته باشید باید چهار مقدار هم برای آنها بعد از رشته قالب بندی شده در نظر بگیرید .اولین جا
نگهدار با دومین آرگومان و دومین جا نگهدار با سومین آرگومان جایگزین میشود .در ابتدا فهمیدن این مفهوم برای کسانی که تازه
برنامه نویسی را شروع کردهاند سخت است .اما در درسهای آینده مثالهای زیادی در این مورد مشاهده خواهید کرد.
ثابت
ثابتها انواعی از متغیرها هستند که مقدار آنها در طول برنامه تغییر نمیکند .ثابتها حتما باید مقدار دهی اولیه شوند و اگر
مقدار دهی آنها فراموش شود در برنامه خطا به وجود میآید .بعد از این که به ثابتها مقدار اولیه اختصاص داده شد هرگز در
زمان اجرای برنامه نمیتوان آن را تغییر داد .برای تعریف ثابتها باید از کلمه کلیدی finalاستفاده کرد .معموال نام ثابتها را
طبق قرارداد با حروف بزرگ مینویسند تا تشخیص آنها در برنامه راحت باشد .نحوه تعریف ثابت در زیر آمده است:
مثال:
;package myfirstprogram
در این مثال میبینید که مقدار دادن به یک ثابت ،که قبال مقدار دهی شده برنامه را با خطا مواجه میکند .نکتهی دیگری که نباید
فراموش شود این است که ،نباید مقدار ثابت را با مقدار دیگر متغیرهای تعریف شده در برنامه برابر قرار داد .مثال:
;int someVariable
;final int MY_CONST = someVariable
ممکن است این سؤال برایتان پیش آمده باشد که دلیل استفاده از ثابتها چیست؟ اگر مطمئن هستید که مقادیری در برنامه
وجود دارند که هرگز در طول برنامه تغییر نمیکنند بهتر است که آنها را به صورت ثابت تعریف کنید .این کار هر چند کم ،کیفیت
تبدیل ضمنی
تبدیل ضمنی یا تبدیل بزرگ کننده یا widening conversionیک نوع تبدیل است که به طور خودکار انجام میشود .در این نوع
تبدیل در صورتی یک متغیر از یک نوع داده میتواند به یک نوع دیگر تبدیل شود که مقدار آن از مقدار داده ای که میخواهد به
آن تبدیل شود کمتر باشد .به عنوان مثال نوع داده ای byteمیتواند مقادیر 3تا 511را در خود ذخیره کند و نوع داده ای int
مقادیر -5331301130تا 5331301131را شامل میشود .پس میتوانید یک متغیر از نوع byteرا به یک نوع intتبدیل کنید
:
در مثال باال مقدار number1برابر 1است در نتیجه متغیر number2که یک متغیر از نوع صحیح است میتواند مقدار number1
را در خود ذخیره کند چون نوع صحیح از نوع بایت بزرگتر است .پس متغیر number1که یک متغیر از نوع بایت است میتواند
به طور ضمنی به number2که یک متغیر از نوع صحیح است تبدیل شود .اما عکس مثال باال صادق نیست.
در این مورد ما با خطا مواجه میشویم .اگر چه مقدار 1متغیر number1در محدوده مقادیر byteیعنی اعداد بین 3-511قرار دارد
اما متغیر ی از نوع بایت حافظه کمتری نسبت به متغیری از نوع صحیح اشغال میکند .نوع byteشامل 0بیت یا 0رقم دودویی
است در حالی که نوع intشامل 15بیت یا رقم باینری است.یک عدد باینری عددی متشکل از 3و 3است .برای مثال عدد 1در
کامپیوتر به عدد باینری 333ترجمه میشود .بنابراین وقتی ما عدد 1را در یک متغیر از نوع بایت ذخیره میکنیم ،عددی به صورت
00000101
و وقتی آن را در یک متغیر از نوع صحیح ذخیره میکنیم ،به صورت زیر نمایش داده میشود:
00000000000000000000000000000101
بنابراین قرار دادن یک مقدار intدر یک متغیر byteدرست مانند این است که ما سعی کنیم که یک توپ فوتبال را در یک
سوراخ کوچک گلف جای دهیم .برای قرار دادن یک مقدار intدر یک متغیر از نوع byteمیتوان از تبدیل صریح استفاه کرد که
در درسهای آینده توضیح داده میشود .نکته دیگری که نباید فراموش شود این است که شما نمیتوانید اعداد با ممیز اعشار را به
یک نوع intتبدیل کنید چون این کار باعث از بین رفتن بخش اعشاری این اعداد میشود.
تبدیالتی که جاوا به صورت ضمنی میتواند انجام دهد در زیر آمده است:
byte > short > int > long > float > double
تبدیل صریح
تبدیل صریح یا تبدیل کوچک کننده یا Narrowing Castingنوعی تبدیل است که برنامه را مجبور میکند که یک نوع داده را به
نوعی دیگر تبدیل کند اگر این نوع تبدیل از طریق تبدیل ضمنی انجام نشود .در هنگام استفاده از این تبدیل باید دقت کرد .چون
در این نوع تبدیل ممکن است ،مقادیر اصالح یا حذف شوند .ما میتوانیم این عملیات را با استفاده از Castانجام دهیمCast .
فقط نام دیگر تبدیل صریح است و دستور آن به صورت زیر است:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 13
همانطور که قبال مشاهده کردید نوع intرا نتوانستیم به نوع byteتبدیل کنیم اما اکنون با استفاده از عمل Castاین تبدیل
حال اگر برنامه را اجرا کنید با خطا مواجه نخواهید شد .همانطور که پیشتر اشاره شد ممکن است در هنگام تبدیالت مقادیر اصلی
تغییر کنند .برای مثال وقتی که یک عدد با ممیز اعشار مثال از نوع doubleرا به یک نوع intتبدیل میکنیم مقدار اعداد بعد از
;)System.out.println(number2
5
خروجی کد باال عدد 1است چون نوع داده ای intنمیتواند مقدار اعشار بگیرد .حالت دیگر را تصور کنید .اگر شما بخواهید یک
متغیر را که دارای مقداری بیشتر از محدوده متغیر مقصد هست تبدیل کنید چه اتفاقی میافتد؟ مانند تبدیل زیر که میخواهیم
متغیر number1را که دارای مقدار 133است را به نوع بایت تبدیل کنیم که محدود اعداد بین 3-511را پوشش میدهد.
خروجی کد باال عدد 33است Byte .فقط میتواند شامل اعداد 3تا 511باشد و نمیتواند مقدار 133را در خود ذخیره کند .حال
میخواهیم ببینیم که چرا به جای عدد 133ما عدد 33را در خروجی میگیریم .این کار به تعداد بیتها بستگی دارد .یک byte
دارای 0بیت است در حالی که intدارای 15بیت است .حال اگر به مقدار باینری 5عدد توجه کنید متوجه میشوید که چرا
300 = 00000000000000000000000100101100
= 255 11111111
= 44 00101100
خروجی باال نشان میدهد که بیشترین مقدار byteکه عدد 511است میتواند فقط شامل 0بیت باشد ( )33333333بنابراین فقط 0
بیت اول مقدار intبه متغیر byteانتقال مییابد که شامل ( )33333333یا عدد 33در مبنای 33است.
عبارات و عملگرها
ابتدا با دو کلمه آشنا شوید:
مثال X+Yیک عبارت است که در آن Xو Yعملوند و عالمت +عملگر به حساب میآیند .زبانهای برنامه نویسی جدید دارای
عملگرهایی هستند که از اجزاء معمول زبان به حساب میآیند .جاوا دارای عملگرهای مختلفی از جمله عملگرهای ریاضی ،تخصیصی،
مقایسه ای ،منطقی و بیتی میباشد .از عملگرهای ساده ریاضی میتوان به عملگر جمع و تفریق اشاره کرد .سه نوع عملگر در جاوا
وجود دارد:
انواع مختلف عملگر که در ای بخش مورد بحث قرار میگیرند ،عبارتاند از:
عملگرهای ریاضی
جاوا از عملگرهای ریاضی برای انجام محاسبات استفاده میکند .جدول زیر عملگرهای ریاضی جاوا را نشان میدهد:
Var1برابر است با حاصل جمع var2و var3 ;var1 = var2 + var3 Binary +
Var1برابر است با حاصل تفریق var2و var3 ;var1 = var2 – var3 Binary -
Var1برابر است با حاصلضرب var2در var3 ;var1 = var2 * var3 Binary *
Var1برابر است با حاصل تقسیم var2بر var3 ;var1 = var2 / var3 Binary /
Var1برابر است با باقیمانده تقسیم var2و var3 ;var1 = var2 % var3 Binary %
دیگر عملگرهای جاوا عملگرهای کاهش و افزایش هستند.این عملگرها مقدار 3را از متغیرها کم یا به آنها اضافه میکنند .از این
مقدار var1برابر است با .var2به متغیر var2یک واحد اضافه میشود . ;var1 = var2++ Unary ++
مقدار var1برابر است با .var2از متغیر var2یک واحد کم میشود . ;var1 = var2-- Unary --
11 مبانی زبان جاوا
بیاید افزایشvar2 اگر عملگر قبل از متغیر.به این نکته توجه داشته باشید که محل قرار گیری عملگر در نتیجه محاسبات تأثیر دارد
میشود و سپس متغیرvar2 برابرvar1 قرار بگیرند ابتداvar2 چنانچه عملگرها بعد از متغیر. اتفاق میافتدvar1 یا کاهش
package myfirstprogram;
import java.text.MessageFormat;
x = ++y;
System.out.println(MessageFormat.format("x= {0}",x));
System.out.println(MessageFormat.format("y= {0}", y));
}
}
x=2
y=2
package myfirstprogram;
import java.text.MessageFormat;
x = --y;
System.out.println(MessageFormat.format("x= {0}",x));
System.out.println(MessageFormat.format("y= {0}", y));
}
}
x=0
y=0
کمy باعث میشود که ابتدا یک واحد ازy قبل از عملوند++ و-- درج عملگرهای،همانطور که در دو مثال باال مشاهده میکنید
: حال به دو مثال زیر توجه کنید. قرار بگیردx اضافه شود و سپس نتیجه در عملوندy و یا یک واحد به
package myfirstprogram;
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 10
import java.text.MessageFormat;
x = y--;
System.out.println(MessageFormat.format("x= {0}",x));
System.out.println(MessageFormat.format("y= {0}", y));
}
}
x=1
y=0
package myfirstprogram;
import java.text.MessageFormat;
x = y++;
System.out.println(MessageFormat.format("x= {0}",x));
System.out.println(MessageFormat.format("y= {0}", y));
}
}
x=1
y=2
در داخلy باعث میشود که ابتدا مقدارy بعد از عملوند++ و-- در عملگرهای،همانطور که در دو مثال باال مشاهده میکنید
حال میتوانیم با ایجاد یک برنامه نحوه عملکرد. کم و یا یک واحد به آن اضافه شودy قرار بگیرد و سپس یک واحد ازx متغیر
package myfirstprogram;
import java.text.MessageFormat;
برنامه باال نتیجه هر عبارت را نشان میدهد .در این برنامه از متد )( printlnبرای نشان دادن نتایج در سطرهای متفاوت استفاده
شده است .در این مثال با یک نکته عجیب مواجه میشویم و آن حاصل تقسیم دو عدد صحیح است .وقتی که دو عدد صحیح را
بر هم تقسیم کنیم حاصل باید یک عدد صحیح و فاقد بخش کسری باشد .اما همانطور که مشاهده میکنید اگر فقط یکی از اعداد
را به نوع اعشاری doubleتبدیل کنیم (در مثال میبینید) حاصل به صورت اعشار نشان داده میشود.
عملگرهای تخصیصی
نوع دیگر از عملگرهای جاوا عملگرهای جایگزینی نام دارند.این عملگرها مقدار متغیر سمت راست خود را در متغیر سمت چپ قرار
مقدار var1برابر است با حاصل جمع var1و var2 ;var1 += var2 =+
مقدار var1برابر است با حاصل تفریق var1و var2 ;var1 -= var2 =-
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 13
مقدار var1برابر است با حاصل ضرب var1در var2 ;var1 *= var2 =*
مقدار var1برابر است با حاصل تقسیم var1بر var2 ;var1 /= var2 =/
مقدار var1برابر است با باقیمانده تقسیم var1بر var2 ;var1 %= var2 =%
از عملگر = +برای اتصال دو رشته نیز میتوان استفاده کرد.استفاده از این نوع عملگرها در واقع یک نوع خالصه نویسی در کد است.
مثال شکل اصلی کد var1 += var2به صورت var1 = var1 + var2میباشد .این حالت کدنویسی زمانی کارایی خود را نشان
میدهد که نام متغیرها طوالنی باشد .برنامه زیر چگونگی استفاده از عملگرهای تخصیصی و تأثیر آنها را بر متغیرها نشان میدهد.
;package myfirstprogram
;import java.text.MessageFormat
;)"System.out.println("Assigning 10 to number...
;number = 10
;))System.out.println(MessageFormat.format("Number = {0}", number
;)"System.out.println("Adding 10 to number...
;number += 10
;))System.out.println(MessageFormat.format("Number = {0}", number
;)"System.out.println("Subtracting 10 to number...
;number -= 10
;))System.out.println(MessageFormat.format("Number = {0}", number
}
}
Assigning 10 to number...
Number = 10
Adding 10 to number...
Number = 20
Subtracting 10 from number...
Number = 10
در برنامه از 1عملگر تخصیصی استفاده شده است .ابتدا یک متغیر و مقدار 33با استفاده از عملگر = به آن اختصاص داده شده
است .سپس به آن با استفاده از عملگر = +مقدار 33اضافه شده است.و در آخر به وسیله عملگر = -عدد 33از آن کم شده است.
از عملگرهای مقایسه ای برای مقایسه مقادیر استفاده میشود .نتیجه این مقادیر یک مقدار بولی(منطقی) است .این عملگرها اگر
نتیجه مقایسه دو مقدار درست باشد مقدار trueو اگر نتیجه مقایسه اشتباه باشد مقدار falseرا نشان میدهند .این عملگرها
به طور معمول در دستورات شرطی به کار میروند به این ترتیب که باعث ادامه یا توقف دستور شرطی میشوند .جدول زیر عملگرهای
var1در صورتی trueاست که مقدار var2با مقدار var3 var1 = var2 == var3 Binary ==
var1در صورتی trueاست که مقدار var2با مقدار var3 var1 = var2 != var3 Binary =!
var1در صورتی trueاست که مقدار var2کوچکتر از var3 var1 = var2 < var3 Binary <
var1در صورتی trueاست که مقدار var2بزرگتر ازمقدار var3 var1 = var2 > var3 Binary >
var1در صورتی trueاست که مقدار var2کوچکتر یا مساوی var1 = var2 <= var3 Binary =<
var1در صورتی trueاست که مقدار var2بزرگتر یا مساوی var1 = var2 >= var3 Binary =>
;package myfirstprogram
;import java.text.MessageFormat
}System.out.println(MessageFormat.format("{0 == }{1 : {2}", num1, num2, num1 == ;))num2
}System.out.println(MessageFormat.format("{0 =! }{1 : {2}", num1, num2, num1 =! ;))num2
}System.out.println(MessageFormat.format("{0 < }{1 : {2}", num1, num2, num1 < ;))num2
}System.out.println(MessageFormat.format("{0 > }{1 : {2}", num1, num2, num1 > ;))num2
}System.out.println(MessageFormat.format("{0 =< }{1 : {2}", num1, num2, num1 =< ;))num2
}System.out.println(MessageFormat.format("{0 => }{1 : {2}", num1, num2, num1 => ;))num2
}
}
در مثال باال ابتدا دو متغیر را که میخواهیم با هم مقایسه کنیم را ایجاد کرده و به آنها مقادیری اختصاص میدهیم.سپس با
استفاده از یک عملگر مقایسه ای آنها را با هم مقایسه کرده و نتیجه را چاپ میکنیم .به این نکته توجه کنید که هنگام مقایسه
دو متغیر از عملگر == به جای عملگر = باید استفاده شود .عملگر = عملگر تخصیصی است و در عبارتی مانند x = yمقدار yرا
در به xاختصاص میدهد .عملگر == عملگر مقایسه ای است که دو مقدار را با هم مقایسه میکند مانند x==yو اینطور خوانده
عملگرهای منطقی
عملگرهای منطقی بر روی عبارات منطقی عمل میکنند و نتیجه آنها نیز یک مقدار بولی است .از این عملگرها اغلب برای شرطهای
پیچیده استفاده میشود .همانطور که قبال یاد گرفتید مقادیر بولی میتوانند falseیا trueباشند .فرض کنید که var2و
اگر مقادیر دو طرف عملگر true ،ANDباشند عملگر ANDمقدار trueرا بر میگرداند .در غیر اینصورت اگر یکی از مقادیر یا هر
دوی آنها falseباشند مقدار falseرا بر میگرداند .در زیر جدول درستی عملگر ANDنشان داده شده است:
برای درک بهتر تأثیر عملگر ANDیادآوری میکنم که این عملگر فقط در صورتی مقدار trueرا نشان میدهد که هر دو عملوند
مقدارشان trueباشد.در غیر اینصورت نتیجه تمام ترکیبهای بعدی falseخواهد شد .استفاده از عملگر ANDمانند استفاده از
عملگرهای مقایسه ای است .به عنوان مثال نتیجه عبارت زیر درست ) (trueاست اگر سن ) (ageبزرگتر از 30و salary
کوچکتر از 3333باشد.
عملگر ANDزمانی کارامد است که ما با محدود خاصی از اعداد سرو کار داریم .مثال عبارت 10 <= x <= 100بدین معنی است
که xمیتواند مقداری شامل اعداد 33تا 333را بگیرد .حال برای انتخاب اعداد خارج از این محدوده میتوان از عملگر منطقی AND
اگر یکی یا هر دو مقدار دو طرف عملگر ،ORدرست ) (trueباشد ،عملگر ORمقدار trueرا بر میگرداند .جدول درستی عملگر
در جدول باال مشاهده میکنید که عملگر ORدر صورتی مقدار falseرا بر میگرداند که مقادیر دو طرف آن falseباشند .کد
زیر را در نظر بگیرید.نتیجه این کد در صورتی درست ) (trueاست که رتبه نهایی دانش آموز ) (finalGradeبزرگتر از 11یا
برخالف دو اپراتور ORو ANDعملگر منطقی NOTیک عملگر یگانی است و فقط به یک عملوند نیاز دارد .این عملگر یک مقدار یا
اصطالح بولی را نفی میکند .مثال اگر عبارت یا مقدار trueباشد آنرا falseو اگر falseباشد ،آنرا trueمیکند .جدول زیر
X !X
true false
false true
عملگرهای بیتی
1۱ مبانی زبان جاوا
عملگرهای بیتی به شما اجازه میدهند که شکل باینری انواع دادهها را دستکاری کنید .برای درک بهتر این درس توصیه میشود که
شما سیستم باینری و نحوه تبدیل اعداد دهدهی به باینری را از لینک زیر یاد بگیرید :
http://www.w3-farsi.com/?p=5698
در سیستم باینری (دودویی) که کامپیوتر از آن استفاده میکند ،وضعیت هر چیز یا خاموش است یا روشن .برای نشان دادن حالت
روشن از عدد 3و برای نشان دادن حالت خاموش از عدد 3استفاده میشود.بنابراین اعداد باینری فقط میتوانند صفر یا یک باشند.
اعداد باینری را اعداد در مبنای 5و اعداد اعشاری را اعداد در مبنای 33می گویند .یک بیت نشان دهنده یک رقم باینری است و هر
بایت نشان دهنده 0بیت است .به عنوان مثال برای یک داده از نوع intبه 15بیت یا 0بایت فضا برای ذخیره آن نیاز داریم،
این بدین معناست که اعداد از 15رقم 3و 3برای ذخیره استفاده میکنند .برای مثال عدد 333وقتی به عنوان یک متغیر از نوع
000000000000000000000000000001100100
عدد 333در مبنای ده معادل عدد 3333333در مبنای 5است .در اینجا 1رقم سمت راست نشان دهنده عدد 333در مبنای 5است و
مابقی صفرهای سمت راست برای پر کردن بیتهایی است که عدد از نوع intنیاز دارد .به این نکته توجه کنید که اعداد باینری
از سمت راست به چپ خوانده میشوند .عملگرهای بیتی جاوا در جدول زیر نشان داده شدهاند:
عملگر بیتی ANDکاری شبیه عملگر منطقی ANDانجام میدهد با این تفاوت که این عملگر بر روی بیتها کار میکند.اگر مقادیر
دو طرف آن 3باشد مقدار 3را بر میگرداند و اگر یکی یا هر دو طرف آن صفر باشد مقدار صفر را بر میگرداند .جدول درستی عمگر
;)System.out.println(result
1
همانطور که در مثال باال مشاهده میکنید نتیجه عملکرد عملگر ANDبر روی دو مقدار 1و 1عدد یک میشود.اجازه بدهید ببینیم
5: 00000000000000000000000000000101
3: 00000000000000000000000000000011
------------------------------------
1: 00000000000000000000000000000001
ابتدا دو عدد 1و 1به معادل باینریشان تبدیل میشوند .از آنجاییکه هر عدد صحیح 15بیت است از صفر برای پر کردن بیتهای
خالی استفاده میکنیم .با استفاده از جدول درستی عملگر بیتی ANDمیتوان فهمید که چرا نتیجه عدد یک میشود.
11 مبانی زبان جاوا
اگر مقادیر دو طرف عملگر بیتی ORهر دو صفر باشند نتیجه صفر در غیر اینصورت 3خواهد شد .جدول درستی این عملگر در زیر
آمده است:
نتیجه عملگر بیتی ORدر صورتی صفر است که عملوندهای دو طرف آن صفر باشند .اگر فقط یکی از دو عملوند یک باشد نتیجه
;)System.out.println(result
15
وقتی که از عملگر بیتی ORبرای دو مقدار در مثال باال ( 1و )6استفاده میکنیم نتیجه 31میشود.حال بررسی میکنیم که چرا این
7: 00000000000000000000000000000111
9: 00000000000000000000000000001001
-----------------------------------
15: 00000000000000000000000000001111
با استفاده از جدول درستی عملگر بیتی ORمیتوان نتیجه استفاده از این عملگر را تشخیص داد.عدد 3333باینری معادل عدد 31
صحیح است.
در صورتیکه عملوندهای دو طرف این عملگر هر دو صفر یا هر دو یک باشند نتیجه صفر ،در غیر اینصورت نتیجه یک میشود .در
مثال زیر تأثیر عملگر بیتی XORرا بر روی دو مقدار مشاده میکنید:
;)System.out.println(result
2
در زیر معادل باینری اعداد باال ( 1و )1نشان داده شده است.
5: 00000000000000000000000000000101
7: 00000000000000000000000000000111
-----------------------------------
2: 00000000000000000000000000000010
با نگاه کردن به جدول درستی عملگر بیتی ،XORمیتوان فهمید که چرا نتیجه عدد 5میشود.
این عملگر یک عملگر یگانی است و فقط به یک عملوند نیاز دارد.در زیر جدول درستی این عملگر آمده است:
1 0
0 1
عملگر بیتی NOTمقادیر بیتها را معکوس میکند.در زیر چگونگی استفاده از این عملگر آمده است:
;)System.out.println(result
به نمایش باینری مثال باال که در زیر نشان داده شده است توجه نمایید:
7: 00000000000000000000000000000111
------------------------------------
-8: 11111111111111111111111111111000
این نوع عملگرها به شما اجازه میدهند که بیتها را به سمت چپ یا راست جا به جا کنید .دو نوع عملگر بیتی تغییر مکان وجود
دارد که هر کدام دو عملوند قبول میکنند .عملوند سمت چپ این عملگرها حالت باینری یک مقدار و عملوند سمت راست تعداد
این عملگر بیتهای عملوند سمت چپ را به تعداد nمکان مشخص شده توسط عملوند سمت راست ،به سمت چپ منتقل میکند.
;)System.out.println(result
40
در مثال باال ما بیتهای مقدار 33را دو مکان به سمت چپ منتقل کردهایم ،حال بیایید تأثیر این انتقال را بررسی کنیم:
10: 00000000000000000000000000001010
------------------------------------
40: 00000000000000000000000000101000
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 03
مشاهده میکنید که همه بیتها به اندازه دو واحد به سمت چپ منتقل شدهاند .در این انتقال دو صفر از صفرهای سمت چپ کم
این عملگر شبیه به عمگر تغییر مکان به سمت چپ است با این تفاوت که بیتها را به سمت راست جا به جا میکند .به عنوان
مثال:
;)System.out.println(result
6
با استفاده از عملگر تغییر مکان به سمت راست بیتهای مقدار 333را به اندازه 3واحد به سمت چپ جا به جا میکنیم .اجازه بدهید
100: 00000000000000000000000001100100
------------------------------------
6: 00000000000000000000000000000110
هر بیت به اندازه 3واحد به سمت راست منتقل میشود ،بنابراین 3بیت اول سمت راست حذف شده و چهار صفر به سمت چپ
اضافه میشود.
تقدم عملگرها
تقدم عملگرها مشخص میکند که در محاسباتی که بیش از دو عملوند دارند ابتدا کدام عملگر اثرش را اعمال کند .عملگرها در جاوا
;number = 1 + 2 * 3 / 1
اگر ما حق تقدم عملگرها را رعایت نکنیم و عبارت باال را از سمت چپ به راست انجام دهیم نتیجه 6خواهد شد ( 3+5=1سپس
1×1=6و در آخر .)6/3=6اما کمپایلر با توجه به تقدم عملگرها محاسبات را انجام میدهد.برای مثال عمل ضرب و تقسیم نسبت به
1۵ مبانی زبان جاوا
جمع و تفریق تقدم دارند .بنابراین در مثال فوق ابتدا عدد 5ضربدر 1و سپس نتیجه آنها تقسیم بر 3میشود که نتیجه 1به دست
میآید.در آخر عدد 1با 3جمع میشود و عدد 1حاصل میشود .در جدول زیر تقدم برخی از عملگرهای جاوا آمده است:
تقدم عملگر
*, /, %
+, -
>> <<,
=! ==,
&
^
|
&&
||
ابتدا عملگرهای با باالترین و سپس عملگرهای با پایینترین حق تقدم در محاسبات تأثیر میگذارند.به این نکته توجه کنید که تقدم
عملگرها ++و --به مکان قرارگیری آنها بستگی دارد (در سمت چپ یا راست عملوند باشند) .به عنوان مثال:
در عبارت اول ابتدا به مقدار numberیک واحد اضافه شده و 3میشود و سپس مقدار جدید با عدد 1جمع میشود و در نهایت
عدد 1به دست میآید .در عبارت دوم مقدار عددی 1به مقدار numberاضافه میشود و عدد 1به دست میآید .سپس این مقدار
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 05
در متغیر number2قرار میگیرد .و در نهایت مقدار numberبه 3افزایش مییابد .برای ایجاد خوانایی در تقدم عملگرها و انجام
در مثال باال ابتدا هر کدام از عباراتی که داخل پرانتز هستند مورد محاسبه قرار میگیرند .به نکته ای در مورد عبارتی که در داخل
پرانتز سوم قرار دارد ،توجه کنید.در این عبارت ابتدا مقدار داخلیترین پرانتز مورد محاسبه قرار میگیرد .یعنی مقدار 1ضربدر 1شده
و سپس از 1کم میشود .اگر دو یا چند عملگر با حق تقدم یکسان موجود باشد ابتدا باید هر کدام از عملگرها را که در ابتدای
;number = 3 * 2 + 8 / 4
هر دو عملگر * و /دارای حق تقدم یکسانی هستند .بنابر این شما باید از چپ به راست آنها را در محاسبات تأثیر دهید .یعنی
ابتدا 1را ضربدر 5میکنید و سپس عدد 0را بر 3تقسیم میکنید .در نهایت نتیجه دو عبارت را جمع کرده و در متغیر number
قرار میدهید.
پکیج java.utilقرار دارد و در نتیجه برای استفاده از آن باید آن را در برنامه به صورت زیر وارد کنید:
;import java.util.Scanner
از کالس MessageFormatهم برای قالب بندی خروجی استفاده میکنیم .این دو کالس را در خطوط 1و 3وارد کردهایم .متدهای
کالس Scannerکه مقادیر وارد شده توسط کاربر را از صفحه کلید میخوانند عبارتاند از:
توضیح متد
1 package myfirstprogram;
2
3 import java.text.MessageFormat;
4 import java.util.Scanner;
5
6 public class MyFirstProgram
7 {
8 public static void main(String[] args)
9 {
10 String name;
11 int age;
12 double height;
13
14 Scanner input = new Scanner(System.in);
15
16 System.out.print("Enter your Name: ");
17 name = input.next();
18
19 System.out.print("Enter your Age: ");
20 age = input.nextInt();
21
22 System.out.print("Enter your Height:");
23 height = input.nextDouble();
24
25 System.out.println();
26
27 System.out.println(MessageFormat.format("Name is {0}.", name));
28 System.out.println(MessageFormat.format("Age is {0}.", age));
29 System.out.println(MessageFormat.format("Height is {0}.", height));
30 }
31 }
Name is john.
Age is 18.
Height is 160.5.
اجازه دهید که برنامه را تشریح کنیم .ابتدادر خطوط 1و 3برنامه ،کالس Scannerو MessageFormatرا با استفاده از کلمه
importبه برنامه اضافه کردهایم .در خطوط 33و 33و 35یک شیء برای دریافت نام ،یک متغیر از نوع صحیح به نام ageبرای
دریافت سن و یک متغیر از نوع doubleبرای دریافت قد شخص تعریف نمودهایم .درباره خط 33زیاد توضیح نمیدهم ،فقط
کافیست که این رابدانید که وجود این خط برای دریافت ورودی از کاربر اجباری است .در درسهای آینده با مفاهیم متد ،شیء و
کالس آشنا خواهید شد .برنامه از کاربر میخواهد که نام خود را وارد کند (خط .)31در خط 31شما به عنوان کاربر نام خود را وارد
میکنید .مقدار متغیر ،nameبرابر مقداری است که توسط متد )( nextخوانده میشود.از آنجاییکه nameاز نوع رشته است باید
از متد )( nextبرای دریافت استفاده کنیم .در خط 36برنامه از شما میخواهد که سن خود را وارد کند .در خط 53شما سن خود را
وارد میکنید .مقدار متغیر ،ageبرابر مقداری است که توسط متد )( nextIntخوانده میشود.از آنجاییکه Ageاز نوع صحیح
است باید از متد )( nextIntبرای دریافت استفاده کنیم .سپس برنامه از ما قد را سؤال میکند (خط .)55چون heightاز نوع
doubleاست پس برای خواندن آن از متد )( nextDoubleاستفاده کردهایم .حال شما میتوانید با اجرای برنامه و وارد کردن
ساختارهای تصمیم
تقریبا همه زبانهای برنامه نویسی به شما اجازه اجرای کد را در شرایط مطمئن میدهند .حال تصور کنید که یک برنامه دارای ساختار
تصمیم گیری نباشد و همه کدها را اجرا کند .این حالت شاید فقط برای چاپ یک پیغام در صفحه مناسب باشد ولی فرض کنید که
شما بخواهید اگر مقدار یک متغیر با یک عدد برابر باشد سپس یک پیغام چاپ شود آن وقت با مشکل مواجه خواهید شد .جاوا
راههای مختلفی برای رفع این نوع مشکالت ارائه میدهد .در این بخش با مطالب زیر آشنا خواهید شد:
دستور if
میتوان با استفاده از دستور ifو یک شرط خاص که باعث ایجاد یک کد میشود یک منطق به برنامه خود اضافه کنید.دستور if
سادهترین دستور شرطی است که به برنامه میگوید ،اگر شرطی برقرار است کد معینی را انجام بده .ساختار دستور ifبه صورت
زیر است:
)if (condition
;code to execute
قبل از اجرای دستور ifابتدا شرط بررسی میشود.اگر شرط برقرار باشد یعنی درست باشد سپس کد اجرا میشود .شرط یک عبارت
مقایسه ای است .میتوان از عملگرهای مقایسه ای برای تست درست یا اشتباه بودن شرط استفاده کرد .اجازه بدهید که نگاهی
به نحوه استفاده از دستور ifدر داخل برنامه بیندازیم .برنامه زیر پیغام Hello Worldرا اگر مقدار numberکمتر از 33و Goodbye
Hello World.
Goodbye World.
در خط 0یک متغیر با نام numberتعریف و مقدار 1به آن اختصاص داده شده است .وقتی به اولین دستور ifدر خط 33میرسیم
برنامه تشخیص میدهد که مقدار numberاز 33کمتر است یعنی 1کوچکتر از 33است.
منطقی است که نتیجه مقایسه درست میباشد بنابراین دستور ifدستور را اجرا میکند(خط )35و پیغام Hello Worldچاپ
میشود .حال مقدار numberرا به 31تغییر میدهیم (خط .)31وقتی به دومین دستور ifدر خط 36میرسیم برنامه مقدار number
را با 33مقایسه میکند و چون مقدار numberیعنی 31از 33بزرگتر است برنامه پیغام Goodbye Worldرا چاپ میکند(خط .)53
شما میتوانید چندین دستور را در داخل دستور ifبنویسید .کافیست که از یک آکوالد برای نشان دادن ابتدا و انتهای دستورات
استفاده کنید .همه دستورات داخل بین آکوالد جز بدنه دستور ifهستند .نحوه تعریف چند دستور در داخل بدنه ifبه صورت زیر
است:
)if (condition
{
;statement1
;statement2
.
.
.
;statementN
}
در مثال باال اگر مقدار xاز 33بزرگتر باشد دو پیغام چاپ میشود .حال اگر به عنوان مثال آکوالد را حذف کنیم و مقدار xاز 33
کد باال در صورتی بهتر خوانده میشود که بین دستورات فاصله بگذاریم :
میبیند که دستور دوم (خط )1در مثال باال جز دستور ifنیست .اینجاست که چون ما فرض را بر این گذاشتهایم که مقدار xاز 33
کوچکتر است پس خط )? This is still part of the if statement. (Reallyچاپ میشود .در نتیجه اهمیت وجود
آکوالد مشخص میشود .به عنوان تمرین همیشه حتی اگر فقط یک دستور در بدنه ifداشتید برای آن یک آکوالد بگذارید .فراموش
نکنید که از قلم انداختن یک آکوالد باعث به وجود آمدن خطا شده و یافتن آن را سخت میکند .یکی از خطاهای معمول کسانی
که برنامه نویسی را تازه شروع کردهاند قرار دادن سیمیکولن در سمت راست پرانتز ifاست .به عنوان مثال:
به یاد داشته باشید که ifیک مقایسه را انجام میدهد و دستور اجرایی نیست .بنابراین برنامه شما با یک خطای منطقی مواجه
میشود .همیشه به یاد داشته باشید که قرار گرفتن سیمیکولن در سمت راست پرانتز ifبه منزله این است که بلوک کد در اینجا به
پایان رسیده است .به این نکته توجه داشته باشید که شرطها مقادیر بولی هستند ،بنابراین شما میتوانید نتیجه یک عبارت را در
داخل یک متغیر بولی ذخیره کنید و سپس از متغیر به عنوان شرط در دستور ifاستفاده کنید .اگر مقدار yearبرابر 5333باشد
سپس حاصل عبارت در متغیر isNewMilleniumذخیره میشود.میتوان از متغیر برای تشخیص کد اجرایی بدنه دستور ifاستفاده
)if (isNewMillenium
{
;)"!System.out.println("Happy New Millenium
}
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 00
if else دستور
اما زمانی که شما. یعنی اگر حالتی برقرار بود کارخاصی انجام شود. فقط برای اجرای یک حالت خاص به کار میرودif دستور
. استفاده کنیدif else باید از دستور، دستور دیگر اجرا شود،بخواهید اگر شرط خاصی برقرار شد یک دستور و اگر برقرار نبود
if (condition)
{
code to execute if condition is true;
}
else
{
code to execute if condition is false;
}
اگر فقط یک کد اجرایی در داخل بدنه. به کار برده شودif نمیتوان به تنهایی استفاده کرد بلکه حتما باید باelse از کلمه کلیدی
فقط در صورتی اجرا میشود که شرط داخل دستورelse کد داخل بلوک. دارید استفاده از آکوالد اختیاری استelse و بدنهif
1 package myfirstprogram;
2
3 public class MyFirstProgram
4 {
5 public static void main(String[] args)
6 {
7 int number = 5;
8
9 //Test the condition
10 if (number < 10)
11 {
12 System.out.println("The number is less than 10.");
13 }
14 else
15 {
16 System.out.println("The number is either greater than or equal to 10.");
17 }
18
19 //Modify value of number
20 number = 15;
21
22 //Repeat the test to yield a different result
23 if (number < 10)
24 {
25 System.out.println("The number is less than 10.");
26 }
27 else
28 {
29 System.out.println("The number is either greater than or equal to 10.");
30 }
31 }
1۹ مبانی زبان جاوا
32 }
در خط 1یک متغیر به نام numberتعریف کردهایم و در خط 33تست میکنیم که آیا مقدار متغیر numberاز 33کمتر است یا نه
و چون کمتر است در نتیجه کد داخل بلوک ifاجرا میشود (خط )35و اگر مقدار numberرا تغییر دهیم و به مقداری بزرگتر از
33تغییر دهیم (خط ،)53شرط نادرست میشود (خط )51و کد داخل بلوک elseاجرا میشود (خط .)56مانند بلوک ifنباید
میتوان از دستور ifتو در تو در جاوا استفاده کرد .یک دستور ساده ifدر داخل دستور ifدیگر.
)if (condition
{
;code to execute
)if (condition
{
;code to execute
}
)else if (condition
{
)if (condition
{
;code to execute
}
}
}
else
{
)if (condition
{
;code to execute
}
}
12 {
13 ;)"System.out.println("You are teenage
14 }
15 else
16 {
17 ;)"System.out.println("You are already an adult.
18 }
19 }
20 else
21 {
22 ;)"System.out.println("You are still too young.
23 }
24 }
25 }
اجازه بدهید که برنامه را کالبد شکافی کنیم .ابتدا در خط 1یک متغیر به نام ageتعریف میکنیم و مقدار آن را برابر 53قرار
میدهیم.سپس به اولین دستور ifمیرسیم (خط .)6در این قسمت اگر سن شما بیشتر از 35سال باشد برنامه وارد بدنه دستور
ifمیشود در غیر اینصورت وارد بلوک ( elseخط )53مربوط به همین دستور ifمیشود .حال فرض کنیم که سن شما بیشتر
از 35سال است و شما وارد بدنه اولین ifشدهاید .در بدنه اولین ifیک دستور ifدیگر را مشاهده میکنید .اگر سن کمتر 53
باشد دستور You are teenageچاپ میشود (خط )31در غیر اینصورت دستور ( You are already an adultخط )31و
چون مقدار متغیر تعریف شده در خط 1بزرگتر از 53است پس دستور مربوط به بخش elseخط 31چاپ میشود .حال فرض
کنید که مقدار متغیر ageکمتر از 35بود ،در این صورت دستور بخش elseخط 53یعنی You are still too youngچاپ
میشد .پیشنهاد میشود که از ifتو در تو در برنامه کمتر استفاده کنید چون خوانایی برنامه را پایین میآورد
عملگر شرطی
عملگر شرطی ) (?:در جاوا مانند دستور شرطی if…elseعمل میکند .در زیر نحوه استفاده از این عملگر آمده است:
عملگر شرطی تنها عملگر سه تایی جاوا است که نیاز به سه عملوند دارد ،شرط ،یک مقدار زمانی که شرط درست باشد و یک مقدار
زمانی که شرط نادرست باشد .اجازه بدهید که نحوه استفاده این عملگر را در داخل برنامه مورد بررسی قرار دهیم.
10
برنامه باال نحوه استفاده از این عملگر شرطی را نشان میدهد .در این برنامه قصد ما به دست آوردن قدر مطلق یک عدد است.
ابتدا در خط 1یک متغیر از نوع intتعریف کرده و مقدار آن را -33میگذاریم .در خط 6یک متغیر از نوع صحیح تعریف کردهایم
تا نتیجه را در آن قرار دهیم .خط 6به این صورت تعریف میشود ” :اگر مقدار numberاز 33بزرگتر باشد خود مقدار را در متغیر
ABSقرار بده در غیر اینصورت آن را در منفی ضرب کرده و آن را در متغیر ABSقرار بده” .حال برنامه باال را با استفاده از دستور if
elseمینویسیم:
هنگامی که چندین دستور در داخل یک بلوک ifیا elseدارید از عملگر شرطی استفاده نکنید چون خوانایی برنامه را پایین
میآورد.
دستور ifچندگانه
اگر بخواهید چند شرط را بررسی کنید چکار میکنید؟ میتوانید از چندین دستور ifاستفاده کنید و بهتر است که این دستورات if
)if (condition
{
;code to execute
}
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 65
else
{
)if (condition
{
;code to execute
}
else
{
)if (condition
{
;code to execute
}
else
{
;code to execute
}
}
}
خواندن کد باال سخت است .بهتر است دستورات را به صورت تو رفتگی در داخل بلوک elseبنویسید .میتوانید کد باال را ساده
تر کنید:
)if (condition
{
;code to execute
}
)else if (condition
{
;code to execute
}
)else if (condition
{
;code to execute
}
else
{
;code to execute
}
حال که نحوه استفده از دستور else ifرا یاد گرفتید باید بدانید که مانند else if ،elseنیز به دستور ifوابسته است.دستور
else ifوقتی اجرا میشود که اولین دستور ifاشتباه باشد حال اگر else ifاشتباه باشد دستور else ifبعدی اجرا میشود.
و اگر آن نیز اجرا نشود در نهایت دستور elseاجرا میشود .برنامه زیر نحوه استفاده از دستور if elseرا نشان میدهد:
;package myfirstprogram
خروجی بنامه باال به متغیر choiceوابسته است .بسته به اینکه شما چه چیزی انتخاب میکنید پیغامهای مختلفی چاپ میشود.
اگر عددی که شما تایپ میکنید در داخل حالتهای انتخاب نباشد کد مربوط به بلوک elseاجرا میشود.
عملگرهای منطقی به شما اجازه میدهند که چندین شرط را با هم ترکیب کنید .این عملگرها حداقل دو شرط را درگیر میکنند و در
آخر یک مقدار بولی را بر میگردانند .در جدول زیر برخی از عملگرهای منطقی آمده است:
مقدار Zدر صورتی trueاست که هر دو شرط دو طرف عملگر )z = (x > 2) && (y < 10 And &&
مقدار Zدر صورتی trueاست که یکی از دو شرط دو طرف عملگر )z = (x > 2) || (y < 10 Or ||
مقدار Zدر صورتی trueاست که مقدار شرط falseباشد و در )z = !(x > 2 Not !
به عنوان مثال جمله ) z = (x > 2) && (y < 10را به این صورت بخوانید “ :در صورتی مقدار zبرابر trueاست که مقدار
xبزرگتر از 5و مقدار yکوچکتر از 33باشد در غیر اینصورت falseاست” .این جمله بدین معناست که برای اینکه مقدار کل
دستور trueباشد باید مقدار همه شروط trueباشد .عملگر منطقی )||( ORتأثیر متفاوتی نسبت به عملگر منطقی )&&( AND
دارد .نتیجه عملگر منطقی ORبرابر trueاست اگر فقط مقدار یکی از شروط trueباشد .و اگر مقدار هیچ یک از شروط true
نباشد نتیجه falseخواهد شد .میتوان عملگرهای منطقی ANDو ORرا با هم ترکیب کرده و در یک عبارت به کار برد مانند:
در اینجا استفاده از پرانتز مهم است چون از آن در گروه بندی شرطها استفاده میکنیم .در اینجا ابتدا عبارت < (y > 3) || (z
) 10مورد بررسی قرار میگیرد (به علت تقدم عملگرها) .سپس نتیجه آن بوسیله عملگر ANDبا نتیجه ) (x == 1مقایسه میشود.
حال بیایید نحوه استفاده از عملگرهای منطقی در برنامه را مورد بررسی قرار دهیم:
برنامه باال نحوه استفاده از عملگر منطقی ANDرا نشان میدهد (خط .)53وقتی به دستور ifمیرسید (خط )53برنامه سن شما
را چک میکند .اگر سن شما بزرگتر از 35و کوچکتر از 53باشد (سنتان بین 35و 53باشد) یعنی مقدار هر دو trueباشد ،سپس
کدهای داخل بلوک ifاجرا میشوند .اگر نتیجه یکی از شروط falseباشد کدهای داخل بلوک elseاجرا میشود .عملگر AND
عملوند سمت چپ را مرود بررسی قرار میدهد .اگر مقدار آن falseباشد دیگر عملوند سمت راست را بررسی نمیکند و مقدار
falseرا بر میگرداند .بر عکس عملگر || عملوند سمت چپ را مورد بررسی قرار میدهد و اگر مقدار آن trueباشد سپس عملوند
)if (x == 2 | y == 3
{
//Some code here
}
نکته مهم اینجاست که شما میتوانید از عملگرهای & و | به عنوان عملگر بیتی استفاده کنید .تفاوت جزئی این عملگرها وقتی که
به عنوان عملگر بیتی به کار میروند این است که دو عملوند را بدون در نظر گرفتن مقدار عملوند سمت چپ مورد بررسی قرار
میدهند .به عنوان مثال حتی اگر مقدار عملوند سمت چپ falseباشد عملوند سمت چپ به وسیله عملگر بیتی )&( ANDارزیابی
میشود .اگر شرطها را در برنامه ترکیب کنید استفاده از عملگرهای منطقی )&&( ANDو )||( ORبه جای عملگرهای بیتی )&(AND
و )|( ORبهتر خواهد بود .یکی دیگر از عملگرهای منطقی عملگر )!( NOTاست که نتیجه یک عبارت را خنثی یا منفی میکند .به
دستور switch
در جاوا ساختاری به نام switchوجود دارد که به شما اجازه میدهد که با توجه به مقدار ثابت یک متغیر چندین انتخاب داشته
باشید .دستور switchمعادل دستور ifتو در تو است با این تفاوت که در دستور switchمتغیر فقط مقادیر ثابتی از اعداد،
رشتهها و یا کاراکترها را قبول میکند .مقادیر ثابت مقادیری هستند که قابل تغییر نیستند .در زیر نحوه استفاده از دستور switch
آمده است:
)switch (testVar
{
case compareVal1:
code to execute ;if testVar == compareVa11
;break
case compareVa12:
code to execute ;if testVar == compareVa12
;break
.
.
.
case compareVa1N:
code to execute ;if testVer == compareVa1N
;break
default:
code to execute ;if none of the values above match the testVar
;break
}
ابتدا یک مقدار در متغیر switchکه در مثال باال testVarاست قرار میدهید .این مقدار با هر یک از عبارتهای caseداخل
بلوک switchمقایسه میشود .اگر مقدار متغیر با هر یک از مقادیر موجود در دستورات caseبرابر بود کد مربوط به آن caseاجرا
خواهد شد .به این نکته توجه کنید که حتی اگر تعداد خط کدهای داخل دستور caseاز یکی بیشتر باشد نباید از آکوالد استفاده
کنیم .آخر هر دستور caseبا کلمه کلیدی breakتشخیص داده میشود که باعث میشود برنامه از دستور switchخارج شده و
دستورات بعد از آن اجرا شوند .اگر این کلمه کلیدی از قلم بیوفتد برنامه با خطا مواجه میشود .دستور switchیک بخش
defaultدارد .این دستور در صورتی اجرا میشود که مقدار متغیر با هیچ یک از مقادیر دستورات caseبرابر نباشد .دستور default
۹1 مبانی زبان جاوا
مکان این دستور هم مهم نیست اما بر طبق تعریف آن را در. حذف شود هیچ اتفاقی نمیافتدswitch اختیاری است و اگر از بدنه
1 package myfirstprogram;
2
3 import java.util.Scanner;
4
5 public class MyFirstProgram
6 {
7 public static void main(String[] args)
8 {
9 Scanner input = new Scanner(System.in);
10
11 int choice;
12
13 System.out.println("What's your favorite pet?");
14 System.out.println("[1] Dog");
15 System.out.println("[2] Cat");
16 System.out.println("[3] Rabbit");
17 System.out.println("[4] Turtle");
18 System.out.println("[5] Fish");
19 System.out.println("[6] Not in the choices");
20 System.out.print("Enter your choice: ");
21
22 choice = input.nextInt();
23
24 switch (choice)
25 {
26 case 1:
27 System.out.println("Your favorite pet is Dog.");
28 break;
29 case 2:
30 System.out.println("Your favorite pet is Cat.");
31 break;
32 case 3:
33 System.out.println("Your favorite pet is Rabbit.");
34 break;
35 case 4:
36 System.out.println("Your favorite pet is Turtle.");
37 break;
38 case 5:
39 System.out.println("Your favorite pet is Fish.");
40 break;
41 case 6:
42 System.out.println("Your favorite pet is not in the choices.");
43 break;
44 default:
45 System.out.println("You don't have a favorite pet.");
46 break;
47 }
48 }
49 }
شما عدد را. به اسم هر حیوان یک عدد نسبت داده شده است.برنامه باال به شما اجازه انتخاب حیوان مورد عالقهتان را میدهد
مقایسه میشود و با هر کدام از آن مقادیر که برابر بود پیغام مناسبcase با مقادیرswitch وارد میکنید و این عدد در دستور
یکی دیگر از ویژگیهای. اجرا میشودdefault ها برابر نبود دستورcase اگر هم با هیچ کدام از مقادیر.نمایش داده خواهد شد
در مثال زیر اگر مقدار. برای نشان داده یک مجموعه کد استفاده کنیدcase این است که شما میتوانید از دو یا چندswitch دستور
. ها باید پشت سر هم نوشته شوندcase توجه کنید که. باشد یک کد اجرا میشود1 یا5 ،3 ،number
switch(number)
{
case 1:
case 2:
case 3:
System.out.println("This code is shared by three values.");
break;
}
: برنامه باال را به صورت زیر نیز میتوان نوشت. تو در تو استif معادل دستورswitch همانطور که قبال ذکر شد دستور
if (choice == 1)
System.out.println("Your favorite pet is Dog.");
else if (choice == 2)
System.out.println("Your favorite pet is Cat.");
else if (choice == 3)
System.out.println("Your favorite pet is Rabbit.");
else if (choice == 4)
System.out.println("Your favorite pet is Turtle.");
else if (choice == 5)
System.out.println("Your favorite pet is Fish.");
else if (choice == 6)
System.out.println("Your favorite pet is not in the choices.");
else
System.out.println("You don't have a favorite pet.");
۹۹ مبانی زبان جاوا
کد باال دقیقا نتیجه ای مانند دستور switchدارد .دستور defaultمعادل دستور elseمیباشد .حال از بین این دو دستور
( switchو )if elseکدامیک را انتخاب کنیم .از دستور switchموقعی استفاده میکنیم که مقداری که میخواهیم با دیگر
مقادیر مقایسه شود ثابت باشد .مثال در مثال زیر هیچگاه از switchاستفاده نکنید.
)switch (myNumber
{
case x:
System.out.println("Error, you can't use variables as a value" +
;)"" to be compared in a case statment.
;break
}
مشاهده میکنید که با اینکه مقدار xعدد 1است و به طور واضح با متغیر myNumberمقایسه شده است برنامه خطا میدهد
چون xیک ثابت نیست بلکه یک متغیر است یا به زبان ساده تر ،قابلیت تغییر را دارد .اگر بخواهید از xاستفاده کنید و برنامه خطا
)switch (myNumber
{
case x:
;)"!System.out.println("Error has been fixed
;break
}
از کلمه کلیدی finalبرای ایجاد ثابتها استفاده میشود.توجه کنید که بعد از تعریف یک ثابت نمیتوان مقدار آن را در طول
برنامه تغییر داد .به یاد داشته باشید که باید ثابتها را حتما مقداردهی کنید .دستور switchیک مقدار را با مقادیر caseها
مقایسه میکند و شما الزم نیست که به شکل زیر مقادیر را با هم مقایسه کنید:
)switch (myNumber
{
case x > myNumber:
System.out.println("switch staments can't test if a value is less than " +
;)""or greater than the other value.
;break
}
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 333
تکرار
ساختارهای تکرار به شما اجازه میدهند که یک یا چند دستور کد را تا زمانی که یک شرط برقرار است تکرار کنید.بدون ساختارهای
تکرار شما مجبورید همان تعداد کدها را بنویسید که بسیار خسته کننده است.مثال شما مجبورید 33بار جمله ”“Hello World.
System.out.println("Hello ;)"World.
System.out.println("Hello ;)"World.
System.out.println("Hello ;)"World.
System.out.println("Hello ;)"World.
System.out.println("Hello ;)"World.
System.out.println("Hello ;)"World.
System.out.println("Hello ;)"World.
System.out.println("Hello ;)"World.
System.out.println("Hello ;)"World.
System.out.println("Hello ;)"World.
البته شما میتوانید با کپی کردن این تعداد کد را راحت بنویسید ولی این کار در کل کیفیت کدنویسی را پایین میآورد .راه بهتر
برای نوشتن کدهای باال استفاده از حلقهها است .ساختارهای تکرار در جاوا عبارتاند از:
while
for
حلقه While
ابتداییترین ساختار تکرار در جاوا حلقه whileاست.ابتدا یک شرط را مورد بررسی قرار میدهد و تا زمانیکه شرط برقرار باشد
کدهای درون بلوک اجرا میشوند .ساختار حلقه whileبه صورت زیر است:
)while(condition
{
;code to loop
}
۵۱۵ مبانی زبان جاوا
میبینید که ساختار whileمانند ساختار ifبسیار ساده است .ابتدا یک شرط را که نتیجه آن یک مقدار بولی است مینویسیم
اگر نتیجه درست یا trueباشد سپس کدهای داخل بلوک whileاجرا میشوند .اگر شرط غلط یا falseباشد وقتی که برنامه به
حلقه whileبرسد هیچکدام از کدها را اجرا نمیکند .برای متوقف شدن حلقه باید مقادیر داخل حلقه whileاصالح شوند.
به یک متغیر شمارنده در داخل بدنه حلقه نیاز داریم .این شمارنده برای آزمایش شرط مورد استفاده قرار میگیرد و ادامه یا توقف
حلقه به نوعی به آن وابسته است .این شمارنده را در داخل بدنه باید کاهش یا افزایش دهیم .در برنامه زیر نحوه استفاده از حلقه
whileآمده است:
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
Hello !World
برنامه باال 33بار پیغام ! Hello Worldرا چاپ میکند .اگر از حلقه در مثال باال استفاده نمیکردیم مجبور بودیم تمام 33خط را
تایپ کنیم .اجازه دهید که نگاهی به کدهای برنامه فوق بیندازیم .ابتدا در خط 1یک متغیر تعریف و از آن به عنوان شمارنده حلقه
استفاده شده است.سپس به آن مقدار 3را اختصاص میدهیم چون اگر مقدار نداشته باشد نمیتوان در شرط از آن استفاده کرد.
در خط 6حلقه whileرا وارد میکنیم .در حلقه whileابتدا مقدار اولیه شمارنده با 33مقایسه میشود که آیا از 33کمتر است یا با
آن برابر است .نتیجه هر بار مقایسه ورود به بدنه حلقه whileو چاپ پیغام است .همانطور که مشاهده میکنید بعد از هر بار
مقایسه مقدار شمارنده یک واحد اضافه میشود (خط .)35حلقه تا زمانی تکرار میشود که مقدار شمارنده از 33کمتر باشد.
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 335
اگر مقدار شمارنده یک بماند و آن را افزایش ندهیم و یا مقدار شرط هرگز falseنشود یک حلقه بینهایت به وجود میآید .به
این نکته توجه کنید که در شرط باال به جای عالمت < از =< استفاده شده است .اگر از عالمت < استفاده میکردیم کد ما 6بار تکرار
میشد چون مقدار اولیه 3است و هنگامی که شرط به 33برسد falseمیشود چون 33 < 33نیست .اگر میخواهید یک حلقه بی
نهایت ایجاد کنید که هیچگاه متوقف نشود باید یک شرط ایجاد کنید که همواره درست ) (trueباشد.
)while(true
{
//code to loop
}
این تکنیک در برخی موارد کارایی دارد و آن زمانی است که شما بخواهید با استفاده از دستورات breakو returnکه در آینده
حلقهdo While
حلقه do whileیکی دیگر از ساختارهای تکرار است .این حلقه بسیار شبیه حلقه whileاست با این تفاوت که در این حلقه ابتدا
کد اجرا می شودو سپس شرط مورد بررسی قرار میگیرد .ساختار حلقه do whileبه صورت زیر است:
do
{
;code to repeat
همانطور که مشاهده میکنید شرط در آخر ساختار قرار دارد .این بدین معنی است که کدهای داخل بدنه حداقل یکبار اجرا میشوند.
برخالف حلقه whileکه اگر شرط نادرست باشد دستورات داخل بدنه اجرا نمیشوند .یکی از موراد برتری استفاده از حلقه do
whileنسبت به حلقه whileزمانی است که شما بخواهید اطالعاتی از کاربر دریافت کنید .به مثال زیر توجه کنید:
استفاده از while
//while version
{
;)" System.out.println("Enter a number greater than 10:
;)(number = input.nextInt
}
do
{
;)" System.out.println("Enter a number greater than 10:
;)(number = input.nextInt
}
)while(number < 10
حلقه for
یکی دیگر از ساختارهای تکرار حلقه forاست.این حلقه عملی شبیه به حلقه whileانجام میدهد و فقط دارای چند خصوصیت
مقدار دهی اولیه ) (initializationاولین مقداری است که به شمارنده حلقه میدهیم.شمارنده فقط در داخل حلقه for
قابل دسترسی است .شرط ) (conditionدر اینجا مقدار شمارنده را با یک مقدار دیگر مقایسه میکند و تعیین میکند که حلقه
ادامه یابد یا نه .عملگر ) (operationکه مقدار اولیه متغیر را کاهش یا افزایش میدهد .در زیر یک مثال از حلقه forآمده
است:
;package myfirstprogram
}
}
}
Number 1
Number 2
Number 3
Number 4
Number 5
Number 6
Number 7
Number 8
Number 9
Number 10
برنامه باال اعداد 3تا 33را با استفاده از حلقه forمیشمارد .ابتدا یک متغیر به عنوان شمارنده تعریف میکنیم و آن را با مقدار 3
مقدار دهی اولیه میکنیم .سپس با استفاده از شرط آن را با مقدار 33مقایسه میکنیم که آیا کمتر است یا مساوی؟ توجه کنید که
قسمت سوم حلقه ) (i++فورا اجرا نمیشود .کد اجرا میشود و ابتدا رشته Numberو سپس مقدار جاری iیعنی 3را چاپ میکند.
آنگاه یک واحد به مقدار iاضافه شده و مقدار iبرابر 5میشود و بار دیگر iبا عدد 33مقایسه میشود و این حلقه تا زمانی که
مقدار شرط trueشود ادامه مییابد .حال اگر بخواهید معکوس برنامه باال را پیاده سازی کنید یعنی اعداد از بزرگ به کوچک چاپ
کد باال اعداد را از 33به 3چاپ میکند (از بزرگ به کوچک) .مقدار اولیه شمارنده را 33میدهیم و با استفاده از عملگر کاهش ()--
برنامه ای که شمارش معکوس را انجام میدهد ایجاد میکنیم .میتوان قسمت شرط و عملگر را به صورتهای دیگر نیز تغییر داد.
به عنوان مثال میتوان از عملگرهای منطقی در قسمت شرط و از عملگرهای تخصیصی در قسمت عملگر افزایش یا کاهش استفاده
به این نکته توجه کنید که اگر از چندین متغیر شمارنده یا عملگر در حلقه forاستفاده میکنید باید آنها را با استفاده از کاما از هم
جدا کنید .گاهی اوقات با وجود درست بودن شرط میخواهیم حلقه متوقف شود .سؤال اینجاست که چطور این کار را انجام دهید؟
۵۱۱ مبانی زبان جاوا
میتوان بخشی از حلقه را رد کرد وcontinue حلقه را متوقف کرده و با استفاده از کلمه کلیدیbreak با استفاده از کلمه کلیدی
: را نشان میدهدbreak وcontinue برنامه زیر نحوه استفاده از.به مرحله بعد رفت
1 package myfirstprogram;
2
3 public class MyFirstProgram
4 {
5 public static void main(String[] args)
6 {
7 System.out.println("Demonstrating the use of break\n");
8
9 for (int x = 1; x < 10; x++)
10 {
11 if (x == 5)
12 break;
13
14 System.out.println("Number " + x);
15 }
16
17 System.out.println("\nDemonstrating the use of continue\n");
18
19 for (int x = 1; x < 10; x++)
20 {
21 if (x == 5)
22 continue;
23
24 System.out.println("Number "+ x);
25 }
26 }
27 }
Number 1
Number 2
Number 3
Number 4
Number 1
Number 2
Number 3
Number 4
Number 6
Number 7
Number 8
Number 9
وwhile از حلقههایfor برای نشان دادن کاربرد دو کلمه کلیدی فوق استفاده شده است اگر به جایfor در این برنامه از حلقه
بهx ) آمده است وقتی که مقدار33 همانطور که در شرط برنامه (خط. استفاده میشد نتیجه یکسانی به دست میآمدdo…while
از طرف. برقرار باشدx < 10 حلقه بالفاصله متوقف میشود حتی اگر شرط.)35 اجرا شود(خطbreak رسید سپس دستور1 عدد
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 331
دیگر در خط 55حلقه forفقط برای یک تکرار خاص متوقف شده و سپس ادامه مییابد .وقتی مقدار xبرابر 1شود حلقه از 1رد
آرایهها
آرایه نوعی متغیر است که لیستی از آدرسهای مجموعه ای از دادههای هم نوع را در خود ذخیره میکند .تعریف چندین متغیر از
یک نوع برای هدفی یکسان بسیار خسته کننده است .مثال اگر بخواهید صد متغیر از نوع اعداد صحیح تعریف کرده و از آنها
استفاده کنید .مطمئنا تعریف این همه متغیر بسیار کسالت آور و خسته کننده است .اما با استفاده از آرایه میتوان همه آنها را در
یک خط تعریف کرد .در زیر راهی ساده برای تعریف یک آرایه نشان داده شده است:
Datatypeنوع دادههایی را نشان میدهد که آرایه در خود ذخیره میکند .کروشه که بعد از نوع داده قرار میگیرد و نشان دهنده
استفاده از آرایه است arrayName .که نام آرایه را نشان میدهد .هنگام نامگذاری آرایه بهتر است که نام آرایه نشان دهنده نوع
آرایه باشد .به عنوان مثال برای نامگذاری آرایه ای که اعداد را در خود ذخیره میکند از کلمه numberاستفاده کنید .طول آرایه که
به کمپایلر میگوید شما قصد دارید چه تعداد داده یا مقدار را در آرایه ذخیره کنید .از کلمه کلیدی newهم برای اختصاص فضای
حافظه به اندازه طول آرایه استفاده میشود .برای تعریف یک آرایه که 1مقدار از نوع اعداد صحیح در خود ذخیره میکند باید به
در این مثال 1آدرس از فضای حافظه کامپیوتر شما برای ذخیره 1مقدار رزرو میشود .حال چطور مقادیرمان را در هر یک از این
آدرسها ذخیره کنیم؟ برای دسترسی و اصالح مقادیر آرایه از اندیس یا مکان آنها استفاده میشود.
اندیس یک آرایه از صفر شروع شده و به یک واحد کمتر از طول آرایه ختم میشود .به عنوان مثال شما یک آرایه 1عضوی دارید،
اندیس آرایه از 3تا 3میباشد چون طول آرایه 1است پس 1-3برابر است با .3این بدان معناست که اندیس 3نشان دهنده اولین
عضو آرایه است و اندیس 3نشان دهنده دومین عضو و الی آخر .برای درک بهتر مثال باال به شکل زیر توجه کنید:
به هر یک از اجزاء آرایه و اندیسهای داخل کروشه توجه کنید .کسانی که تازه شروع به برنامه نویسی کردهاند معموال در گذاشتن
اندیس دچار اشتباه میشوند و مثال ممکن است در مثال باال اندیسها را از 3شروع کنند .اگر بخواهید به یکی از اجزائ آرایه با
خطای پیغام با نباشد شما آرایه اندیسهای محدوده در که کنید پیدا دسترسی اندیسی از استفاده
ArrayIndexOutOfBoundsExceptionمواجه میشوید و بدین معنی است که شما آدرسی را میخواهید که وجود ندارد .یک راه
به سادگی و بدون احتیاج به کلمه کلیدی newمیتوان مقادیر را در داخل آکوالد قرار داد .کمپایلر به صورت اتوماتیک با شمارش
در زیر مثالی در مورد استفاده از آرایهها آمده است .در این برنامه 1مقدار از کاربر گرفته شده و میانگین آنها حساب میشود:
در خط 35یک آرایه تعریف شده است که میتواند 1عدد صحیح را در خود ذخیره کند .خطوط 31و 33متغیرهایی تعریف شدهاند
که از آنها برای محاسبه میانگین استفاده میشود .توجه کنید که مقدار اولیه totalصفر است تا از بروز خطا هنگام اضافه شدن
مقدار به آن جلوگیری شود .در خطوط 31تا 53حلقه forبرای تکرار و گرفتن ورودی از کاربر تعریف شده است.از خاصیت طول
) (lengthآرایه برای تشخیص تعداد اجزای آرایه استفاده میشود.اگر چه میتوانستیم به سادگی در حلقه forمقدار 1را برای
شرط قرار دهیم ولی استفاده از خاصیت طول آرایه کار راحت تری است و میتوانیم طول آرایه را تغییر دهیم و شرط حلقه forبا
تغییر جدید هماهنگ میشود .در خط 36ورودی دریافت شده از کاربر با استفاده از متد )( nextIntدریافت و در آرایه ذخیره
میشود .اندیس استفاده شده در ( numberخط )36مقدار iجاری در حلقه است .برای مثال در ابتدای حلقه مقدار iصفر است
بنابراین وقتی در خط 36اولین داده از کاربر گرفته میشود ،اندیس آن برابر صفر میشود .در تکرار بعدی iیک واحد اضافه میشود
و در نتیجه در خط 36و بعد از ورود دومین داده توسط کاربر اندیس آن برابر یک میشود .این حالت تا زمانی که شرط در حلقه
forبرقرار است ادامه مییابد .در خطوط 53-53از حلقه forدیگر برای دسترسی به مقدار هر یک از دادههای آرایه استفاده شده
است .در این حلقه نیز مانند حلقه قبل از مقدار متغیر شمارنده به عنوان اندیس استفاده میکنیم.
۵۱۹ مبانی زبان جاوا
هر یک از اجزای عددی آرایه به متغیر totalاضافه میشوند .بعد از پایان حلقه میتوانیم میانگین اعداد را حساب کنیم (خط
.)51مقدار totalرا بر تعداد اجزای آرایه ( تعداد عددها) تقسیم میکنیم .برای دسترسی به تعداد اجزای آرایه میتوان از خاصیت
lengthآرایه استفاده کرد .توجه کنید که در اینجا ما مقدار خاصیت lengthرا به نوع doubleتبدیل کردهایم بنابراین نتیجه
عبارت یک مقدار از نوع doubleخواهد شد و دارای بخش کسری میباشد .حال اگر عملوندهای تقسیم را به نوع double
تبدیل نکنیم نتیجه تقسیم یک عدد از نوع صحیح خواهد شد و دارای بخش کسری نیست .خط 50مقدار میانگین را در صفحه
نمایش چاپ میکند .طول آرایه بعد از مقدار دهی نمیتواند تغیر کند .به عنوان مثال اگر یک آرایه را که شامل 1جز است مقدار
دهی کنید دیگر نمیتوانید آن را مثال به 33جز تغییر اندازه دهید .البته تعداد خاصی از کالسها مانند آرایهها عمل میکنند و توانایی
تغییر تعداد اجزای تشکیل دهنده خود را دارند .آرایهها در برخی شرایط بسیار پر کاربرد هستند و تسلط شما بر این مفهوم و اینکه
حلقه foreach
حلقه foreachیکی دیگر از ساختارهای تکرار در جاوا میباشد که مخصوصا برای آرایهها ،لیستها و مجموعهها طراحی شده
است .حلقه foreachبا هر بار گردش در بین اجزاء ،مقادیر هر یک از آنها را در داخل یک متغیر موقتی قرار میدهد و شما
میتوانید بواسطه این متغیر به مقادیر دسترسی پیدا کنید .در زیر نحوه استفاده از حلقه foreachآمده است:
temporaryVarمتغیری است که مقادیر اجزای آرایه را در خود نگهداری میکند temporaryVar .باید دارای نوع باشد تا بتواند
مقادیر آرایه را در خود ذخیره کند .به عنوان مثال آرایه شما دارای اعدادی از نوع صحیح باشد باید نوع متغیر موقتی از نوع اعداد
صحیح باشد یا هر نوع دیگری که بتواند اعداد صحیح را در خود ذخیره کند مانند doubleیا .longسپس عالمت دو نقطه ( ):و
بعد از آن نام آرایه را مینویسیم .در زیر نحوه استفاده از حلقه foreachآمده است:
6 {
7 ;} int[] numbers = { 1, 2, 3, 4, 5
8
9 )for (int n : numbers
10 {
11 ;)System.out.println(n
12 }
13 }
14 }
1
2
3
4
5
در برنامه آرایه ای با 1جزء تعریف شده و مقادیر 3تا 1در آنها قرار داده شده است (خط .)1در خط 6حلقه foreachشروع
میشود .ما یک متغیر موقتی تعریف کردهایم که اعداد آرایه را در خود ذخیره میکند .در هر بار تکرار از حلقه foreachمتغیر موقتی
،nمقادیر عددی را از آرایه استخراج میکند .حلقه foreachمقادیر اولین تا آخرین جزء آرایه را در اختیار ما قرار میدهد.
حلقه foreachبرای دریافت هر یک از مقادیر آرایه کاربرد دارد .بعد از گرفتن مقدار یکی از اجزای آرایه ،مقدار متغیر موقتی را چاپ
میکنیم .حلقه foreachما را قادر میسازد که به دادهها دسترسی یابیم و یا آنها را بخوانیم و اصالح کنیم .برای درک این مطلب
)for(int n : numbers
{
;n++
;)System.out.println(n
}
2
3
4
5
6
آرایههای چند بعدی ،آرایههایی هستند که برای دسترسی به هر یک از عناصر آنها باید از چندین اندیس استفاده کنیم .یک آرایه
چند بعدی را میتوان مانند یک جدول با تعدای ستون و ردیف تصور کنید .با افزایش اندیسها اندازه ابعاد آرایه نیز افزایش مییابد
و آرایههای چند بعدی با بیش از دو اندیس به وجود میآیند .نحوه ایجاد یک آرایه با دو بعد به صورت زیر است:
۵۵۵ مبانی زبان جاوا
می توان یک آرایه با تعداد زیادی بعد ایجاد کرد به شرطی که هر بعد دارای طول مشخصی باشد .به دلیل اینکه آرایههای سه بعدی
یا آرایههای با بیشتر از دو بعد بسیار کمتر مورد استفاده قرار میگیرند .اجازه بدهید که در این درس بر روی آرایههای دو بعدی
تمرکز کنیم .در تعریف این نوع آرایه ابتدا نوع آرایه یعنی اینکه آرایه چه نوعی از انواع داده را در خود ذخیره میکند را ،مشخص
میکنیم .سپس دو جفت کروشه قرار میدهیم .به تعداد کروشهها توجه کنید .اگر آرایه ما دو بعدی است باید 5جفت کروشه و اگر
سه بعدی است باید 1جفت کروشه قرار دهیم.سپس یک نام برای آرایه انتخاب کرده و بعد تعریف آنرا با گذاشتن کلمه ،newنوع
داده و طول هر بعد آن کامل میکنیم .در یک آرایه دو بعدی برای دسترسی به هر یک از عناصر به دو مقدار نیاز داریم یکی مقدار
Xو دیگری مقدار Yکه مقدار xنشان دهنده ردیف و مقدار Yنشان دهنده ستون آرایه است البته اگر ما آرایه دو بعدی را به
صورت جدول در نظر بگیریم.یک آرایه سه بعدی را میتوان به صورت یک مکعب تصور کرد که دارای سه بعد است و xطولY ،
عرض و zارتفاع آن است .یک مثال از آرایه دو بعدی در زیر آمده است:
کد باال به کمپایلر میگوید که فضای کافی به عناصر آرایه اختصاص بده (در این مثال 31خانه) .در شکل زیر مکان هر عنصر در یک
مقدار 1را به xاختصاص میدهیم چون 1سطر و مقدار 1را به Yچون 1ستون داریم اختصاص میدهیم .چطور یک آرایه چند
بعدی را مقدار دهی کنیم؟ چند راه برای مقدار دهی به آرایهها وجود دارد .یک راه این است که مقادیر عناصر آرایه را در همان زمان
{ = int[][] numbers
{ 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9, 10 },
} { 11, 12, 13, 14, 15
;}
همانطور که مشاهده میکنید برای دسترسی به هر یک از عناصر در یک آرایه دو بعدی به سادگی میتوان از اندیسهای Xو Y
گردش در میان عناصر آرایههای چند بعدی نیاز به کمی دقت دارد .یکی از راههای آسان استفاده از حلقه foreachو یا حلقه
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
مشاهده کردید که گردش در میان مقادیر عناصر یک آرایه چند بعدی چقدر راحت است .به وسیله حلقه foreachنمیتوانیم
انتهای ردیفها را مشخص کنیم .برنامه زیر نشان میدهد که چطور از حلقه forبرای خواندن همه مقادیر آرایه و تعیین انتهای
15 {
16 ;)" " System.out.print(numbers[row][col] +
17 }
18
19 //Go to the next line
20 ;)(System.out.println
21 }
22 }
23 }
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
همانطور که درمثال باال نشان داده شده است با استفاده از یک حلقه ساده forنمیتوان به مقادیر دسترسی یافت بلکه به یک
حلقه forتو در تو نیاز داریم .در اولین حلقه ( forخط )35یک متغیر تعریف شده است که در میان ردیفهای آرایه )(row
گردش میکند .این حلقه تا زمانی ادامه مییابد که مقدار ردیف کمتر از طول اولین بعد باشد .در این مثال از خاصیت lenght
کالس Arrayاستفاده کردهایم .این خاصیت طول آرایه را در یک بعد خاص نشان میدهد .به عنوان مثال برای به دست آوردن
طول اولین بعد آرایه که همان تعداد ردیفها میباشد از دستور numbers.lengthاستفاده کردهایم.
در داخل اولین حلقه forحلقه forدیگری تعریف شده است (خط .)33در این حلقه یک شمارنده برای شمارش تعداد ستونهای
) (columnsهر ردیف تعریف شده است و در شرط داخل آن بار دیگر از خاصیت lenghtاستفاده شده است ،ولی این بار به
نوعی دیگر از آن استفاده میکنیم .همانطور که مشاهده میکنید ابتدا نام آرایه را نوشتهایم و سپس یک اندیس به آن اختصاص
numbers[row].length
استفاده از rowبه عنوان اندیس باعث میشود که به عنوان مثال وقتی که مقدار ردیف ) (rowصفر باشد ،حلقه دوم از [ ]3[]3تا
[ ]3[]3اجرا شود .سپس مقدار هر عنصر از آرایه را با استفاده از حلقه نشان میدهیم ،اگر مقدار ردیف ) (rowبرابر 3و مقدار ستون
) (colبرابر 3باشد مقدار عنصری که در ستون 3و ردیف (numbers[0][0]) 3قرار دارد ،نشان داده خواهد شد که در مثال باال
عدد 3است.
بعد از اینکه دومین حلقه تکرار به پایان رسید ،فورا دستورات بعد از آن اجرا خواهند شد ،که در اینجا دستور
)( System.out.printlnکه به برنامه اطالع میدهد که به خط بعد برود .سپس حلقه با اضافه کردن یک واحد به مقدار row
۵۵۱ مبانی زبان جاوا
این فرایند تا. اجرا شده و مقادیر دومین ردیف نمایش داده میشودfor سپس دومین حلقه.این فرایند را دوباره تکرار میکند
. حال بیایید آنچه را از قبل یاد گرفتهایم در یک برنامه به کار بریم. کمتر از طول اولین بعد باشدrow زمانی اجرا میشود که مقدار
.این برنامه نمره چهار درس مربوط به سه دانش آموز را از ما میگیرد و معدل سه دانش آموز را حساب میکند
1 package myfirstprogram;
2
3 import java.util.Scanner;
4 import java.text.MessageFormat;
5
6 public class MyFirstProgram
7 {
8 public static void main(String[] args)
9 {
10 Scanner input = new Scanner(System.in);
11
12 double[][] studentGrades = new double[3][4];
13 double total;
14
15 for (int student = 0; student < studentGrades.length; student++)
16 {
17 total = 0;
18
19 System.out.println(MessageFormat.format("Enter grades for Student {0}", student + 1));
20
21 for (int grade = 0; grade < studentGrades[student].length; grade++)
22 {
23 System.out.print(MessageFormat.format("Enter Grade #{0}: ", grade + 1));
24 studentGrades[student][grade] = input.nextDouble();
25 total += studentGrades[student][grade];
26 }
27
28 System.out.print(
29 MessageFormat.format("Average is {0}", (total / studentGrades[student].length)));
30 System.out.println();
31 }
32 }
33 }
در برنامه باال یک آرایه چند بعدی از نوع doubleتعریف شده است (خط .)35همچنین یک متغیر به نام totalتعریف میکنیم
که مقدار محاسبه شده معدل هر دانش آموز را در آن قرار دهیم .حال وارد حلقه forتو در تو میشویم (خط .)31در اولین حلقه
forیک متغیر به نام sudentبرای تشخیص پایه درسی هر دانش آموز تعریف کردهایم .از خاصیت lenghtهم برای تشخیص
تعداد دانش آموزان استفاده شده است .وارد بدنه حلقه forمیشویم.در خط 31مقدار متغیر totalرا برابر صفر قرار میدهیم.
بعدا مشاهده میکنید که چرا این کار را انجام دادیم .سپس برنامه یک پیغام را نشان میدهد و از شما میخواهد که شماره دانش
آموز را وارد کنید ( .)student + 1عدد 3را به studentاضافه کردهایم تا به جای نمایش ،Student 0با Student 1شروع
شود ،تا طبیعی تر به نظر برسد .سپس به دومین حلقه forدر خط 53میرسیم .در این حلقه یک متغیر شمارنده به نام grade
تعریف میکنیم که طول دومین بعد آرایه را با استفاده از studentGrades[student].lengthبه دست میآورد .این طول تعداد
نمراتی را که برنامه از سؤال میکند را نشان میدهد .برنامه چهار نمره مربوط به دانش آموز را میگیرد .هر وقت که برنامه یک نمره
وقتی همه نمرهها وارد شدند ،متغیر totalهم جمع همه نمرات را نشان میدهد .در خط 50معدل دانش آموز نشان داده
میشود .معدل از تقسیم کردن ( totalجمع) بر تعداد نمرات به دست میآید .از studentGrades[student].lengthهم
آرایه دندانه دار یا jagged arrayآرایه ای چند بعدی است که دارای سطرهای با طول متغیر میباشد .نمونه ساده ای از آرایههای
چند بعدی ،آرایههای مستطیلی است که تعداد ستونها و سطرهای آنها برابر است .اما آرایههای دندانه دار دارای سطرهای
(آرایههای) با طول متفاوت میباشند .بنابر این آرایههای دندانه دار را میتوان آرایه ای از آرایهها فرض کرد .دستور نوشتن این
;datatype[][] arrayName
ابتدا datatypeکه نوع آرایه است و سپس چهار کروشه باز و بسته و بعد از آن نام آرایه را مینویسیم .مقداردهی به این آرایهها
در کد باال سه آرایه تعریف شده است که اندیس آنها از صفر شروع میشود .اعداد 1و 1و 5هم به تعداد عناصری که هر کدام از
آنها در خود میتوانند جای دهند اشاره دارند .برای مقداردهی هر آرایه هم باید ابتدا اندیس آرایه و سپس اندیس عناصر آن را
بنویسیم .مثال مقداردهی اولین عنصر اولین آرایه مثال باال به صورت زیر عمل میکنیم:
;myArrays[0][0] = 1
;myArrays[1][1] = 4
شکل زیر هم اندیس عناصر آرایه ای که در باال تعریف کردهایم را نشان میدهد:
با توجه به توضیحاتی که داده شد میتوان عناصر آرایه ای که در ابتدای درس ایجاد کردیم را به صورت زیر مقداردهی کرد:
;myArrays[0][0] = 1
;myArrays[0][1] = 2
;myArrays[0][2] = 3
;myArrays[2][0] = 11
;myArrays[2][1] = 22
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 330
یک روش بهتر برای مقدار دهی آرایههای دندانه دار به صورت زیر است که در آن میتوان طول سطرها را هم مشخص نکرد:
برای دسترسی به مقدار عناصر یک آرایه دندانه دار باید اندیس سطر و ستون آن را در اختیار داشته باشیم
(]:)array[row][column
;)]System.out.println(myArrays[1][2
نمیتوان از حلقه foreachبرای دسترسی به عناصر آرایه دندانه دار استفاده کرد:
اگر از حلقه foreachاستفاده کنیم با خطا مواجه میشویم چون عناصر این نوع آرایهها ،آرایه هستند نه عدد یا رشته یا… .برای
حل این مشکل باید نوع متغیر موقتی ) (arrayرا تغییر داده و از حلقه foreachدیگری برای دسترسی به مقادیر استفاده کرد.
در اولین حلقه از lengthبرای به دست آوردن تعداد سطرها (که همان آرایههای یک بعدی هستند) و در دومین حلقه از
متد
متدها به شما اجازه میدهند که یک رفتار یا وظیفه را تعریف کنید و مجموعه ای از کدها هستند که در هر جای برنامه میتوان از
آنها استفاده کرد.متدها دارای آرگومانهایی هستند که وظیفه متد را مشخص میکنند .متد در داخل کالس تعریف میشود.
نمیتوان یک متد را در داخل متد دیگر تعریف کرد .وقتی که شما در برنامه یک متد را صدا میزنید برنامه به قسمت تعریف متد
رفته و کدهای آن را اجرا میکند .در جاوا متدی وجود دارد که نقطه آغاز هر برنامه است و بدون آن برنامهها نمیدانند با ید از کجا
شروع شوند ،این متد )( mainنام دارد .پارامترها همان چیزهایی هستند که متد منتظر دریافت آنها است .آرگومانها مقادیری
هستند که به پارامترها ارسال میشوند .گاهی اوقات دو کلمه پارامتر و آرگومان به یک منظور به کار میروند .سادهترین ساختار یک
)(returnType MethodName
{
;code to execute
}
به برنامه ساده زیر توجه کنید .در این برنامه از یک متد برای چاپ یک پیغام در صفحه نمایش استفاده شده است:
!Hello World
در خطوط 1-0یک متد تعریف کردهایم .مکان تعریف آن در داخل کالس مهم نیست .به عنوان مثال میتوانید آن را زیر متد
)( mainتعریف کنید .میتوان این متد را در داخل متد دیگر صدا زد (فراخوانی کرد) .متد دیگر ما در اینجا متد )( mainاست که
میتوانیم در داخل آن نام متدی که برای چاپ یک پیغام تعریف کردهایم (یعنی متد )( )PrintMessageرا صدا بزنیم .متد
)( mainبه صورت staticتعریف شده است .برای اینکه بتوان از متد )( PrintMessageدر داخل متد )( mainاستفاده کنیم
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 353
باید آن را به صورت staticتعریف کنیم .کلمه staticبه طور ساده به این معناست که میتوان از متد استفاده کرد بدون
اینکه از کالس نمونه ای ساخته شود .متد )( mainهمواره باید به صورت staticتعریف شود چون برنامه فورا و بدون نمونه
سازی از کالس از آن استفاده میکند .وقتی به مبحث برنامه نویسی شیء گرا رسیدید به طور دقیق کلمه staticمورد بحث قرار
به میگیرد .برنامه ( classمثال باال) زمانی اجرا میشود که برنامه دو متدی را که تعریف کردهایم را اجرا کند و متد )(main
صورت staticتعریف شود .در باره این کلمه کلیدی در درسهای آینده مطالب بیشتری میآموزیم.
در تعریف متد باال بعد از کلمه staticکلمه کلیدی voidآمده است که نشان دهنده آن است که متد مقدار برگشتی ندارد .در
درس آینده در مورد مقدار برگشتی از یک متد و استفاده از آن برای اهداف مختلف توضیح داده خواهد شد .نام متد ما
)( PrintMessageاست .به این نکته توجه کنید که در نامگذاری متد از روش پاسکال (حرف اول هر کلمه بزرگ نوشته میشود)
استفاده کردهایم .این روش نامگذاری قراردادی است و میتوان از این روش استفاده نکرد ،اما پیشنهاد میشود که از این روش
بهتر است در نامگذاری متدها از کلماتی استفاده شود که کاران متد را مشخص میکند مثال نامهایی مانند GoToBedیا OpenDoor
.همچنین به عنوان مثال اگر مقدار برگشتی متد یک مقدار بولی باشد میتوانید اسم متد خود را به صورت یک کلمه سوالی انتخاب
کنید ،مانند IsLeapyearیا ،IsTeenagerولی از گذاشتن عالمت سؤال در آخر اسم متد خودداری کنید .دو پرانتزی که بعد از نام
میآید نشان دهنده آن است که نام متعلق به یک متد است .در این مثال در داخل پرانتزها هیچ چیزی نوشته نشده چون پارامتری
بعد از پرانتزها دو آکوالد قرار میدهیم که بدنه متد را تشکیل میدهد و کدهایی را که میخواهیم اجرا شوند را در داخل این
آکوالدها مینویسیم .در داخل متد )( mainمتدی را که در خط 35ایجاد کردهایم را صدا میزنیم .برای صدا زدن یک متد کافیست
نام آن را نوشته و بعد از نام پرانتزها را قرار دهیم .اگر متد دارای پارامتر باشد باید شما آراگومانها را به ترتیب در داخل پرانتزها قرار
دهید .در این مورد نیز در درسهای آینده توضیح بیشتری میدهیم .با صدا زدن یک متد کدهای داخل بدنه آن اجرا میشوند.
برای اجرای متد )( PrintMessageبرنامه از متد )( mainبه محل تعریف متد )( PrintMessageمیرود .مثال وقتی ما متد
)( PrintMessageرا در خط 35صدا میزنیم برنامه از خط 35به خط ،1یعنی جایی که متد تعریف شده میرود .اکنون ما یک متد
در برنامه classداریم و همه متدهای این برنامه میتوانند آن را صدا بزنند.
۵1۵ مبانی زبان جاوا
متدها میتوانند مقدار برگشتی از هر نوع داده ای داشته باشند .این مقادیر میتوانند در محاسبات یا به دست آوردن یک داده
مورد استفاده قرار بگیرند .در زندگی روزمره فرض کنید که کارمند شما یک متد است و شما او را صدا میزنید و از او میخواهید که
کار یک سند را به پایان برساند .سپس از او میخواهید که بعد از اتمام کارش سند را به شما تحویل دهد .سند همان مقدار برگشتی
متد است .نکته مهم در مورد یک متد ،مقدار برگشتی و نحوه استفاده شما از آن است .برگشت یک مقدار از یک متد آسان است.
)(returnType MethodName
{
;return value
}
returnTypeدر اینجا نوع داده ای مقدار برگشتی را مشخص میکند ( .)…،bool ،intدر داخل بدنه متد کلمه کلیدی returnو
بعد از آن یک مقدار یا عبارتی که نتیجه آن یک مقدار است را مینویسیم .نوع این مقدار برگشتی باید از انواع ساده بوده و در
هنگام نامگذاری متد و قبل از نام متد ذکر شود .اگر متد ما مقدار برگشتی نداشته باشد باید از کلمه voidقبل از نام متد استفاده
کنیم .مثال زیر یک متد که دارای مقدار برگشتی است را نشان میدهد.
Sum is 15.
همانطور که در خط 1مثال فوق مشاهده میکنید هنگام تعریف متد از کلمه intبه جای voidاستفاده کردهایم که نشان دهنده
آن است که متد ما دارای مقدار برگشتی از نوع اعداد صحیح است .در خطوط 6و 33دو متغیر تعریف و مقدار دهی شدهاند.
توجه کنید که این متغیرها ،متغیرهای محلی هستند .و این بدان معنی است که این متغیرها در سایر متدها مانند متد )( mainقابل
دسترسی نیستند و فقط در متدی که در آن تعریف شدهاند قابل استفاده هستند .در خط 35جمع دو متغیر در متغیر sumقرار
میگیرد .در خط 33مقدار برگشتی sumتوسط دستور returnفراخوانی میشود .در داخل متد )( mainیک متغیر به نام
متد )( CalculateSumمقدار 31را بر میگرداند که در داخل متغیر resultذخیره میشود .در خط 53مقدار ذخیره شده در متغیر
resultچاپ میشود .متدی که در این مثال ذکر شد متد کاربردی و مفیدی نیست .با وجودیکه کدهای زیادی در متد باال نوشته
شده ولی همیشه مقدار برگشتی 31است ،در حالیکه میتوانستیم به راحتی یک متغیر تعریف کرده و مقدار 31را به آن اختصاص
دهیم .این متد در صورتی کارآمد است که پارامترهایی به آن اضافه شود که در درسهای آینده توضیح خواهیم داد .هنگامی که
میخواهیم در داخل یک متد از دستور ifیا switchاستفاده کنیم باید تمام کدها دارای مقدار برگشتی باشند .برای درک بهتر
25 }
26
27 )public static void main(String[] args
28 {
29 ;)(int result = GetNumber
30
31 ;))System.out.println(MessageFormat.format("Result = {0}.", result
32 }
33 }
در خطوط 0-51یک متد با نام )( GetNumberتعریف شده است که از کاربر یک عدد بزرگتر از 33را میخواهد .اگر عدد وارد شده
توسط کاربر درست نباشد متد مقدار صفر را بر میگرداند .و اگر قسمت elseدستور ifو یا دستور returnرا از آن حذف کنیم
چون اگر شرط دستور ifنادرست باشد (کاربر مقداری کمتر از 33را وارد کند) برنامه به قسمت elseمیرود تا مقدار صفر را
برگرداند و چون قسمت elseحذف شده است برنامه با خطا مواجه میشود و همچنین اگر دستور returnحذف شود چون
پارامتر و آرگومان
پارامترها دادههای خامی هستند که متد آنها را پردازش میکند و سپس اطالعاتی را که به دنبال آن هستید در اختیار شما قرار
میدهد .فرض کنید پارامترها مانند اطالعاتی هستند که شما به یک کارمند میدهید که بر طبق آنها کارش را به پایان برساند .یک
متد میتواند هر تعداد پارامتر داشته باشد .هر پارامتر میتواند از انواع مختلف داده باشد .در زیر یک متد با Nپارامتر نشان داده
شده است:
پارامترها بعد از نام متد و بین پرانتزها قرار میگیرند .بر اساس کاری که متد انجام میدهد میتوان تعداد پارامترهای زیادی به متد
اضافه کرد .بعد از فراخوانی یک متد باید آرگومانهای آن را نیز تأمین کنید .آرگومانها مقادیری هستند که به پارامترها اختصاص
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 353
داده میشوند .ترتیب ارسال آرگومانها به پارامترها مهم است .عدم رعایت ترتیب در ارسال آرگومانها باعث به وجود آمدن خطای
در برنامه باال یک متد به نام )(( CalculateSumخطوط )0-33تعریف شده است که وظیفه آن جمع مقدار دو عدد است .چون
این متد مقدار دو عدد صحیح را با هم جمع میکند پس نوع برگشتی ما نیز باید intباشد .متد دارای دو پارامتر است که اعداد
را به آنها ارسال میکنیم .به نوع داده ای پارامترها توجه کنید .هر دو پارامتر یعنی number1و number2مقادیری از نوع اعداد
صحیح ) (intدریافت میکنند .در بدنه متد دستور returnنتیجه جمع دو عدد را بر میگرداند .در داخل متد )( mainبرنامه از
کاربر دو مقدار را درخواست میکند و آنها را داخل متغیرها قرار میدهد .حال متد را که آرگومانهای آن را آماده کردهایم فراخوانی
میکنیم .مقدار num1به پارامتر اول و مقدار num2به پارامتر دوم ارسال میشود .حال اگر مکان دو مقدار را هنگام ارسال به متد
تغییر دهیم (یعنی مقدار num2به پارامتر اول و مقدار num1به پا رامتر دوم ارسال شود) هیچ تغییری در نتیجه متد ندارد چون
فقط به یاد داشته باشید که باید ترتیب ارسال آرگومانها هنگام فراخوانی متد دقیقا با ترتیب قرار گیری پارامترها تعریف شده در
متد مطابقت داشته باشد .بعد از ارسال مقادیر 33و 1به پارامترها ،پارامترها آنها را دریافت میکنند .به این نکته نیز توجه کنید
که نام پارامترها طبق قرارداد به شیوه کوهان شتری یا ( camelCasingحرف اول دومین کلمه بزرگ نوشته میشود) نوشته میشود.
در داخل بدنه متد (خط )33دو مقدار با هم جمع میشوند و نتیجه به متد فراخوان (متدی که متد )( CalculateSumرا فراخوانی
میکند) ارسال میشود .در درس آینده از یک متغیر برای ذخیره نتیجه محاسبات استفاده میکنیم ولی در اینجا مشاهده میکنید
که میتوان به سادگی نتیجه جمع را نشان داد (خط .)33در داخل متد )( mainاز ما دو عدد که قرار است با هم جمع شوند
درخواست میشود.
در خط 51متد )( CalculateSumرا فراخوانی میکنیم و دو مقدار صحیح به آن ارسال میکنیم .دو عدد صحیح در داخل متد با
هم جمع شده و نتیجه آنها برگردانده میشود .مقدار برگشت داده شده از متد به وسیله متد )( formatاز کالس MessageFormat
نمایش داده میشود (خط .)51در برنامه زیر یک متد تعریف شده است که دارای دو پارامتر از دو نوع داده ای مختلف است:
!Hello World
Number = 100
در مثال باال یک متدی تعریف شده است که اولین پارامتر آن مقداری از نوع رشته و دومین پارامتر آن مقداری از نوع intدریافت
میکند .متد به سادگی دو مقداری که به آن ارسال شده است را نشان میدهد .در خط 31متد را اول با یک رشته و سپس یک عدد
خاص فراخوانی میکنیم .حال اگر متد به صورت زیر فراخوانی میشد:
در برنامه خطا به وجود میآمد چون عدد 333به پارامتری از نوع رشته و رشته ! Hello Worldبه پارامتری از نوع اعداد صحیح
ارسال میشد.این نشان میدهد که ترتیب ارسال آرگومانها به پارامترها هنگام فراخوانی متد مهم است .به مثال 3توجه کنید در
آن مثال دو عدد از نوع intبه پارامترها ارسال کردیم که ترتیب ارسال آنها چون هردو پارامتر از یک نوع بودند مهم نبود .ولی
اگر پارامترهای متد دارای اهداف خاصی باشند ترتیب ارسال آرگومانها مهم است.
در مثال باال نشان داده شده است که حتی اگر متد دو آرگومان با یک نوع داده ای قبول کند باز هم بهتر است ترتیب بر اساس
تعریف پارامترها رعایت شود .به عنوان مثال در اولین فراخوانی متد باال اشکالی به چشم نمیآید چون سن شخص 53و قد او 313
سانتی متر است .اگر آرگومانها را به ترتیب ارسال نکنیم سن شخص 313و قد او 53سانتی متر میشود که به واقعیت نزدیک
نیست .دانستن مبانی مقادیر برگشتی و ارسال آرگومانها باعث میشود که شما متدهای کارآمد تری تعریف کنید .تکه کد زیر
نشان میدهد که شما حتی میتوانید مقدار برگشتی از یک متد را به عنوان آرگومان به متد دیگر ارسال کنید.
)(int MyMethod
{
;return 5
}
;))(AnotherMethod(MyMethod
چون مقدار برگشتی متد )( MyMethodعدد 1است و به عنوان آرگومان به متد )( AnotherMethodارسال میشود خروجی کد
ارسال آرگومانها به روش مقدار بدان معناست که شما یک کپی از مقدار متغیر را ارسال میکنید نه اصل متغیر یا ارجاع به آن را.
در این حالت وقتی که آرگومان ارسال شده را در داخل متد اصالح میکنیم مقدار اصلی آرگومان در خارج از متد تغییر نمیکند .اجازه
num = 5
در برنامه باال متدی تعریف شده است که کار آن اضافه کردن عدد 33به مقداری است که به آنها ارسال میشود (خطوط .)1-33این
متد دارای یک پارامتر است که نیاز به یک مقدار آرگومان (از نوع )intدارد .وقتی که متد را صدا میزنیم و آرگومانی به آن اختصاص
میدهیم (خط ،)36کپی آرگومان به پارامتر متد ارسال میشود .بنابراین مقدار اصلی متغیر خارج از متد هیچ ارتباطی به پارامتر متد
ندارد .سپس مقدار 33را به متغیر پارامتر ) (numberاضافه کرده و نتیجه را چاپ میکنیم .برای اثبات اینکه متغیر numهیچ تغییری
نکرده است مقدار آن را یکبار قبل از ارسال به متد (خط )31و بار دیگر بعد از ارسال به متد (خط )53چاپ کرده و مشاهده میکنیم
میتوان آرایهها را به عنوان آرگومان به متد ارسال کرد .ابتدا شما باید پارامترهای متد را طوری تعریف کنید که آرایه دریافت کنند.
1
2
3
4
5
مشاهده کردید که به سادگی میتوان با گذاشتن کروشه بعد از نوع داده ای پارامتر یک متد ایجاد کرد که پارامتر آن ،آرایه دریافت
میکند .وقتی متد در خط 31فراخوانی میشود ،آرایه را فقط با استفاده از نام آن و بدون استفاده از اندیس ارسال میکنیم .پس
آرایهها به روش ارجاع به متدها ارسال میشوند .در خطوط 1-33از حلقه foreachبرای دسترسی به اجزای اصلی آرایه که به عوان
آرگومان به متد ارسال کردهایم استفاده میکنیم .در زیر نحوه ارسال یک آرایه به روش ارجاع نشان داده شده است.
20 {
21 ;)System.out.println(num
22 }
23 }
24 }
2
3
4
5
6
برنامه باال یک متد را نشان میدهد که یک آرایه را دریافت میکند و به هر یک از عناصر آن یک واحد اضافه میکند .به این نکته
توجه کنید که از حلقه foreachنمیتوان برای افزایش مقادیر آرایه استفاده کنیم چون این حلقه برای خواندن مقادیر آرایه مناسب
است نه اصالح آنها .در داخل متد ما مقادیر هر یک از اجزای آرایه را افزایش دادهایم .سپس از متد خارج شده و نتیجه را نشان
میدهیم .مشاهده میکنید که هر یک از مقادیر اصلی متد هم اصالح شدهاند .راه دیگر برای ارسال آرایه به متد ،مقدار دهی
در این روش ما آرایه ای تعریف نمیکنیم بلکه مجموعه ای از مقادیر را به پارامتر ارسال میکنیم که آنها را مانند آرایه قبول کند .از
آنجاییکه در این روش آرایه ای تعریف نکردهایم نمیتوانیم در متد )( Mainنتیجه را چاپ کنیم .اگر از چندین پارامتر در متد استفاده
میکنید ،همیشه برای هر یک از پارامترهایی که آرایه قبول میکنند از یک جفت کروشه استفاده کنید .به عنوان مثال:
به پارامترهای متد باال توجه کنید ،پارامتر اول ) (param1آرگومانی از جنس آرایه قبول میکند ولی پارامتر دوم ) (param2یک
عدد صحیح .حال اگر پارامتر دوم ) (param2هم آرایه قبول میکرد باید برای آن هم از کروشه استفاده میکردیم:
محدوده متغیر
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 313
متدها در جاوا دارای محدوده هستند .محدوده یک متغیر به شما میگوید که در کجای برنامه میتوان از متغیر استفاده کرد و یا
متغیر قابل دسترسی است .به عنوان مثال متغیری که در داخل یک متد تعریف میشود فقط در داخل بدنه متد قابل دسترسی
است .میتوان دو متغیر با نام یکسان در دو متد مختلف تعریف کرد .برنامه زیر این ادعا را اثبات میکند:
مشاهده میکنید که حتی اگر ما دو متغیر با نام یکسان تعریف کنیم که دارای محدودههای متفاوتی هستند ،میتوان به هر کدام
از آنها مقادیر مختلفی اختصاص داد .متغیر تعریف شده در داخل متد )( Mainدر خط 6هیچ ارتباطی به متغیر داخل متد
)( DemonstrateScopeدر خط 31ندارد .وقتی به مبحث کالسها رسیدیم در این باره بیشتر توضیح خواهیم داد.
آرگومان های متغیر ) ،(VarArgsدر JDK 5اضافه شده است و به شما اجازه می دهد تعداد آرگومان های دلخواه (متغیر ) و البته
همنوع را به متد ارسال کنید .برای ایجاد متدی که به تعداد دلخواه پارامتر دریافت کند از عالمت سه نقطه (…) به صورت زیر استفاده
می شود:
{
// method body
}
1 + 2 + 3 = 6
1 + 2 + 3 + 4 = 10
1 + 2 + 3 + 4 + 5 = 15
همانطور که در مثال باال مشاهده می کنید یک متد به نام )( CalculateSumدر خط 1تعریف شده است .برای اینکه این متد
تعداد دلخواه پارامتر دریافت کند ،از عالمت سه نقطه (…) بعد از نوع داده ای پارامتر آن استفاده شده است .در اصل کلمه
numbersیک آرایه است ،که وقتی ما آرگومان ها را به متد ارسال می کنیم در این آرایه ذخیره می شوند .حال متد را سه بار با
تعداد مختلف آرگومانها فراخوانی می کنیم و سپس با استفاده از حلقه foreachاین آرگومانها را جمع و به متد فراخوان برگشت
می دهیم .وقتی از چندین پارامتر در یک متد استفاده می کنید فقط یکی از آنها باید دارای عالمت سه نقطه )…( بوده و همچنین
از لحاظ مکانی باید آخرین پارامتر باشد .اگر این پارامتر (پارامتری که دارای سه نقطه است) در آخر پارامترهای دیگر قرار نگیرد و یا
از چندین پارامتر سه نقطه دار استفاده کنید با خطا مواجه می شوید .به مثالهای اشتباه و درست زیر توجه کنید:
سربارگذاری متدها
سربارگذاری متدها به شما اجازه میدهد که چندین متد با نام یکسان تعریف کنید که دارای امضا و تعداد پارامترهای مختلف
هستند .برنامه از روی آرگومانهایی که شما به متد ارسال میکنید به صورت خودکار تشخیص میدهد که کدام متد را فراخوانی
کردهاید یا کدام متد مد نظر شماست .امضای یک متد نشان دهنده ترتیب و نوع پارامترهای آن است .به مثال زیر توجه کنید:
که امضای متد باال ) MyMethod(int, double, stringمیباشد .به این نکته توجه کنید که نوع برگشتی و نام پارامترها شامل
امضای متد نمیشوند .در مثال زیر نمونه ای از سربارگذاری متدها آمده است.
در برنامه باال دو متد با نام مشابه تعریف شدهاند .اگر سربارگذاری متد توسط جاوا پشتیبانی نمیشد برنامه زمان زیادی برای انتخاب
یک متد از بین متدهایی که فراخوانی میشوند الزم داشت .رازی در نوع پارامترهای متد نهفته است .کمپایلر بین دو یا چند متد
در صورتی فرق میگذارد که پارامترهای متفاوتی داشته باشند .وقتی یک متد را فراخوانی میکنیم ،متد نوع آرگومانها را تشخیص
میدهد .در فراخوانی اول (خط )31ما یک مقدار doubleرا به متد )( ShowMessageارسال کردهایم در نتیجه متد
۵۳۳ مبانی زبان جاوا
)(( ShowMessageخطوط )1-0که دارای پارامتری از نوع doubleاجرا میشود .در بار دوم که متد فراخوانی میشود (خط )30ما
یک مقدار intرا به متد )( ShowMessageارسال میکنیم متد )(( ShowMessageخطوط )33-31که دارای پارامتری از نوع int
است اجرا میشود .معنای اصلی سربارگذاری متد همین است که توضیح داده شد.
هدف اصل ی از سربارگذاری متدها این است که بتوان چندین متد که وظیفه یکسانی انجام میدهند را تعریف کرد تعداد زیادی از
متدها در جاوا سربارگذاری میشوند مانند متد )( printlnاز کالس .outقبال مشاهده کردید که این متد میتواند یک آرگومان از
نوع رشته دریافت کند و آن را نمایش دهد ،و در حالت دیگر میتواند دو یا چند آرگومان قبول کند.
بازگشت)(Recursion
بازگشت فرایندی است که در آن متد مدام خود را فراخوانی میکند تا زمانی که به یک مقدار مورد نظر برسد .بازگشت یک مبحث
پیچیده در برنامه نویسی است و تسلط به آن کار راحتی نیست .به این نکته هم توجه کنید که بازگشت باید در یک نقطه متوقف
شود وگرنه برای بی نهایت بار ،متد ،خود را فراخوانی میکند .در این درس یک مثال ساده از بازگشت را برای شما توضیح میدهیم.
فاکتوریل یک عدد صحیح مثبت )! (nشامل حاصل ضرب همه اعداد مثبت صحیح کوچکتر یا مساوی آن میباشد .به فاکتوریل
5! = 5 * 4 * 3 * 2 * 1 = 120
بنابراین برای ساخت یک متد بازگشتی باید به فکر توقف آن هم باشیم .بر اساس توضیح بازگشت ،فاکتوریل فقط برای اعداد مثبت
صحیح است .کوچکترین عدد صحیح مثبت 3است .در نتیجه از این مقدار برای متوقف کردن بازگشت استفاده میکنیم.
16 }
17 }
120
متد مقدار بزرگی را بر میگرداند چون محاسبه فاکتوریل میتواند خیلی بزرگ باشد .متد یک آرگومان که یک عدد است و میتواند
در محاسبه مورد استفاده قرار گیرد را میپذیرد .در داخل متد یک دستور ifمینویسیم و در خط 1می گوییم که اگر آرگومان
ارسال شده برابر 3باشد سپس مقدار 3را برگردان در غیر اینصورت به خط بعد برو .این شرط باعث توقف تکرارها نیز میشود .در
خط 33مقدار جاری متغیر numberدر عددی یک واحد کمتر از خودش ) (number – 1ضرب میشود .در این خط متد Factorial
خود را فراخوانی میکند و آرگومان آن در این خط همان number – 1است .مثال اگر مقدار جاری numberبرابر 33باشد ،یعنی اگر
ما بخواهیم فاکتوریل عدد 33را به دست بیاوریم آرگومان متد )( Factorialدر اولین ضرب 6خواهد بود .فرایند ضرب تا زمانی
ادامه مییابد که آرگومان ارسال شده با عدد 3برابر نشود .شکل زیر فاکتوریل عدد 1را نشان میدهد.
;factorial = 1
این کد از کد معادل بازگشتی آن آسان تر است .از بازگشت در زمینههای خاصی در علوم کامپیوتر استفاده میشود .استفاده از
بازگشت حافظه زیادی اشغال میکند پس اگر سرعت برای شما مهم است از آن استفاده نکنید.
شمارش)(Enumeration
شمارش راهی برای تعریف دادههایی است که میتوانند مقادیر محدودی که شما از قبل تعریف کردهاید را بپذیرند .به عنوان مثال
شما میخواهید یک متغیر تعریف کنید که فقط مقادیر جهت (جغرافیایی) مانند north ،west ،eastو southرا در خود ذخیره
کند .ابتدا یک enumerationتعریف میکنید و برای آن یک اسم انتخاب کرده و بعد از آن تمام مقادیر ممکن که میتوانند در
داخل بدنه آن قرار بگیرند تعریف میکنید .به نحوه تعریف یک enumerationتوجه کنید:
enum enumName
{
value1,
value2,
value3,
.
.
.
valueN
}
ابتدا کلمه کلیدی enumو سپس نام آن را به کار میبریم .در جاوا برای نامگذاری enumerationاز روش پاسکال استفاده کنید.
در بدنه enumمقادیری وجو د دارند که برای هر کدام یک نام در نظر گرفته شده است و به وسیله کاما از هم جدا شدهاند .به یک
enum Direction
{
North,
East,
South,
West
}
3 import java.text.MessageFormat;
4
5 enum Direction
6 {
7 North,
8 East,
9 South,
10 West
11 }
12
13 public class MyFirstProgram
14 {
15 public static void main(String[] args)
16 {
17 Direction myDirection;
18
19 myDirection = Direction.North;
20
21 System.out.println(MessageFormat.format("Direction: {0}", myDirection));
22 }
23 }
Direction: North
این کار باعث. را خارج از کالس قرار دادهایمenumeration توجه کنید که. تعریف میکنیم1-33 را در خطوطenumeration ابتدا
را در داخل کالس هم تعریف کرد ولی درenumeration میتوان. در سراسر برنامه در دسترس باشدenumeration میشود که
یک متغیر31 در خط.)1-33 نام چهار جهت جغرافیایی وجود دارد (خطوطenumeration در داخل بدنه.برنامه را ادامه میدهیم
: نحوه تعریف آن به صورت زیر است.تعریف شده است که مقدار یک جهت را در خود ذخیره میکند
enumType variableName;
۵۳1 مبانی زبان جاوا
نیز نامی است که برای آن انتخابvariableName یا مسیر) میباشد وDirection نوع داده شمارشی (مثالenuType در اینجا
برای.)36 اختصاص میدهیم (خطmyDirection سپس یک مقدار به متغیر. استmyDirection کردهایم که در مثال قبل
variable = enumType.value;
به روش زیر، میتوان یک متغیر را فورا.) را مینویسیمNorth سپس عالمت نقطه و بعد مقدار آن (مثالEnumeration ابدا نوع
ها مانند کالسها و اینترفیس ها از انواعenum . را چاپم کنیمmyDirection مقدارprintln() با استفاده از53 حال در خط
میتوان یک عددenum به هر عضو از یک.ارجاعی به حساب میآیند و بنابر این میتوانند دارای سازنده و فیلد و متد باشند
1 package myfirstprogram;
2
3 enum Direction
4 {
5 North(3),
6 East(5),
7 South(7),
8 West(4);
9
10 private final int directionindex;
11
12 Direction(int index)
13 {
14 this.directionindex = index;
15 }
16
17 public int GetDirectionIndex()
18 {
19 return this.directionindex;
20 }
21 }
22
23 public class MyFirstProgram
24 {
25 public static void main(String[] args)
26 {
27 Direction myDirection = Direction.East;
28 System.out.println(myDirection.GetDirectionIndex());
29 }
30 }
5
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 310
همانطور که در کد باال مشاهده میکنید یک نوع شمارشی با نام Directionدر خطوط 1-53تعریف کردهایم .به مقادیر این نوع
شمارشی در خطوط 1-0مقادیری را اختصاص دادهایم .در خط 33یک فیلد با نام directionindexتعریف کردهایم تا مقدار هر
یک از عناصر شمارشی را که میخواهیم به وسیله سازنده ای که در خطوط 35-31تعریف شده است در آن قرار دهیم .برای به دست
آوردن این مقادیر هم از متد )(( GetDirectionIndexخطوط )31-53استفاده میکنیم .حال فرض کنید میخواهیم مقدار عددی
که به Eastاختصاص داده شده است را به دست آوریم .برای این کار همانطور که در خط 51مشاهده میکنید ابتدا یک نمونه
از Directionایجاد کرده و Direction.Eastرا به آن اختصاص میدهیم ،سپس در خط 50با فراخوانی متد
)( GetDirectionIndexمقدار عددی Eastرا به دست میآوریم .از همین عدد 1به دست آمده در مثال باال میتوان در
))(switch(myDirection.GetDirectionIndex
{
;)"!case 1 : System.out.println("incorrect
;break
;)"case 5 : System.out.println("That is Correct.
;break
}
باید به صورت public staticتعریف شود .همه ما می دانیم که برای متدها می توان آرگومان ارسال کرد ،اما برای متد
) main(String[] argsچطور؟ جواب مثبت است .شما می توانید از طریق دستور خط فرمان ویندوز یا همان CMDآرگومان
هایی را برای این متد ارسال کنید .برای روشن شدن مطلب یک برنامه کنسول به نام Sampleایجاد کنید ،سپس کدهای برنامه را
به پارامتر argsتوجه کنید .در حقیقت این پارامتر یک آرایه رشته ای است که می تواند چندین آرگومان از نوع رشته قبول کند.
فایل Sample.javaرا به یک درایو یا پوشه مشخص که مسیر گیج کننده ای نداشته باشد انتقال دهید .در این مثال ما فایل آن
را مستقیما در درایو Cقرار می دهیم .حال CMDویندوز را اجرا کنید ،سپس کدهای زیر (خطوط قرمز) را در داخل CMDنوشته و
C:\Users\VisualCsharp>cd/
C:\>javac Sample.java
>\C:
همانطور که در کد باال مشاهده می کنید ،بعد از نوشتن نام فایل ،عبارت Steven Clarkرا نوشته ایم .دو کلمه این عبارت جایگزین
دو متغیر به نام های ] args[0و ] args[1که تعریف کرده ایم ،می شوند .این دو متغیر ،به ترتیب خانه های اول و دوم آرایه
هستند .کلمه Stevenدر متغیر رشته ای ] args[0که اولین عنصر آرایه و کلمه Clarkرا در متغیر رشته ای ] args[1که
دومین عنصر آرایه است ذخیره و سپس با استفاده از متد )( printlnآنها را چاپ می کنیم .در حقیقت بسیاری از برنامه ها از
این تکنیک استفاده می کنند .شما می توانید با ارسال آرگومان هایی به متد )( mainنحوه اجرای برنامه را تغییر دهید.
واقعی است .برای مثال یک ماشین را در نظر بگیرید .این ماشین دارای خواصی مانند رنگ ،سرعت ،مدل ،سازنده و برخی خواص
دیگر است .همچنین دارای رفتارها و حرکاتی مانند شتاب و پیچش به چپ و راست و ترمز است .اشیاء در جاوا تقلیدی از یک شیء
مانند ماشین در دنیای واقعی هستند .برنامه نویسی شیء گرا با استفاده از کدهای دسته بندی شده کالسها و اشیاء را بیشتر قابل
کنترل میکند.
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 333
در ابتدا ما نیاز به تعریف یک کالس برای ایجاد اشیاء مان داریم .شیء در برنامه نویسی شیء گراء از روی کالسی که شما تعریف
کردهاید ایجاد میشود .برای مثال نقشه ساختمان شما یک کالس است که ساختمان از روی آن ساخته شده است.کالس شامل
خواص یک ساختمان مانند مساحت،بلندی و مواد مورد استفاده در ساخت خانه میباشد .در دنیای واقعی ساختمانها نیز بر اساس
یک نقشه (کالس) پایه گذاری (تعریف) شدهاند .برنامه نویسی شیء گرا یک روش جدید در برنامه نویسی است که بوسیله برنامه
نویسان مورد استفاده قرار میگیرد و به آنها کمک میکند که برنامههایی با قابلیت استفاده مجدد ،خوانا و راحت طراحی کنند.جاوا
نیز یک برنامه شیء گراست .در درس زیر به شما نحوه تعریف کالس و استفاده از اشیاء آموزش داده خواهد شد .همچنین شما با
دو مفهوم وراثت و چند ریختی که از مباحث مهم در برنامه نویسی شیء گرا هستند در آینده آشنا میشوید.
کالس
کالس به شما اجازه میدهد یک نوع داده ای که توسط کاربر تعریف میشود و شامل فیلدها و خواص ) (propertiesو متدها
است را ایجاد کنید .کالس در حکم یک نقشه برای یک شیء میباشد .شیء یک چیز واقعی است که از ساختار ،خواص و یا رفتارهای
وقتی یک شیء میسازید یعنی اینکه یک نمونه از کالس ساختهاید (در درس ممکن است از کلمات شیء و نمونه به جای هم
استفاده شود) .ابتدا ممکن است فکر کنید که کالسها و ساختارها شبیه هم هستند .تفاوت مهم بین این دو این است که کالسها
از نوع مرجع و ساختارها از نوع داده ای هستند .در درسهای آینده این موضوع شرح داده خواهد شد .اگر یادتان باشد در بخشهای
اولیه این آموزش کالسی به نام MyFirstProgramتعریف کردیم که شامل متد )( mainبود و ذکر شد که این متد نقطه آغاز هر
برنامه است .برای تعریف یک کالس از کلمه کلیدی classبه صورت زیر استفاده میشود:
class ClassName
{
;field1
;field2
...
;fieldN
;method1
;method2
...
;methodN
}
۵1۵ مبانی زبان جاوا
Pascal در نامگذاری کالسها هم از روش نامگذاری.این کلمه کلیدی را قبل از نامی که برای کالسمان انتخاب میکنیم مینویسیم
فیلدها اعضای داده ای خصوصی هستند که کالس از. در بدنه کالس فیلدها و متدهای آن قرار داده میشوند.استفاده میکنیم
متدها رفتارها یا کارهایی هستند که یک کالس.( استفاده میکندproperty) آنها برای رفتارها و ذخیره مقادیر خاصیتهایش
. نشان داده شده استperson در زیر نحوه تعریف و استفاده از یک کالس ساده به نام.میتواند انجام دهد
1 package myfirstprogram;
2
3 import java.text.MessageFormat;
4
5 class Person
6 {
7 public String name;
8 public int age;
9 public double height;
10
11 public void TellInformation()
12 {
13 System.out.println(MessageFormat.format("Name: {0}", name));
14 System.out.println(MessageFormat.format("Age: {0} years old", age));
15 System.out.println(MessageFormat.format("Height: {0}cm", height));
16 }
17 }
18
19 public class MyFirstProgram
20 {
21 public static void main(String[] args)
22 {
23 Person firstPerson = new Person();
24 Person secondPerson = new Person();
25
26 firstPerson.name = "Jack";
27 firstPerson.age = 21;
28 firstPerson.height = 160;
29 firstPerson.TellInformation();
30
31 System.out.println(); //Separator
32
33 secondPerson.name = "Mike";
34 secondPerson.age = 23;
35 secondPerson.height = 158;
36 secondPerson.TellInformation();
37 }
38 }
Name: Jack
Age: 21 years old
Height: 160cm
Name: Mike
Age: 23 years old
Height: 158cm
می دانیم که کالس.) میباشد36-10 (خطوطMyFirstProgram ) و1-31 (خطوطPerson برنامه باال شامل دو کالس
Person است که برنامه برای اجرا به آن احتیاج دارد ولی اجازه دهید که بر روی کالسmain() شامل متدMyFirstProgram
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 335
تمرکز کنیم .در خطوط 1-31کالس Personتعریف شده است .در خط 1یک نام به کالس اختصاص دادهایم تا به وسیله آن قابل
دسترسی باشد .در داخل بدنه کالس فیلدهای آن تعریف شدهاند (خطوط .)6-1
این سه فیلد تعریف شده خصوصیات واقعی یک فرد در دنیای واقعی را در خود ذخیره میکنند .یک فرد در دنیای واقعی دارای نام،
سن ،و قد میباشد .در خطوط 33-31یک متد هم در داخل کالس به نام )( TellInformationتعریف شده است که رفتار کالسمان
است و مثال اگر از فرد سوالی بپرسیم در مورد خودش چیزهایی میگوید .در داخل متد کدهایی برای نشان دادن مقادیر موجود در
فیلدها نوشته شده است .نکته ای درباره فیلدها وجود دارد و این است که چون فیلدها در داخل کالس تعریف و به عنوان اعضای
این بدین معناست که فیلدها فقط میتوانند در داخل کالس یعنی جایی که به آن تعلق دارند و یا به وسیله نمونه ایجاد شده از
کالس مورد استفاده قرار بگیرند .در داخل متد )( mainو در خطوط 51و 53دو نمونه یا دو شیء از کالس Personایجاد میکنیم.
برای ایجاد یک نمونه از یک کالس باید از کلمه کلیدی newو به دنبال آن نام کالس و یک جفت پرانتز قرار دهیم .وقتی نمونه کالس
ایجاد شد ،سازنده را صدا میزنیم .یک سازنده متد خاصی است که برای مقداردهی اولیه به فیلدهای یک شیء به کار میرود .وقتی
هیچ آرگومانی در داخل پرانتزها قرار ندهید ،کالس یک سازنده پیشفرض بدون پارامتر را فراخوانی میکند .درباره سازندهها در
درسهای آینده توضیح خواهیم داد .در خطوط 51-56مقادیری به فیلدهای اولین شیء ایجاد شده از کالس Person (first
) Personاختصاص داده شده است .برای دسترسی به فیلدها یا متدهای یک شیء از عالمت نقطه (دات) استفاده میشود .به
عنوان مثال کد firstPerson.nameنشان دهنده فیلد nameاز شیء firstPersonمیباشد .برای چاپ مقادیر فیلدها باید متد
در خطوط 11-11نیز مقادیری به شیء دومی که قبال از کالس ایجاد شده تخصیص میدهیم و سپس متد )(TellInformation
را فراخوانی میکنیم .به این نکته توجه کنید که firstPersonو secondPersonنسخههای متفاوتی از هر فیلد دارند بنابراین
تعیین یک نام برای secondPersonهیچ تاثیری بر نام firstPersonندارد .در مورد اعضای کالس در درسهای آینده توضیح
خواهیم داد.
۵1۳ مبانی زبان جاوا
سازنده
آنها به شما اجازه میدهند که مقادیری را به هر.سازندهها متدهای خاصی هستند که وجود آنها برای ساخت اشیاء الزم است
یک از اعضای داده ای یک آرایه اختصاص دهید و کدهایی که را که میخواهید هنگام ایجاد یک شیء اجرا شوند را به برنامه اضافه
کمپایلر از سازنده پیشفرض که یک سازنده بدون پارامتر است استفاده، اگر از هیچ سازنده ای در کالستان استفاده نکنید.کنید
در مثال زیر یک کالس که. میتوانید در برنامهتان از تعداد زیادی سازنده استفاده کنید که دارای پارامترهای متفاوتی باشند.میکند
1 package myfirstprogram;
2
3 import java.text.MessageFormat;
4
5 class Person
6 {
7 public String name;
8 public int age;
9 public double height;
10
11 //Explicitly declare a default constructor
12 public Person()
13 {
14 }
15
16 //Constructor that has 3 parameters
17 public Person(String n, int a, double h)
18 {
19 name = n;
20 age = a;
21 height = h;
22 }
23
24 public void ShowInformation()
25 {
26 System.out.println(MessageFormat.format("Name: {0}", name));
27 System.out.println(MessageFormat.format("Age: {0} years old", age));
28 System.out.println(MessageFormat.format("Height: {0}cm", height));
29 }
30 }
31
32 public class MyFirstProgram
33 {
34 public static void main(String[] args)
35 {
36 Person firstPerson = new Person();
37 Person secondPerson = new Person("Mike", 23, 158);
38
39 firstPerson.name = "Jack";
40 firstPerson.age = 21;
41 firstPerson.height = 160;
42 firstPerson.ShowInformation();
43
44 System.out.println(); //Seperator
45
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 333
46 ;)(secondPerson.ShowInformation
47 }
48 }
Name: Jack
Age: 21 years old
Height: 160cm
Name: Mike
Age: 23 years old
Height: 158cm
همانطور که مشاهده میکنید در مثال باال دو سازنده را به کالس Personاضافه کردهایم .یکی از آنها سازنده پیشفرض (خطوط
)35-33و دیگری سازنده ای است که سه آرگومان قبول میکند (خطوط .)36-53به این نکته توجه کنید که سازنده درست شبیه به یک
سازنده پیشفرض در داخل بدنهاش هیچ چیزی ندارد و وقتی فراخوانی میشود که ما از هیچ سازنده ای در کالس مان استفاده
نکنیم .در آینده متوجه میشوید که چطور میتوان مقادیر پیشفرضی به اعضای داده ای اختصاص داد ،وقتی که از یک سازنده
پیشفرض استفاده میکنید .به دومین سازنده توجه کنید .اوال که نام آن شبیه نام سازنده اول است .سازندهها نیز مانند متدها
میتوانند سربارگذاری شوند .حال اجازه دهید که چطور میتوانیم یک سازنده خاص را هنگام تعریف یک نمونه از کالس فراخوانی
کنیم.
در اولین نمونه ایجاد شده از کالس Personاز سازنده پیشفرض استفاده کردهایم چون پارامتری برای دریافت آرگومان ندارد .در
دومین نمونه ایجاد شده ،از سازنده ای استفاده میکنیم که دارای سه پارامتر است .کد زیر تأثیر استفاده از دو سازنده مختلف را
نشان میدهد:
;"firstPerson.name = "Jack
;firstPerson.age = 21
;firstPerson.height = 160
;)(firstPerson.ShowInformation
System.out.println(); //Seperator
۵1۱ مبانی زبان جاوا
;)(secondPerson.ShowInformation
همانطور که مشاهده میکنید الزم است که به فیلدهای شیء ای که از سازنده پیشفرض استفاده میکند مقادیری اختصاص داده
شود تا این شیء نیز با فراخوانی متد )( ShowInformationآنها را نمایش دهد .حال به شیء دوم که از سازنده دارای پارامتر
استفاده میکند توجه کنید ،مشاهده میکنید که با فراخوانی متد )( ShowInformationهمه چیز همانطور که انتظار میرود اجرا
میشود .این بدین دلیل است که شما هنگام تعریف نمونه و از قبل مقادیری به هر یک از فیلدها اختصاص دادهاید بنابراین آنها
نیاز به مقدار دهی مجدد ندارند ،مگر اینکه شما بخواهید این مقادیر را اصالح کنید.
در مثالهای قبلی یک سازنده پیشفرض با بدنه خالی نشان داده شد .شما میتوانید به بدنه این سازنده پیشفرض کدهایی اضافه
)(public Person
{
;"this.name = "No Name
;this.age = 0
;this.height = 0
}
همانطور که در مثال باال میبینید سازنده پیشفرض ما چیزی برای اجرا دارد .اگر نمونه ای ایجاد کنیم که از این سازنده پیشفرض
استفاده کند ،نمونه ایجاد شده مقادیر پیشفرض سازنده پیشفرض را نشان میدهد.
;)(person1.ShowInformation
Name: No Name
Age: 0 years old
Height: 0cm
راهی دیگر برای ایجاد مقادیر پیشفرض استفاده از کلمه کلیدی thisاست .مثال زیر اصالح شده مثال قبل است و نحوه استفاده
1 package myfirstprogram;
2
3 import java.text.MessageFormat;
4
5 class Person
6 {
7 public String name;
8 public int age;
9 public double height;
10
11 public Person()
12 {
13 this.name = "No Name";
14 this.age = 0;
15 this.height = 0;
16 }
17
18 public Person(String n)
19 {
20 this.name = n;
21 }
22
23 public Person(String n, int a)
24 {
25 this.name = n;
26 this.age = a;
27 }
28
29 public Person(String n, int a, double h)
30 {
31 this.name = n;
32 this.age = a;
33 this.height = h;
34 }
35
36 public void ShowInformation()
37 {
38 System.out.println(MessageFormat.format("Name: {0}", name));
39 System.out.println(MessageFormat.format("Age: {0} years old", age));
40 System.out.println(MessageFormat.format("Height: {0}cm\n", height));
41 }
42 }
43
44 public class MyFirstProgram
45 {
46 public static void main(String[] args)
47 {
48 Person firstPerson = new Person();
49 Person secondPerson = new Person("Jack");
50 Person thirdPerson = new Person("Mike", 23);
51 Person fourthPerson = new Person("Chris", 18, 152);
52
53 firstPerson.ShowInformation();
54 secondPerson.ShowInformation();
55 thirdPerson.ShowInformation();
56 fourthPerson.ShowInformation();
57 }
58 }
Name: No Name
Age: 0 years old
Height: 0cm
۵11 مبانی زبان جاوا
Name: Jack
Age: 0 years old
Height: 0cm
Name: Mike
Age: 23 years old
Height: 0cm
Name: Chris
Age: 18 years old
Height: 152cm
ما چهار سازنده بری اصالح کالسمان تعریف کردهایم (خطوط .)15 ،51 ،30 ،33شما میتوانید تعداد زیادی سازنده برای مواقع لزوم
در کالس داشته باشید .اولین سازنده یک سازنده پیشفرض است .دومین سازنده یک پارامتر از نوع رشته دریافت میکند .سومین
سازنده دو پارامتر و چهارمین سازنده سه پارامتر میگیرد .به چارمین سازنده در خطوط 15-11توجه کنید .سه سازنده دیگر به این
سازنده وابسته هستند .در خطوط 33-31یک سازنده پیشفرض بدون پارامتر تعریف شده است .به کلمه کلیدی thisتوجه کنید.
این کلمه کلیدی به شما اجازه میدهد که یک سازنده دیگر موجود در داخل کالس را فراخوانی کنید .مقادیر پیشفرضی به فیلدها
از طریق سازنده پیشفرض اختصاص میدهیم .چون ما سه مقدار پیشفرض برای فیلدها بعد از کلمه کلیدی thisسازنده پیشفرض
(خطوط )31-31در نظر گرفتهایم ،در نتیجه سازنده ای که دارای سه پارامتر است (چهارمین سازنده) فراخوانی شده و سه آرگومان به
پارامترهای آن ارسال میشود .کدهای داخل بدنه چهارمین سازنده اجرا میشوند و مقادیر پارامترهای آن به هر یک از اعضای داده
ای یه همان فیلدهای تعریف شده در خطوط 1-6اختصاص داده میشود .اگر کدی در داخل بدنه سازنده پیشفرض بنویسیم قبل از
بقیه کدها اجرا میشود .دومین سازنده (خطوط )30-51به یک آرگومان نیاز دارد که همان فیلد nameکالس Personاست .وقتی
این پارامتر با یک مقدار رشته ای پر شد ،سپس به پارامترهای سازنده چهارم ارسال شده و در کنار دو مقدار پیشفرض دیگر ( 3برای
ageو 3برای )heightقرار میگیرد .در خط 51-13سومین سازنده تعریف شده است که بسیار شبیه دومین سازنده است با این
تفاوت که دو پارامتر دارد .مقدار دو پارامتر سومین سازنده به اضافهی یک مقدار پیشفرض صفر برای سومین آرگومان ،به چهارمین
همانطور که مشاهده میکنید با ایجاد چندین سازنده برای یک کالس ،چندین راه برای ایجاد یک شیء بر اساس دادههایی که نیاز
داریم به وجود میآید .در مثال باال 3نمونه از کالس Personایجاد کردهایم و چهار تغییر در سازنده آن به وجود آوردهایم .سپس
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 330
مقادیر مربوط به فیلدهای هر نمونه را نمایش میدهیم .یکی از موارد استفاده از کلمه کلیدی thisبه صورت زیر است .فرض کنید
نام پارامترهای متد کالس شما یا سازنده ،شبیه نام یکی از فیلدها باشد.
این نوع کدنویسی ابهام بر انگیز است و کمپایلر نمیتواند متغیر را تشخیص داده و مقداری به آن اختصاص دهد .اینجاست که از
قبل از هر فیلدی کلمه کلیدی thisرا مینویسیم و نشان میدهیم که این همان چیزی است که میخواهیم به آن مقداری اختصاص
سطح دسترسی
سطح دسترسی مشخص میکند که متدها یک کالس یا اعضای داده ای در چه جای برنامه قابل دسترسی هستند .در این درس
میخواهیم به سطح دسترسی privateو publicنگاهی بیندازیم .سطح دسترسی publicزمانی مورد استفاده قرار میگیرد
که شما بخواهید به یک متد یا فیلد در خارج از کالس و حتی پروژه دسترسی یابید .به عنوان مثال به کد زیر توجه کنید:
15
16 ;x.number = 10
17 }
18 }
در این مثال یک کالس به نام Testتعریف کردهایم (خطوط .)1-0سپس یک فیلد یا عضو داده ای به صورت publicدر داخل
کالس Testتعریف میکنیم (خط .)1با تعریف این عضو به صورت publicمیتوانیم آن را در خارج از کالس Testو در داخل
متد )( mainکالس MyFirstProgramمقدار دهی کنیم .حال سطح دسترسی publicرا به privateتغییر میدهیم:
همانطور که در مثال باال مشاهده میکنید این بار از کلمه privateدر تعریف فیلد numberاستفاده کردهایم (خط .)1وقتی که
برنامه را کامپایل میکنیم با خطا مواجه میشویم چون numberدر داخل کالس MyFirstProgramو یا هر کالس دیگر قابل
دسترسی نیست.
نکته دیگر اینکه اگر شما برای یک کالس سطح دسترسی تعریف نکنید آن کالس دارای سطح دسترسی داخلی (default
) modifierمیشود به این معنی که فقط کالسهای داخل پروژه ای که با آن کار میکنید و میتوانند به آن کالس دسترسی یابند.
اگر یک کالس را به صورت publicو اعضای آن را به صورت privateتعریف کنیم ،آنگاه میتوان یک نمونه از کالس را در
داخل کالسهای دیگر ایجاد کرد ولی اعضای آن قابل دسترسی نیستند .اعضای داده ای privateفقط به وسیله متد داخل کالس
کد باال کامپایل نمی شود ،چون جاوا به شما اجازه استفاده از دو کالس عمومی در یک فایل را نمی دهد .برای حل این مشکل یا
باید کلمه publicرا مثال از ابتدای کالس Testحذف کنیم و یا اینکه چون ما می خواهیم حتما کالس به صورت public
تعریف شود و اعضای آن به صورت privateآن را باید در یک فایل جدا به صورت زیر تعریف و با پسوند .javaتعریف کنیم
:
همانطور که در شکل باال و پایین مشاهده می کنید باید دو کالس در داخل یک Packageباشند:
۵۱۵ مبانی زبان جاوا
حال اگر از کالس Testدر کالس MyFirstProgramنمونه ای ایجاد کرده و بخواهیم از فیلد numberاستفاده کنیم با خطا
مواجه می شویم ،چون که اعضای با سطح دسترسی privateدر خارج از کالسی که به آن تعلق دارند ،غیر قابل دسترس هستند
:
;package myfirstprogram
;x.number = 10
}
}
سطوح دسترسی دیگری هم در جاوا وجود دارد که بعد از مبحث وراثت در درسهای آینده در مورد آنها توضیح خواهیم داد.
کپسوله سازی)(Encapsulation
کپسوله سازی (تلفیق دادهها با یکدیگر) یا مخفی کردن اطالعات فرایندی است که طی آن اطلالعات حساس یک موضوع از دید
کاربر مخفی میشود و فقط اطالعاتی که الزم باشد برای او نشان داده میشود.
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 315
وقتی که یک کالس تعریف میکنیم معموال تعدادی اعضای داده ای (فیلد) برای ذخیره مقادیر مربوط به شیء نیز تعریف میکنیم.
برخی از این اعضای داده ای توسط خود کالس برای عملکرد متدها و برخی دیگر از آنها به عنوان یک متغیر موقت به کار میروند.
به این اعضای داده ای ،اعضای مفید نیز می گویند چون فقط در عملکرد متدها تأثیر دارند و مانند یک داده قابل رویت کالس
نیستند .الزم نیست که کاربر به تمام اعضای داده ای یا متدهای کالس دسترسی داشته باشد .اینکه فیلدها را طوری تعریف کنیم
که در خارج از کالس قابل دسترسی باشند بسیار خطرناک است چون ممکن است کاربر رفتار و نتیجه یک متد را تغییر دهد .به
110
متد داخل کالس Testبه نام )( AddFiveدارای هدف ساده ای است و آن اضافه کردن مقدار 1به هر عدد میباشد .در داخل متد
)( mainیک نمونه از کالس Testایجاد کردهایم و مقدار فیلد آن را از 1به 33تغییر میدهیم (در اصل نباید تغییر کند چون ما از
برنامه خواستهایم هر عدد را با 1جمع کند ولی کاربر به راحتی آن را به 33تغییر میدهد) .همچنین متد )( AddFiveرا فراخوانی و
مقدار 333را به آن ارسال میکنیم .مشاهده میکنید که قابلیت متد )( AddFiveبه خوبی تغییر میکند و شما نتیجه متفاوتی
مشاهده میکنید .اینجاست که اهمیت کپسوله سازی مشخص میشود .اینکه ما در درسهای قبلی فیلدها را به صورت public
تعریف کردیم و به کاربر اجازه دادیم که در خارج از کالس به آنها دسترسی داشته باشد کار اشتباهی بود .فیلدها باید همیشه به
(Properties)خواص
در داخل یک کالسprivate (خصوصیت) استانداردی در جاوا برای دسترسی به اعضای داده ای با سطح دسترسیProperty
) و یک بخش برای دسترسی به مقدارset یک بخش جهت مقدار دهی (بلوک، دارای دو بخش میباشدproperty هر.میباشد
تعریف شوند تا در کالسهای دیگر نیز قابلpublic ها باید به صورتproperty . میباشدprivate ) یک دادهget (بلوک
1 package myfirstprogram;
2
3 import java.text.MessageFormat;
4
5 class Person
6 {
7 private String name;
8 private int age;
9 private double height;
10
11 public void setName(String name)
12 {
13 this.name = name;
14 }
15
16 public String getName()
17 {
18 return name;
19 }
20
21 public void setAge(int age)
22 {
23 this.age = age;
24 }
25
26 public int getAge()
27 {
28 return age;
29 }
30
31 public void setHeight(double height)
32 {
33 this.height = height;
34 }
35
36 public double getHeight()
37 {
38 return height;
39 }
40
41
42 public Person(String name, int age, double height)
43 {
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 313
44 this.name = name;
45 this.age = age;
46 this.height = height;
47 }
48
49 }
50
51 public class MyFirstProgram
52 {
53 public static void main(String[] args)
54 {
55 Person person1 = new Person("Jack", 21, 160);
56 Person person2 = new Person("Mike", 23, 158);
57
58 System.out.println(MessageFormat.format("Name: {0}", person1.getName()));
59 System.out.println(MessageFormat.format("Age: {0} years old", person1.getAge()));
60 System.out.println(MessageFormat.format("Height: {0}cm", person1.getHeight()));
61
62 System.out.println(); //Separator
63
64 System.out.println(MessageFormat.format("Name: {0}", person2.getName()));
65 System.out.println(MessageFormat.format("Age: {0} years old", person2.getAge()));
66 System.out.println(MessageFormat.format("Height: {0}cm", person2.getHeight()));
67
68
69 person1.setName("Frank");
70 person1.setAge(19);
71 person1.setHeight(162);
72
73 person2.setName("Ronald");
74 person2.setAge(25);
75 person2.setHeight(174);
76
77 System.out.println(); //Separator
78
79 System.out.println(MessageFormat.format("Name: {0}", person1.getName()));
80 System.out.println(MessageFormat.format("Age: {0} years old", person1.getAge()));
81 System.out.println(MessageFormat.format("Height: {0}cm", person1.getHeight()));
82
83 System.out.println(); //Separator
84
85 System.out.println(MessageFormat.format("Name: {0}", person2.getName()));
86 System.out.println(MessageFormat.format("Age: {0} years old", person2.getAge()));
87 System.out.println(MessageFormat.format("Height: {0}cm", person2.getHeight()));
88 }
89 }
Name: Jack
Age: 21 years old
Height: 160cm
Name: Mike
Age: 23 years old
Height: 158cm
Name: Frank
Age: 19 years old
Height: 162cm
Name: Ronald
Age: 25 years old
Height: 174cm
۵۱۱ مبانی زبان جاوا
در برنامه باال نحوه استفاده از propertyآمده است.همانطور که مشاهده میکنید در این برنامه ما سه خصوصیت که هر کدام
مربوط به اعضای داده ای هستند تعریف کردهایم (سه فیلد با سطح دسترسی .)private
دسترسی به مقادیر این فیلدها فقط از طریق propertyهای ارائه شده امکان پذیر است.
وقتی یک خاصیت ایجاد میکنیم ،باید سطح دسترسی آن را publicتعریف کرده و نوع داده ای را که بر میگرداند یا قبول
میکند را مشخص کنیم .به این نکته توجه کنید که نام propertyها همانند نام فیلدهای مربوطه میباشد با این تفاوت که حرف
اول آنها بزرگ نوشته میشود .البته قبل از نام آنها کلمات setو getهم نوشته میشود .مثال برای فیلد ( nameخط )1دو متد
با نامهای setNameو ( getNameخطوط )33-36ایجاد شدهاند .البته یادآور میشویم که شباهت نام propertyها و فیلدها اجبار
نیست و یک قرارداد میباشد .در داخل بدنه دو بخش میبینید ،یکی بخش setو دیگری بخش : get
بخش ،getکه با کلمه getنشان داده شده است به شما اجازه میدهد که یک مقدار را از فیلدها (اعضای داده ای)
استخراج کنید.
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 311
بخش ،setکه با کلمه setنشان داده شده است برای مقدار دهی به فیلدها (اعضای داده ای) به کار میرود.
;this.name = name
این عبارت که در خط 31کد باال آمده است برای مقداردهی به فیلد nameبه کار رفته است this .به شئ جاری ایجاد شده از
کالس اشاره دارد ،کلمه nameبعد آن همان فیلد تعریف شده در خط 1کد ابتدای آموزش و کلمه nameسمت راست عالمت
مساوی هم پارامتر تعریف شده در خط 33است .برای دسترسی به یک خاصیت میتوانید از عالمت دات ( ).استفاده کنید.
فراخوانی یک خاصیت باعث اجرای کد داخل بدنه بلوک getآن میشود .سپس این بلوک مانند یک متد مقداری به فراخوان
;)"person1.setName("Frank
;)person1.setAge(19
;)person1.setHeight(162
دستورات باال بخش setمربوط به هر propertyرا فراخوانی کرده و مقادیری به هر یک از فیلدها اختصاص میدهد .استفاده
از propertyها کد نویسی را انعطاف پذیر میکند ،مخصوصا اگر بخواهید یک اعتبارسنجی برای اختصاص یک مقدار به فیلدها
یا استخراج یک مقدار از آنها ایجاد کنید .مثال شما میتوانید یک محدودیت ایجاد کنید که فقط اعداد مثبت به فیلد ( ageسن)
اختصاص داده شود .میتوانید با تغییر بخش setخاصیت Ageاین کار را انجام دهید:
حال اگر کاربر بخواهد یک مقدار منفی به فیلد ageاختصاص دهد مقدار ageصفر خواهد شد.
۵۱1 مبانی زبان جاوا
Package
( Packageپکیج) راهی برای دسته بندی کدهای برنامه میباشد .هر چیز در جاوا حداقل در یک Packageقرار دارد .وقتی برای
یک کالس اسمی انتخاب میکنید ممکن است برنامه نویسان دیگر به صورت اتفاقی اسمی شبیه به آن برای کالسشان انتخاب کنند.
وقتی شما از آن کالسها در برنامهتان استفاده کنید از آنجاییکه از کالسهای همنام استفاده میکنید در برنامه ممکن است خطا به
وجود آید.
Packageاز وقوع این خطاها جلوگیری کرده یا آنها را کاهش میدهند .تاکنون و در درسهای قبلی ما فقط با یک پکیج آشنا
شدهایم و آن پکیجی به نام myfirstprogramبود که کالسی به همین نام ) (MyFirstProgramو متد )( mainرا در خود
داشت .هنگامی که یک پروژه جدید ایجاد کنید به صورت پیشفرض یک فضای نام برای شما ایجاد خواهد شد که نام آن شبیه به
نام پروژهتان میباشد .در این درس به شما نشان میدهیم که چگونه کالسهایتان در در کدهای جداگانه بنویسید و سپس از آنها
در فایلهای جدا استفاده کنید .برنامه NetBeansرا اجرا و یک پروژه جدید ایجاد کنید:
بعد از کلیک بر روی گزینه New Projectو یا زدن دکمههای ترکیبی Ctrl+Shfit+Nپنجره ای به صورت زیر به نمایش در میآید
بعد از طی مراحل شکل باال صفحه زیر به نمایش در میآید .در این صفحه و در قسمت Project Nameنام پروژهتان را انتخاب
کنید .مشاهده میکنید که در کادری پایین تر از آن بسته به نام پروژه یک Packageبه همراه نام کالس ایجاد میکند:
۵۱۹ مبانی زبان جاوا
بعد از زدن دکمه finishدر شکل باال ،یک Packageیک classبه صورت زیر ایجاد میشود:
توجه کنید که پسوند کالس در جاوا به صورت .javaمیباشد .پس تا اینجا ما یک Packageو یک کالس و یک متد داریم .حال
میخواهیم یک پکیج دیگر ایجاد و از کالسها و متدهای آن در داخل این پکیج استفاده کنیم .برای این کار بر روی گزینه Source
Packageمانند شکل زیر راست کلیک کرده و یک پکیج جدید به نام MySecondPackageایجاد میکنیم:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 313
بعد از ایجاد این Packageیک کالس به نام MyClassبه آن ،به روش زیر اضافه میکنیم:
۵1۵ مبانی زبان جاوا
بعد از اضافه کردن کالس یک متد به نام )( sayHelloبه شکل زیر به کالس اضافه نمایید:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 315
حال فرض کنید که میخواهید از این کالس و متد در کالس MyFirstProgramاستفاده کنید .برای این کار بر روی کالس مذکور
دو بار کلیک کرده و سپس مانند شکل زیر و با استفاده از کلمه importکالس را در Packageاولی وارد نمایید و سپس با ایجاد
پس در کل میتوان نتیجه گرفت که با استفاده از کلمه کلیدی importمیتوان همه محتویات یک پکیج را در داخل پکیج دیگر
وا رد کرد .اگر قصد وارد کردن فقط یک کالس از یک پکیج را در داخل پکیج دیگر داشته باشیم به صورت زیر عمل میکنیم:
;import Package.Class
و اگر بخواهیم تمامی کالسهای یک Packageرا وارد Packageدیگر کنیم به صورت زیر عمل مینماییم:
;*import Package.
اگر از کلمه importاستفاده نکنیم مجبوریم که در ابتدای نام هر کالس Packageمربوط به آن را به صورت زیر ذکر کنیم:
شما محدود به دسته بندی کدهای کالستان در داخل یک Packageنیستید .میتوانید یک Packageتو در تو ایجاد کنید و
کدهایتان را در درون آن بنویسید .برای دسترسی به کالس ،Sampleمجبورید اول نام تمام Packageهایی را که کالس Sample
Package1.Package2.Sample
import Package1.Package2.Sample
وراثت
وراثت به یک کالس اجازه میدهد که خصوصیات یا متدهایی را از کالس دیگر به ارث برد .وراثت مانند رابطه پدر و پسری میماند
به طوریکه فرزند خصوصیاتی از قبیل قیافه و رفتار را از پدر خود به ارث برده باشد.
کالس پایه یا کالس والد کالسی است که بقیه کالسها از آن ارث میبرند.
کالس مشتق یا کالس فرزند کالسی است که از کالس پایه ارث بری میکند.
همه متد و خصوصیات کالس پایه میتوانند در کالس مشتق مورد استفاده قرار بگیرند به استثنای اعضا و متدهای با سطح دسترسی
.privateهمه کالسها در جاوا از کالس Objectارث بری میکنند .مفهوم اصلی وراثت در مثال زیر نشان داده شده است:
در این مثال دو کالس با نامهای Parentو Childتعریف شده است .در این مثال یک فیلد را با سطح دسترسی ( privateخط
)1و خاصیت مربوط به آن را با سطح دسترسی ( publicخط )1-31تعریف کردهایم .سپس یک متد را برای نمایش پیام تعریف
کردهایم .یک سازنده در کالس Parentتعریف شده است که یک آرگومان از نوع رشته قبول میکند و یک پیغام نمایش میدهد
(خطوط .)55-51حال به کالس Childتوجه کنید (خط .)50-13این کالس تمام متدها و خاصیتهای کالس Parentرا به ارث
براحتی میتوان با قرار دادن کلمه کلیدی extendsبعد از نام کالس و سپس نوشتن نام کالسی که از آن ارث بری میشود (کالس
پایه) این کار را انجام داد .در داخل کالس Childهم یک سازنده ساده وجود دارد که یک آرگومان رشته ای قبول میکند .وقتی از
وراثت در کالسها استفاده میکنیم ،هم سازنده کالس مشتق و هم سازنده پیشفرض کالس پایه هر دو اجرا میشوند .سازنده
پیشفرض یک سازنده بدون پارامتر است .اگر برای یک کالس سازنده ای تعریف نکنیم کمپایلر به صورت خودکار یک سازنده برای
آن ایجاد میکند .اگر هنگام صدا زدن سازنده کالس مشتق بخواهیم سازنده کالس پایه را صدا بزنیم باید از کلمه کلیدی super
استفاده کنیم .کلمه کلیدی superیک سازنده از کالس پایه را صدا می زند .
در مثال باال به وسیله تأمین مقدار پارامتر messageسازنده کالس مشتق و ارسال آن به داخل پرانتز کلمه کلیدی ،superسازنده
معادل آن در کالس پایه فراخوانی شده و مقدار messageرا به آن ارسال میکند .سازنده کالس Parentهم این مقدار (مقدار
)messageرا در یک عضو داده ای (فیلد) privateقرار میدهد .میتوانید کدهایی را به داخل بدنه سازنده Childاضافه کنید تا
بعد از سازنده Parentاجرا شوند .اگر از کلمه کلیدی superاستفاده نشود به جای کالس پایه سازنده پیشفرض فراخوانی میشود.
اجازه بدهید که اشیایی از کالسهای Parentو Childبسازیم تا نشان دهیم که چگونه کالس Childمتدها و خواص کالس Parent
2 {
3
4 )public static void main(String[] args
5 {
6 ;)"Parent myParent = new Parent("Message from parent.
7 ;)"Child myChild = new Child("Message from child.
8
9 ;)(myParent.ShowMessage
10
11 ;)(myChild.ShowMessage
12
13 ;)"myParent.setMessage("Modified message of the parent.
14 ;)(myParent.ShowMessage
15
16 ;)"myChild.setMessage("Modified message of the child.
17 ;)(myChild.ShowMessage
18
19 //myChild.message; ERROR: can't access private members of base class
20 }
21 }
هر دو شیء را با ستفاده از سازندههای مربوط به خودشان مقدار دهی میکنیم (خطوط .)1-1سپس با استفاده از ارث بری و از
طریق شیء Childبه اعضا و متدهای کالس Parentدسترسی مییابیم .حتی اگر کالس Childاز کالس Parentارث ببرد باز هم
اعضای با سطح دسترسی privateدر کالس Childقابل دسترسی نیستند(خط .)30سطح دسترسی Protectکه در درس آینده
توضیح داده خواهد شد به شما اجازه دسترسی به اعضا و متدهای کالس پایه را میدهد .به نکته دیگر توجه کنید .اگر کالس دیگری
بخواهد از کالس Childارث بری کند ،باز هم تمام متدها و خواص کالس Childکه از کالس Parentبه ارث برده است را به ارث
میبرد.
این کالس هیچ چیزی در داخل بدنه ندارد .وقتی کالس GrandChildرا ایجاد میکنید و یک خاصیت از کالس Parentرا فراخوانی
میکنید با خطا مواجه میشوید .چون هیچ سازنده ای که یک آرگومان رشته ای قبول کند در داخل بدنه GrandChildتعریف نشده
است بنابراین شما میتوانید فقط از سازنده پیشفرض یا بدون پارامتر استفاده کنید.
;)"!myGrandChild.setMessage("Hello my grandchild
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 311
myGrandChild.ShowMessage();
فراخوانی میشود و سپسParent را فراخوانی میکنیم ابتدا سازنده کالسGrandChild وقتی یک کالس ایجاد میکنیم و سازنده
دوباره کالسها. برنامه زیر ترتیب اجرای سازندهها را نشان میدهد. اجرا میشودGrandChild و در نهایت سازندهChild سازنده
1 package myfirstprogram;
2
3 class Parent
4 {
5 public Parent()
6 {
7 System.out.println("Parent constructor was called!");
8 }
9 }
10
11 class Child extends Parent
12 {
13 public Child()
14 {
15 System.out.println("Child constructor was called!");
16 }
17 }
18
19 class GrandChild extends Child
20 {
21 public GrandChild()
22 {
23 System.out.println("GrandChild constructor was called!");
24 }
25 }
26
27 public class MyFirstProgram
28 {
29
30 public static void main(String[] args)
31 {
32 GrandChild myGrandChild = new GrandChild();
33 }
34 }
سطح دسترسی protectاجازه میدهد که اعضای کالس ،فقط در کالسهای مشتق شده از کالس پایه قابل دسترسی باشند .بدیهی
است که خود کالس پایه هم میتواند به این اعضا دسترسی داشته باشد .کالسهایی که از کالس پایه ارث بری نکردهاند نمیتوانند
به اعضای با سطح دسترسی protectیابند .در مورد سطوح دسترسی publicو privateقبال توضیح دادیم .در جدول زیر نحوه
مشاهده میکنید که publicبیشترین سطح دسترسی را داراست .صرف نظر از مکان ،اعضای publicدر هر جا فراخوانی میشوند
و قابل دسترسی هستند .اعضای privateفقط در داخل کالسی که به آن تعلق دارند قابل دسترسی هستند .کد زیر رفتار اعضای
30 }
کدهایی که با خط قرمز نشان داده شدهاند نشان دهنده وجود خطا هستند چون آنها اجازه دسترسی به فیلدهای protectکالس
Parentرا ندارند .همانطور که در خط 31مشاهده میکنید کالس Childسعی میکند که به عضو privateکالس Parent
دسترسی یابد .از آنجاییکه اعضای privateدر خارج از کالس قابل دسترسی نیستند ،حتی کالس مشتق در خط 31نیز ایجاد خطا
میکند .اگر شما به خط 33توجه کنید کالس Childمیتواند به عضو protectکالس Parentدسترسی یابد چون کالس Child
حال به خط 51جاییکه میخواهیم در کالس MyFirstProgramبه فیلد protectکالس Parentدسترسی یابیم نگاهی بیندازید.
میبینید که برنامه پیغام خطا میدهد چون کالس MyFirstProgramاز کالس Parentمشتق نشده است .همچنین کالس
اعضای static
اگر بخواهیم عضو داده ای (فیلد) یا خاصیتی ایجاد کنیم که در همه نمونههای کالس قابل دسترسی باشد از کلمه کلیدی static
استفاده میکنیم .کلمه کلیدی staticبرای اعضای داده ای و خاصیتهایی به کار میرود که میخواهند در همه نمونههای کالس
تقسیم شوند .وقتی که یک متد یا خاصیت به صورت staticتعریف شود ،میتوانید آنها را بدون ساختن نمونه ای از شی،
در مثال باال یک شیء استاتیک به نام ( StaticMessageخط )1تعریف کردهایم .مقدار شیء StaticMessageدر همه نمونههای
کالس SampleClassقابل دسترسی است .برای فراخوانی یک متد ،خاصیت و یا یک متغیر استاتیک ،به سادگی میتوان نام کالس
و بعد از آن عالمت دات ) (.و در آخر نام متد یا خاصیت را نوشت .این موضوع را میتوان در خط ( )35مشاهده کرد .مشاهده
میکنید که الزم نیست هیچ نمونه ای از کالس ایجاد شود .یکی دیگر از کاربردهای این کلمه کلیدی در شمارش اشیاء است .به
Number is : 1
Number is : 2
Number is : 3
همانطور که در خط 1کد باال مشاهده میکنید یک متغیر استاتیک با مقدار اولیه 3ایجاد کردهایم و در داخل سازنده کالس در خط
6ابتدا مقدار آن را چاپ و سپس یک واحد به آن اضافه کردهایم .حال در خطوط 31-36سه شیء از روی کالس SampleClass
ایجاد میکنیم .همانطور که در خروجی مشاهده میکنید با هر بار ایجاد شیء یک بار سازنده کالس فراخوانی و در نتیجه مقدار
متغیر چاپ میشود .یکی از خواص متغیرهای استاتیک این است که مقدار قبلی خود را حفظ میکنند .و از این خاصیت در مثال
Override
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 313
فرض کنید شما متد Aرا در کالس Aدارید و کالس Bاز کالس Aارث بری میکند ،در این صورت متد Aدر کالس Bدر دسترس
خواهد بود .اما متد Aدقیقأ همان متدی است که از کالس Aبه ارث برده شده است .حال اگر بخواهید که این متد رفتار متفاوتی
از خود نشان دهد چکار میکنید؟ برای حل این مشکل باید متد کالس پایه را Overrideکنید .به تکه کد زیر توجه کنید:
همانطور که در کد باال مشاهده میکنید دو کالس یه نام ( Parentخطوط )1-6و ( Childخطوط )33-31تعریف کردهایم .کالس
Childکه از کالس Parentارث میبرد شامل متدی است که متد )( ShowMessageاز کالس پایه را overrideیا به صورت
دیگری پیاده سازی میکند .همانطور که مشاهده میکنید این دو متد دقیقا شبیه به هم هستند و تنها اختالف آنها در پیامی است
که نشان میدهند .برای Overrideکردن یک متد قواعدی وجود دارد که در زیر به آنها اشاره شده است:
نوع مقدار بازگشتی تابع باید همانند یا فرزندی از نوع مقدار بازگشتی تابع overrideشده کالس پدر باشد.
۵1۵ مبانی زبان جاوا
سطح دسترسی تابع نمیتواند محدودتر از سطح دسترسی تابع overrideشده باشد .برای مثال :اگر تابع کالس پدر به
صورت publicتعریف شده باشد ،در این صورت تابع کالس فرزند نمیتواند privateیا protectedباشد.
تنها توابعی از کالس پدر که توسط کالس فرزند ارث بری شدهاند میتوانند overrideشوند.
توابع staticنمیتوانند overrideشوند ،ولی میتوانند دوباره در کالس فرزند تعریف شوند.
اگر تابعی نمیتواند ارث برده شود ،همانطور هم نمیتواند overrideشود.
کالس فرزند موجود در پکیج یکسان با کالس پدر ،میتواند تمامی توابعی از کالس پدر را که به صورت privateیا
کالس فرزند در یک پکیج دیگر از کالس پدر تنها میتواند توابع publicیا protectedکالس پدر را که finalنیستند
را overrideکند.
با استفاده از کلمه کلیدی ( superخط )31میتوانید متد کالس پایه را در داخل متد overrideشده فراخوانی کنید:
م توان یک کالس دیگر که از کالس Childارث بری میکند ایجاد کرده و دوباره متد )( ShowMessageرا overrideکرده و آنرا به
صورت دیگر پیاده سازی کنیم .اگر بخواهید متدی را که ایجاد کردهاید به وسیله سایر کالسها overrideنشود کافیست که از کلمه
حال اگر کالس دیگری از کالس Childارث ببرد نمیتواند متد )( ShowMessageرا overrideکند.
همه کالسهای جاوا به طور مستقیم یا غیر مستقیم از کالس Objectکه در پکیج java.langقرار دارد ،ارث می برند .کالس
نشان داده می شود .برای راحتی در این درس از کلمه آبجکت به جای Object آبجکت در جاوا با کلمه کلیدی
java.lang.Objectاستفاده می کنیم .در زیر لیست برخی از متدهای معمول در کالس آبجکت آمده است:
کاربرد متد
یک شیء از کالس Classرا بر می گرداند که نشان دهنده کالس زمان اجرای شیء است. )(getClass
مشخص می کند که آیا یک شیئ با شیء دیگر برابر است یا نه؟ )(equals
با برنامه های چند نخی به کار می رود و نخ منتظر شیء جاری را فعال می کند. )(notify
با برنامه های چند نخی به کار می رود و تمام نخ های منتظر شیء جاری را فعال می کند. )(notifyAll
باعث می شود نخ شیء منتظر شود تا نخ دیگر notifyیا notifyAllرا فراخوانی کند. )(wait
با ابزار زباله روب ) (Garbage Collectorدر زمان از بین بردن شیئ فراخوانی می شود. )(finalize
۵1۳ مبانی زبان جاوا
همه متدهای این کالس معموال مورد استفاده قرار نمی گیرند .از آنجاییکه همه کالسهای جاوا از این کالس ارث می برند ،آنها نیز
دارای این متدها به جز متدهای Staticمی باشند .وقتی یک کالس ایجاد می کنید ،این کالس به صورت ضمنی از کالس آبجکت
ارث می برد .بنابراین وقتی یک کالس تعریف می کنید کدها در حقیقت به صورت زیر به وسیله کمپایلر خوانده می شوند:
}
اینکه چرا همه کالسها در جاوا از Objectارث بری می کنند به دلیل امکان استفاده از چندریختی است که در درس آینده درباره آن
توضیح می دهیم .به عنوان مثال یکی از سربارگذاری های متد )( System.out.printlnقبول نوع آبجکت به عنوان آرگومان
است .به همین دلیل است که شما می توانید تقریبا هر چیز را به عنوان آرگومان به متد )( System.out.printlnارسال کنید.
نکته ای که باید در اینجا به آن اشاره کنیم این است که انواع داده های اصلی شیء نیستند و از کالس Objectارث بری نمی کنند
و در نتیجه نمی توانند از متدهای این کالس هم استفاده کنند .مثال اجرای کد زیر باعث بروز خطا می شود:
;))(System.out.println(number.toString
اگر بخواهید یک نوع intرا به نوع رشته ای به صورت باال تبدیل کنید و متد )( toStringرا فراخوانی کنید باید از کالس
;))(System.out.println(new Integer(number).toString
;))System.out.println(Integer.toString(number
همانطور که در باال هم اشاره شد یکی از متدهای کالس Objectمتد )( toStringاست .این متد کد هش شده شیء جاری را
;package myfirstprogram
class Person
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 313
{
private String name, family;
System.out.println(person1.toString());
}
}
object.Person@5cd622e5
البته این کد ممکن است در. یک کد هش شده تولید می شودtoString() همانطور که مشاهده می کنید با فراخوانی متد
Override خروجی این متد یک کد هش شده است ولی شاید شما بخواهید این رفتار پیشفرض را تغییر داده و متد را اصطالحا
: فرض کنید در مثال باال شما می خواهید با فراخوانی این متد مقدار فیلدهای این کالس چاپ شوند.کنید
1 package myfirstprogram;
2
3 class Person
4 {
5 private String name, family;
6
7 public Person(String n, String f)
8 {
9 this.name = n;
11 this.family = f;
11 }
12
13 @Override
14 public String toString()
15 {
16 return name + " " + family;
17 }
18 }
19
20 public class MyFirstProgram
۵1۱ مبانی زبان جاوا
21 {
22 )public static void main(String[] args
23 {
24 ;)"Person person1 = new Person("John", "SKith
25
26 ;))(System.out.println(person1.toString
27 }
}
John SKith
همانطور که مشاهده می کنید با Overrideکردن متد )( toStringدر خطوط 31-31و تغییر رفتار پیشفرض آن (خط )31باعث
شدیم که با فراخوانی آن در خط 51خروجی متفاوتی را دریافت کنیم .خط 51را به صورت زیر هم می توان نوشت:
;)System.out.println(person1
این بدان خاطر است که متد )( printlnمتد )( toStringشئ ارسال شده به آن را به طور خودکار فراخوانی می کند.
Boxingو Unboxing
در زبان برنامه نویسی جاوا 0 ،نوع داده اصلی وجود دارد که هر کدام از آنها دارای یک کتابخانه کالس ) (library classاز نوع
مرجع ،مربوط به خود هستند .به عنوان مثال کالس java.lang.Integerکتابخانه مربوط به نوع اصلی intمی باشد .این
نوع کالس ها را wrapper classیا کالس های پوششی می نامند .این نوع کالس ها غیر قابل تغییر بوده ،و وقتی ایجاد می
شوند نمی توان مقدار آنها را عوض کرد .همچنین چون از نوع finalهستند ،در نتیجه نمی توانند دارای زیر کالس هم باشند .در
جدول زیر انواع اصلی و کالس های Wrapperمربوط به آنها آمده است:
Byte byte
Short short
Integer int
Long long
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 311
Float float
Double double
Boolean boolean
Character char
قبل از Java SE 5برای مقدار دهی به یک متغییر از نوع Integerباید حتما یک شئ از کالس Integerایجاد می کردیم و
همچنین برای مقدار دهی به یک متغییر از نوع intبا استفاده از یک شئ Integerباید حتما از متد )( intValueکالس
Integerاستفاده می کردیم ،اما بعد از Java SE 5و با افزوده شدن قابلیت Boxingو Unboxingاین مشکل برطرف و به
Boxingفرایندی است که طی آن یک نوع اصلی مانند intبه یک نوع مرجع مانند Integerتبدیل می شود . Unboxing
برعکس ،عمل تبدیل یک نوع مرجع به یک نوع مقداری می باشد .کد زیر فرایند boxingرا نشان می دهد :
;int i = 100
در پس زمینه ،کمپایلر کد باال را به صورت زیر به نوع مرجع تبدیل می کند :
در فرایند boxingنوع مقداری به سادگی با یک متغیر از نوع مرجع برابر قرار داده می شود .در زیر نحوه تبدیل یک نوع مرجع به
;int i = number
در پس زمینه ،کمپایلر کد باال را به صورت زیر به نوع اصلی تبدیل می کند :
;)(int i = number.intValue
۵11 مبانی زبان جاوا
aggregation
به عنوان مثال کالس. فرایندی است که طی آن یک کالس به عنوان یک عضو به کالس دیگر اضافه می شودaggregation
1 package myfirstprogram;
2
3 class Name
4 {
5 public String FirstName;
6 public String LastName;
7
8 public Name(String f, String l)
9 {
10 this.FirstName = f;
11 this.LastName = l;
12 }
13 }
14
15 class Person
16 {
17 private Name myName;
18
19 public Person(Name name)
02 {
02 myName = new Name(name.FirstName, name.LastName);
22 }
23
24 @Override
25 public String toString()
26 {
27 return myName.FirstName + " " + myName.LastName;
28 }
29 }
30
31 public class MyFirstProgram
32 {
33 public static void main(String[] args)
34 {
35 Person person1 = new Person(new Name("John", "Smith"));
36
37 System.out.println(person1.toString());
38 }
39 }
John Smith
class Name
{
public String FirstName;
public String LastName;
;this.FirstName = f
;this.LastName = l
}
}
یک کالس که قرار است به عنوان یک فیلد در کالس دیگر به کار رود را تعریف می کنیم (خطوط .)1-31این کالس دارای یک سازنده
است که نام ) (fو نام خانوادگی ) (lرا از شخص دریافت می کند .سپس این مقادیر را در خصوصیت های متناظر با آنها قرار
class Person
{
;private Name myName
@Override
)(public String toString
{
;return myName.FirstName + " " + myName.LastName
}
}
این کالس شامل یک فیلد از نوع Nameو خاصیت متناضر با آن است .این خصوصیت مقدار نام هر شی Personرا در خود
نگهداری می کند .به این نکته توجه کنید که سازنده یک شیء Nameرا می پذیرد و سپس با استفاده از این شیء فیلد myName
را مقداردهی می کند .به این فرایند ترکیب ) (aggregationمی گویند .همچنین در کالس Personمتد )( toStringاز
کالس Objectرا بازنویسی ) (overrideمی کنیم به طوری که در هنگام فراخوانی نام کامل شخص را نمایش دهد .
;))(System.out.println(person1.toString
}
}
در باال یک شی Personرا ایجاد و از سازنده ای که یک شی از نوع کالس Nameبه عنوان آرگومان قبول می کند استفاده کرده ایم.
این شی را مستقیما در داخل پرانتز ها تعریف و همچنین مقادیر خصوصیات firstnameو lastnameرا به آن ارسال کرده ایم.
در نهایت ،با استفاده از متد سفارشی )( toStringنتیجه را چاپ می کنیم .به این نکته توجه کنید که کالس ها می توانند شی
۵1۹ مبانی زبان جاوا
هایی از نوع خود کالس داشته باشند .به عنوان نمونه کالس Personمی تواند یک عضو با نوع Personداشته باشد .به کد زیر
class Person
{
;public Person Sibling
;public String Name
}
مشاهده می کنید که چگونه خصوصیتی از نوع Personدر داخل کالس Personتعریف شده است .پس هنگامی که یک شی
Personتعریف می کنید ،شی ایجاد شده یک شی از نوع Personدر داخل خود دارد .
کد باال چگونگی دسترسی و مقدار دهی به عضو (Sibling)Personرا نشان داده است .از آنجایی که خصوصیت Siblingاز
نوع Personاست پس می تواند یک شی Personدر داخل خود داشته باشد .بنابراین می توان هر تعداد siblingکه می
عملگر instanceof
عملگر instanceofدر جاوا به شما اجازه میدهد که تست کنید که آیا یک شیء یک نمونه از یک نوع خاص (کالس ،زیر کالس،
اینترفیس) است یا نه .عملگر instanceofبه دو عملوند نیاز دارد و یک مقدار بولی را برمی گرداند .به عنوان مثال ،فرض کنید یک
6 }
7
8 public class MyFirstProgram
9 {
10 )public static void main(String[] args
11 {
12 ;)(Animal myAnimal = new Animal
13
14 )if (myAnimal instanceof Animal
15 {
16 ;)"!System.out.println("myAnimal is an Animal
17 }
18 }
19 }
myAnimal is an Animal
رفتار عملگر instanceofرا در این مثال مشاهده کردید .همانطور که میبینید از آن به عنوان شرط در عبارت ifاستفاده شده
است .کاربرد آن در مثال باال این است که چک میکند که آیا شیء myAnimalیک نمونه از Animalاست و چون نتیجه درست
است کدهای داخل دستور ifاجرا میشود .این عملگر همچنین میتواند چک کند که آیا یک شیء خاص در سلسله مراتب وراثت
!myDog is an Animal
همانطور که در مثال باال میبینید ما یک کالس به نام Dogایجاد کردهایم که از کالس Animalارث میبرد .سپس یک نمونه از این
کالس ) (Dogایجاد میکنیم و سپس با استفاده از عملگر instanceofتست میکنیم که آیا نمونه ایجاد شده جز کالس Animal
۵1۵ مبانی زبان جاوا
است یا یک کالس مشتق شده از کالس Animalمیباشد .از آنجاییکه کالس Dogاز کالس Animalارث میبرد (سگ من یک
حیوان است ،).نتیجه عبارت درست ) (trueاست .حال جمله باال را تغییر دهیم ” :حیوان من یک سگ است” .وقتی جمله
این باعث خطا نمیشود و عبارت فقط نتیجه falseرا بر میگرداند .میتوان از کد باال این را درک کرد که همه حیوانات سگ نیستند
رابط)(Interface
اینترفیس ها شبیه به کالسها هستند اما فقط شامل تعاریفی برای متدها و خواص ) (Propertyمیباشند .اینترفیس ها را
میتوان به عنوان پالگین های کالسها در نظر گرفت .کالسی که یک اینترفیس خاص را پیاده سازی میکند الزم است که کدهایی
برای اجرا توسط اعضا و متدهای آن فراهم کند چون اعضا و متدهای اینترفیس هیچ کد اجرایی در بدنه خود ندارند .اجازه دهید
21
22 ;)"!sample.ShowMessage("Implemented the ISample Interface
23 }
24 }
در خطوط 1-1یک اینترفیس به نام Isampleتعریف کردهایم .بر طبق قراردادهای نامگذاری ،اینترفیس ها به شیوه پاسکال
نامگذاری میشوند و همه آنها باید با حرف Iشروع شوند .همچنین در تعریف آنها باید از کلمه کلیدی interfaceاستفاده
شود .یک متد در داخل بدنه اینترفیس تعریف میکنیم (خط .)1به این نکته توجه کنید که متد تعریف شده فاقد بدنه است و در
آخران باید از سیمیکولن استفاده شود .وقتی که متد را در داخل اینترفیس تعریف میکنید فقط الزم است که عنوان متد (نوع ،نام
و پارامترهای آن) را بنویسید .به این نکته نیز توجه کنید که متدها و خواص تعریف شده در داخل اینترفیس سطح دسترسی ندارند
چون باید همیشه هنگام اجرای کالسها در دسترس باشند .برای پیاده سازی یک interfaceتوسط یک کالس از کلمه کلیدی
implementsاستفاده میشود .کالسی که اینترفیس را اجرا میکند کدهای واقعی را برای اعضای آن فراهم میکند .همانطور که در
مثال باال میبینید کالس ،Sampleمتد )( ShowMessageاینترفیس Isampleرا اجرا و تغذیه میکند .میتوان چند اینترفیس را
20 }
21
22 @Override
23 )public void SecondMessage(String message
24 {
25 ;)System.out.println(message
26 }
27 }
28
29 public class MyFirstProgram
30 {
31 )public static void main(String[] args
32 {
33 ;)(Sample sample = new Sample
34
35 ;)"!sample.FirstMessage("Implemented the IFirstinterface Interface
36 ;)"!sample.SecondMessage("Implemented the ISecondinterface Interface
37 }
38 }
درست است که میتوان از چند اینترفیس در کالس استفاده کرد ولی باید مطمئن شد که کالس میتواند همه اعضای اینترفیسها را
تغذیه کند .همانطور که در کد باال مشاهده میکنید دو اینترفیس به نامهای IFirstinterfaceو ISecondinterfaceدر
خطوط 1-33تعریف شدهاند که به ترتیب دارای دو متد به نامهای )( FirstMessageو )( SecondMessageمیباشند .در خط
33کالس Sampleاین دو اینترفیس را پیاده سازی کرده است و در نتیجه همانطور که اشاره شد الزم است که کدهای بدنه دو متد
موجود در این دو رابط را تغذیه کند .که این کار در خطوط 31-51انجام شده است .عبارت @Overrideموجود در خطوط 31و 55
به این دلیل قرار داده شده است که به کمپایلر اعالم کند که این دو متد Overrideشدهاند و به نوعی یک اخطار به کمپایلر هست
که میگوید این تایع مربوط به کالس یا اینترفیسی است که کالس جاری از آن مشتق شده و یا پیاده سازی کرده است .وجود @
هم به خاطر قرار داد خود زبان میباشد .اگر یک کالس از کالس پایه ارث ببرد و در عین حال از اینترفیس ها هم استفاده کند ،در
این صورت باید نام کالس پایه قبل از نام اینترفیس ها ذکر شود .به شکل زیر:
نکته دیگر اینکه نمیتوان از یک اینترفیس نمونه ای ایجاد کرد چون اینترفیس ها دارای سازنده نیستند ،مثال کد زیر اشتباه است
:
: به مثال زیر توجه کنید. ارث بری کنندextends اینترفیسها حتی میتوانند از اینترفیسهای دیگر با استفاده از کلمه کلیدی
1 package myfirstprogram;
2
3 interface IBase
4 {
5 void BaseMethod();
6 }
7
8 interface ISample extends IBase
9 {
10 void ShowMessage(String message);
11 }
12
13 class Sample implements ISample
14 {
15 @Override
16 public void ShowMessage(String message)
17 {
18 System.out.println(message);
19 }
20
21 @Override
22 public void BaseMethod()
23 {
24 System.out.println("Method from base interface!");
25 }
26 }
27
28 public class MyFirstProgram
29 {
30 public static void main(String[] args)
31 {
32 Sample sample = new Sample();
33
34 sample.ShowMessage("Implemented the ISample Interface!");
35 sample.BaseMethod();
36 }
37 }
Sample ارث بری کرده است پس حتی اگر کالسIBase از رابطISample کد باال مشاهده میکنید رابط0 همانطور که در خط
از آن ارثISample را هم پیاده سازی کند چونIbase الزم است که همه اعضای، را پیاده سازی کندISample فقط اینترفیس
.بری میکند
کالسهای مجرد ) (abstractکالسهایی هستند که کالس پایه سایر کالسها هستند.این نوع کالسها میتوانند مانند کالسهای
عادی دارای سازنده باشند .شما نمیتوانید از کالسهای انتزاعی نمونه ایجاد کنید چون که هدف اصلی از به کار بردن کالسهای انتزاعی
استفاده از آنها به عنوان کالس پایه برای کالسهای مشتق است .برای تعریف یک کالس انتزاعی از کلمه کلیدی abstractاستفاده
میشود .به مثال زیر در مورد استفاده از کالسهای انتزاعی توجه کنید:
در داخل کالس انتزاعی دو فیلد محافظت شده ) (protectedتعریف کردهایم (خطوط )1-3که میخواهیم آنها را توسط سازنده
کالس مقدار دهی کنیم (خطوط .)0-35یک متد هم را به صورت انتزاعی ) (abstractتعریف کردهایم (خط .)1به این نکته توجه
کنید که برای تعریف این متد کلمه کلیدی abstractرا به کار بردهایم.
این متد باید به وسیله کالسهایی که از این کالس ارث میبرند overrideیا به صورت دیگر پیاده سازی شود ،ولی از آن جاییکه
به صورت abstractتعریف شده است فاقد بدنه میباشد .میبینید که کالسهای abstractمیتوانند شامل propertyهای
معمولی مانند Name ،propertyمثال باال باشند .کالسهای abstractحداقل باید یک عضو abstractداشته باشند.
یک کالس دیگر تعریف میکنید که از کالس Baseارث بری کند .سپس در خطوط 31-53متد abstractرا به صورت دیگر پیاده
سازی میکنیم ( overrideکنیم) .همچنین یک سازنده تعریف میکنیم (خطوط )51-51و با استفاده از کلمه کلیدی superمقادیر
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 301
پارامترها را به سازنده پایه ارسال میکنیم .نمیتوان از یک کالس abstractنمونه ایجاد کرد ولی از کالسهایی که از این نوع
کالس ( finalکالس نهایی) ،کالسی است که دیگر کالسها نمیتوانند از آن ارث بری کنند و چون قابلیت ارث بری ندارد نمیتواند
//Constructor
)(public Base
{
//Do something here
}
}
برای تعریف این کالسها از کلمه کلیدی finalاستفاده میشود .مشاهده میکنید که کالس نهایی مانند کالسهای عادی ،دارای
فیلد ،خواص ،و متد میباشند .کالس مشتق ) (Derivedدر مثال باال با خط قرمز نشان داده شده است چون نمیتواند از کالس
نهایی ) (Baseارث بری کند .وقتی یک کالس را نهایی میکنیم ،تمام متدهای آن نیز نهایی میشوند .استفاده از این کالسها
همانطور که ذکر شد زمانی مفید است که بخواهید کالسی ایجاد کنید که دیگر کالسها نتوانند از آن ارث بری کنند.
متد Final
متد finalبه متدی گفته میشود که هیچ زیر کالسی نتواند آن را بازنویسی یا Overrideکند .به مثال زیر توجه کنید:
;package myfirstprogram
class Parent
۵11 مبانی زبان جاوا
{
)(final void ShowMessage
{
;)"!System.out.println("This is a final method
}
}
}
}
اگر به کدهای باال توجه کنید و آن را در محیط NetBeansبنویسید مشاهده میکنید که در خط 33کد باال خطا به وجود میآید.
چون کالس Childاز کالس Parentارث بری کرده است و زیر کالس محسوب میشود و طبق تعریف هیچ زیر کالسی نمیتواند
چند ریختی)(Polymorphism
چند ریختی به کالسهایی که در یک سلسله مراتب وراثتی مشابه هستند اجازه تغییر شکل و سازگاری مناسب میدهد و همچنین
به برنامه نویس این امکان را میدهد که به جای ایجاد برنامههای خاص ،برنامههای کلی و عمومی تری ایجاد کند .به عنوان مثال
در دنیای واقعی همه حیوانات غذا میخورند ،اما روشهای غذا خوردن آنها متفاوت است .در یک برنامه برای مثال ،یک کالس به
نام Animalایجاد میکنید .بعد از ایجاد این کالس میتوانید آن را چند ریخت (تبدیل) به کالس Birdکنید و متد )( Flyرا
9 }
10
11 class Dog extends Animal
12 {
13 @Override
14 public void Eat()
15 {
16 System.out.println("The dog ate!");
17 }
18 }
19
20 class Bird extends Animal
21 {
22 @Override
23 public void Eat()
24 {
25 System.out.println("The bird ate!");
26 }
27 }
28
29 class Fish extends Animal
30 {
31 @Override
32 public void Eat()
33 {
34 System.out.println("The fish ate!");
35 }
36 }
37
38 public class MyFirstProgram
39 {
40 public static void main(String[] args)
41 {
42 Dog myDog = new Dog();
43 Bird myBird = new Bird();
44 Fish myFish = new Fish();
45 Animal myAnimal = new Animal();
46
47 myAnimal.Eat();
48
49 myAnimal = myDog;
50 myAnimal.Eat();
51 myAnimal = myBird;
52 myAnimal.Eat();
53 myAnimal = myFish;
54 myAnimal.Eat();
55 }
56 }
. کالس پایه است و سه کالس دیگر از آن مشتق میشوندAnimal . کالس مختلف تعریف کردهایم3 همانطور که مشاهده میکنید
را به وسیله نمونهEat() حال متد.)35-31( نمونه ای از هر کالس ایجاد کردهایم. مربوط به خود را داردEat() هر کالس متد
;)(myAnimal.Eat
در مرحله بعد چندریختی روی میدهد .همانطور که در مثال باال مشاهده میکنید شیء Dogرا برابر نمونه ایجاد شده از کالس
Animalقرار میدهیم (خط )36و متد )( Eatرا بار دیگر فراخوانی میکنیم (خط .)13حال با وجود اینکه ما از نمونه کالس Animal
استفاده کردهایم ولی متد )( Eatکالس Dogفراخوانی میشود .این به دلیل تأثیر چند ریختی است.
سپس دو شیء دیگر ( Birdو )Fishرا برابر نمونه ایجاد شده از کالس Animalقرار میدهیم و متد )( Eatمربوط به هر یک را
فراخوانی میکنیم (خطوط .)13-13به این نکته توجه کنید که وقتی در مثال باال اشیاء را برابر نمونه کالس Animalقرار میدهیم از
عمل Castاستفاده نکردهایم چون این کار ) (castوقتی که بخواهیم یک شیء از کالس مشتق (مثال )Dogرا در شیی از کالس
پایه ) (Animalذخیره کنیم الزم نیست .همچنین میتوان کالس Animalرا با سازنده هر کالس مشتق دیگر مقدار دهی اولیه
کرد:
;)(myDog.Eat
;)(myBird.Eat
;)(myFish.Eat
اجازه دهید که برنامه باال را اصالح کنیم تا مفهوم چند ریختی را بهتر متوجه شوید:
23 }
24
25 class Bird extends Animal
26 {
27 @Override
28 public void Eat()
29 {
30 System.out.println("The bird ate!");
31 }
32
33 public void Fly()
34 {
35 System.out.println("The bird flew!");
36 }
37 }
38
39 class Fish extends Animal
40 {
41 @Override
42 public void Eat()
43 {
44 System.out.println("The fish ate!");
45 }
46
47 public void Swim()
48 {
49 System.out.println("The fish swam!");
50 }
51 }
52
53 public class MyFirstProgram
54 {
55 public static void main(String[] args)
56 {
57 Animal animal1 = new Dog();
58 Animal animal2 = new Bird();
59 Animal animal3 = new Fish();
60
61 Dog myDog = (Dog)animal1;
62 Bird myBird = (Bird)animal2;
63 Fish myFish = (Fish)animal3;
64
65 myDog.Run();
66 myBird.Fly();
67 myFish.Swim();
68 }
69 }
.)11-16 ایجادو آنها را بوسیله سه سازنده از کالسهای مشتق مقدار دهی اولیه کردهایم (خطوطAnimal در باال سه شیء از کالس
را در نمونههایی از کالسهای مشتق ذخیره میکنیم (خطوطAnimal اشیا ایجاد شده از کالسcast سپس با استفاده از عمل
.)11-11 وقتی این کار را انجام دادیم میتوانیم متدهای مخصوص به هر یک از کالسهای مشتق را فراخوانی کنیم (خطوط.)13-11
۵۹۵ مبانی زبان جاوا
را درAnimal یک را میانبر دیگر به وسیله کد زیر مشخص شده است ولی در این روش شما نمیتوانید اشیا ایجاد شده از کالس
((Dog)animal1).Run();
((Bird)animal2).Fly();
((Fish)animal3).Swim();
1 package myfirstprogram;
2
3 interface IAnimal
4 {
5 public void Eat();
6 }
7
8 class Dog implements IAnimal
9 {
10 @Override
11 public void Eat()
12 {
13 System.out.println("The dog ate!");
14 }
15
16 }
17
18 class Bird implements IAnimal
19 {
20 @Override
21 public void Eat()
22 {
23 System.out.println("The bird ate!");
24 }
25 }
26
27 class Fish implements IAnimal
28 {
29 @Override
30 public void Eat()
31 {
32 System.out.println("The fish ate!");
33 }
34 }
35
36 public class MyFirstProgram
37 {
38 public static void main(String[] args)
39 {
40 IAnimal myDog = new Dog();
41 IAnimal myBird = new Bird();
42 IAnimal myFish = new Fish();
43
44 myDog.Eat();
45 myBird.Eat();
46 myFish.Eat();
47 }
48 }
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 365
تسلط کامل بر چند ریختی و وراثت برای درک بهتر شیء گرایی ضروری است.
در یک مکان استفاده میشود ،با این کار خوانایی کدها بیشتر و دستکاری آنها راحت تر میشود .کالس تو در تو عضوی از کالسی
است که در داخل آن قرار دارد ،بنابراین میتواند به صورت protect ،publicو privateتعریف شود .این کالسها میتوانند
توسط زیر کالس ) (subclassهم به ارث برده شوند .نحوه ایجاد یک کالس تو در تو به صورت زیر میباشد.
class OuterClass
{
class InnerClass
{
}
}
در جاوا چند نوع کالس تو در تو وجود دارد که در زیر به آنها اشاره شده است:
همانطور که در درس قبل اشاره شده در جاوا 3نو ع کالس تو در تو وجود دارد که در این درس به دو نوع از آنها میپردازیم.
}
}
برای ایجاد شیء از این نوع کالسها ابتدا باید نام کالس بیرونی و سپس عالمت نقطه و بعد نام کالس داخلی استاتیک را بنویسید.
یک کالس داخلی استاتیک یک کالس عادی است که در داخل یک کالس دیگر قرار دارد .کالسهای استاتیک داخلی فقط به اعضای
استاتیک کالسی که در آن قرار دارند ،دسترسی دارند .به مثال زیر توجه کنید:
;package myfirstprogram
class Outer
{
static String ;"!message = "Hello World
;)(instance.ShowMessage
}
}
!Hello World
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 363
همانطور ک در مثال باال متغیر messageیک عضو استاتیک از کالس Outerاست و برای دسترسی به آن باید به صورتی که در
کالسهای داخلی غیر استاتیک در جاوا به نام inner classesمعروفاند .برای ایجاد یک نمونه از این کالسها ابتدا باید یک
نمونه از کالس خارجی ایجاد کنید .نحوه تعریف این نوع کالسها به صورت زیر است:
}
}
به نحوه قرار داده کلمه newبعد از شیء ایجاد شده از کالس خارجی در کد باال توجه کنید .کالس داخلی غیر استاتیک به فیلدهای
کالس خارجی دسترسی دارد ،حتی اگر این فیلدها به صورت privateتعریف شده باشند .به کد زیر توجه کنید:
;package myfirstprogram
class Outer
{
;"!private String text = "I am private
;)(innerClass.ShowMessage
۵۹۱ مبانی زبان جاوا
}
}
!I am private
کالسهای محلی در جاوا شبیه به کالسهای داخلی غیر استاتیک ) (inner classهستند .این نوع کالسها در داخل یک متد
یا محدوده ({…}) در داخل متد تعریف میشوند .به مثال زیر توجه کنید:
class Outer
{
)(public void printText
{
class Local
{
}
کالسهای محلی تنها در داخل متد و یا بلوکی که در آن تعریف شدهاند قابل دسترسی هستند .این کالسها همانند کالسهای غیر
استاتیک میتوانند به فیلدها و متدهای کالسی که در داخل آن قرار دارند دسترسی داشته باشند .از نسخه 0جاوا این کالسها
میتوانند به متغیرهای محلی و پارامترهای متدی که در آن تعریف شدهاند دسترسی داشته باشند .پارامترها باید به صورت final
تعریف شده باشند .کالسهای محلی میتوانند در داخل متدهای استاتیک تعریف شوند که در این صورت فقط به قسمتهای
استاتیک کالسی که در آن تعریف شدهاند دسترسی خواهند داشت .این کالسها نمیتوانند دارای انواع استاتیک باشند (میتوانند
شامل ثابتها باشند و متغیرهای آنها به صورت static finalتعریف میشوند) ،چون کالسهای محلی در حالت عادی غیر
به کالس داخلی که نام نداشته باشد ،کالس داخلی بی نام یا Anonymous Inner Classگفته می شود .از این کالس ها برای
Overrideکردن متد یک کالس یا یک رابط ) (interfaceاستفاده می شود .نحوه تعریف کالس های داخلی بی نام به صورت
زیر است:
همانطور که احتتماال از کد باال متوجه شده اید ،تعریف و ایجاد شیء از این نوع کالس ها به صورت همزمان می باشد .به این نکته
هم توجه کنید که بعد از عالمت آکوالد بسته از عالمت سمیکالن (;) استفاده می شود .همانطور که در درس زیر ذکر شد ،برای پیاده
سازی یا Overrideیک متد از کالس پایه توسط کالس فرزند باید دو کالس ایجاد شود که یکی از دیگری ارث بری کند:
http://www.w3-farsi.com/?p=7974
حال همین مثال اول لینک باال را با استفاده از کالس های بی نام پیاده سازی می کنیم :
در کد باال ،یک کالس تعریف شده است(خطوط )3-1که دارای یک متد می باشد( .)1-1این متد را به وسیله کالس بی نام() 33-53
Overrideکرده ایم( .)31-36خطوط 3-1کد باال می تواند یک کالس انتزاعی ) (abstract classباشد :
و یا یک رابط(interface) :
interface IBase
{
;)(void ShowMessage
}
می توان کالس بی نام را به عنوان آرگومان به یک متد هم ارسال کرد :
در خط 1-1کد باال یک رابط که دارای یک متد است را نوشته ایم .در خطوط 0-33هم کالسی داریم که دارای یک متد می باشد که
یک آرگومان از نوع رابط MyInterfaceدریافت می کند .برای پیاده سازی یا Overrideمتد مربوط به راط همانطور که مشاهده
می کنید در خط 55متد )( ShowMessageمربوط به کالس MyClassرا فراخوانی کرده و یک کالس بی نام به آن ارسال می کنیم.
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 360
سپس در داخل همین کالس بی نام متد )( Messageمربوط به رابط را Overrideمی کنیم .ارسال کالس بی نام به عنوان
در این درس به شما نشان می دهیم که چگونه می توان آرایه ای از کالس ها ایجاد کرد .ساخت آرایه ای از کالس ها تقریبا شبیه
به ایجاد آرایه ای از انواع داده ای مانند intاست .به عنوان مثال می توان آرایه ای از کالس Personایجاد کرد :
ابتدا یک کالس که دارای یک فیلد است تعریف می کنیم .سپس یک آرایه از کالس ایجاد شده را تعریف و سپس عناصر آن را مانند
باال مقدار دهی می کنیم .سپس مقدار فیلد هر یک از نمونه ها را با استفاده از یک حلقه foreachنمایش می دهیم .می توان
از تکنیک های دیگر که قبال در مورد ایجاد آرایه آموختید هم استفاده کنید .مثال خطوط 31-53کد باال را می توان به صورت زیر هم
نوشت :
۵۹۹ مبانی زبان جاوا
در اینجا ،تعداد عناصر آرایه 1 ،peopleمی باشد و کمپایلر هم با شمارش تعداد نمونه ها آن را تشخیص می دهد .از این تکنیک
برای ساخت آرایه های چند بعدی و دندانه دار هم می توان استفاده کرد.
عبارات المبدا
عبارت المبدا ) (Lambda expressionsدر اصل یک متد بی نا م است .این متد ناشناس به تنهایی قابل اجرا نیست و برای
پیادهسازی متدی که در یک رابط تابعی یا functional interfaceتعریف شده به کار میرود .رابط تابعی ،اینترفیسی است که
فقط و فقط یک متد در آن تعریف شده است .فرض کنید یک رابط تابعی به صورت زیر داریم :
interface MyMessage
{
;)void ShowMessage(String message
}
یک راه برای Overrideکردن متد این رابط استفاده از کالس های داخلی بی نام به صورت زیر می باشد :
;package myfirstprogram
;)"!m.ShowMessage("Hello World
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 533
}
}
!Hello World
ولی یک راه ساده تر هم وجود دارد و آن استفاده از عبارات المبدا است .در کد زیر متد )( ShowMessageبا استفاده از عبارات
;package myfirstprogram
;)"!m.ShowMessage("Hello World
}
}
Hello World
در عبارت المبدا ابتدا پارامترها را بدون ذکر نوعشان می نویسیم و بعد از عملگر > -استفاده می کنیم .سپس دستوراتی را که قرار
است اجرا شوند را می نویسیم .نوع پارامترها به صورت خودکار به وسیله کمپایلر تشخیص داده می شود .البته امضاء عبارات المبدا
باید شبیه به امضاء متد باشد .عبارات المبدا دارای اشکال زیادی هستند .به عنوان مثال در مثال باال از یک عبارت المبدایی استفاده
کرده ایم که دارای یک دستور ساده اجرایی است .اگر متد شما برای عبارت المبدا هیچ پارامتری نداشته باشد ،همه کاری که الزم
است نجام دهید این است که هیچ پارامتری در داخل عبارت المبدا قرار ندهید :
;package myfirstprogram
m.ShowMessage();
}
}
Hello World!
. به این نکته توجه کنید که شما می توانید نوع پارامترهای عبارت المبدا را نشان دهید
package myfirstprogram;
m.ShowMessage("Hello World!");
}
}
Hello World!
به عبارت المبدایی که دارای.اگر عبارات المبدای شما دارای چندین دستور اجرایی باشند می توانید آنها را داخل آکوالد قرار دهید
package myfirstprogram;
m.ShowMessage("Hello World!");
}
}
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 535
!Hello World
Some more message
در زیر مثالی از یک عبارت المبدا که دارای مقدار برگشتی است نشان داده شده است :
به این نکته توجه کنید که هنگام استفاده از دستور returnباید همیشه از دستورات المبدایی استفاده کنید که دارای آکوالد می
باشند .اگر یک عبارت المبدا فقط دارای یک دستور returnساده باشد می توانید به سادگی آن را به expression lambda
تبدیل کنید.
به این نکته توجه کنید که استفاده از پرانتز در کد باال برای فه م بهتر آن است .اگر یک عبارت المبدا دارای یک پارامتر ساده و یک
دستور returnاست ،می توانید برای سادگی بیشتر پرانتزها را حذف نمایید :
عبارت المبدای باال دارای دو پارامتر است و حاصل جمع آنها را بر می گرداند.
می توان عبارات المبدا را به عنوان آرگومان به دیگر متد ها ارسال کرد .به مثال زیر توجه کنید :
ابتدا در خطوط 1-33یک رابط ایجاد می کنیم که دارای متدی است که دو آرگومان از نوع اعداد صحیح را قبول کرده و یک مقدار
صحیح را بر می گرداند .سپس از این رابط به عنوان یکی از پارامترهای متد )( GetResultاستفاده می کنیم(خطوط )35-31دو
پارامتر دیگر ،دو عدد هستند که همانطور که خواهیم دید در عملیاتهای مختلف نقش دارند .از آنجاییکه اولین پارامتر یک رابط
است ،آرگومانی که به آن ارسال می شود باید پیاده سازی متد آن باشد .با استفاده از عبارت المبدا می توان کدهای خواناتری نوشت
و همچنین کدنویسی را کاهش داد .در خطوط 50-13متد )( GetResultرا فراخوانی می کنیم .توجه کنید که متد در هر فراخوانی
تست برنامه با خطا مواجه میشوند .بهتر است برای از بین بردن یا به حداقل رساندن این خطاها ،به کاربر در مورد دالیل به وجود
آمدن آنها اخطار داده شود .خوشبختانه جاوا برای این مشکل راه حلی ارائه داده است .جاوا دارای مجموعه بزرگی از کالسهایی
است که برای برطرف کردن خطاهای خاص از آنها استفاده میکند .استثناءها در جاوا راهی برای نشان دادن دلیل وقوع خطا در
جاوا دارای مجموعه بزرگی از کالسهای استثناء است که شما میتوانید با استفاده از آنها خطاهایی که در موقعیتهای مختلف روی
میدهند را برطرف کنید .حتی میتوانید یک کالس استثناء شخصی ایجاد کنید .استثناءها توسط برنامه به وجود میآیند و شما
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 533
الزم است که آنها را اداره کنید .به عنوان مثال در دنیای کامپیوتر یک عدد صحیح هرگز نمیتواند بر صفر تقسیم شود .اگر بخواهید
این کار را انجام دهید (یک عدد صحیح را بر صفر تقسیم کنید) ،با خطا مواجه میشوید .اگر یک برنامه در جاوا با چنین خطایی
مواجه شود پیغام خطای ” “java.lang.ArithmeticException: / by zeroنشان داده میشود که بدین معنا است که عدد
باگ ) (Bugصطالحا خطا یا کدی است که رفتارهای ناخواسته ای در برنامه ایجاد میکند .خطایابی فرایند برطرف کردن باگها
است ،بدین معنی که خطاها را از برنامه پاک کنیم Netbeans .دارای ابزارهایی برای خطایابی هستند ،که خطاها را یافته و به شما
اجازه میدهند آنها را برطرف کنید .در درسهای آینده خواهید آموخت که چگونه از این ابزارهای کارآمد جهت برطرف کردن
باگها استفاده کنید .قبل از اینکه برنامه را به پایان برسانید الزم است که برنامهتان را اشکال زدایی کنید.
استثناءهای اداره نشده ،استثناءهایی هستند که به درستی توسط برنامه اداره نشدهاند و باعث میشوند که برنامه به پایان برسد.
در اینجا میخواهیم به شما نشان دهیم که وقتی یک برنامه در زمان اجرا با یک استثناء مواجه میشود و آن را اداره نمیکند چه
اتفاقی میافتد .در آینده خواهید دید که یک استثناء چگونه به صورت بالقوه باعث نابودی جریان و اجرای برنامه شما میشود .به
همانطور که در مثال باال مشاهده میکنید تقسیم یک عدد صحیح بر صفر غیر مجاز است و باعث ایجاد خطای
java.lang.ArithmeticException: / by zeroمیشود .برنامه را با زدن دکمه F6اجرا میکنیم .برنامه با موفقیت اجرا
همانطور که مشاهده میکنید با اجرای برنامه اطالعاتی در باره خروجیها و یا خطاهای آن در پنجره Outputنمایش داده میشود
:
پنجره Outputپنجره ای مفید است که در مورد استثناء اطالعاتی در اختیار شما میگذارد و معموال محل دقیق خطا را به شما
میتوان خطاها را با استفاده از دستور try…catchاداره کرد .بدین صورت که کدی را که احتمال میدهید ایجاد خطا کند در داخل
بلوک tryقرار میدهید .بلوک catchهم شامل کدهایی است که وقتی اجرا میشوند که برنامه با خطا مواجه شود .تعریف سادهی
این دو بلوک به این صورت است که بلوک tryسعی میکند که دستورات را اجرا کند و اگر در بین دستورات خطایی وجود داشته
باشد برنامه دستورات مربوط به بخش catchرا انجام میدهد .برنامه زیر نحوه استفاده از دستور try…catchرا نمایش میدهد
:
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 531
1 package myfirstprogram;
2
3 public class MyFirstProgram
4 {
5 public static void main(String[] args)
6 {
7 int result;
8 int x = 5;
9 int y = 0;
10
11 try
12 {
13 result = x / y; //ERROR
14 }
15 catch(ArithmeticException e)
16 {
17 System.out.println("An attempt to divide by 0 was detected.");
18 }
19 }
20 }
/ by نتیجه محاسبه به وجود آمدن خطای. است تقسیم کردهایم3 که مقدار آنy است بر1 را کهx مقدار،try در داخل بلوک
. اجرا میشوندcatch از آنجاییکه در برنامه باال خطایی به وجود آمده است کدهای داخل بلوک. ( عدد تقسیم بر صفر) استzero
:بنابراین
try
{
result = x / y; //Error: Jump to catch block
System.out.println("This line will not be executed.");
}
catch(ArithmeticException e)
{
System.out.println("An attempt to divide by 0 was detected.");
}
که کالسcatch همانطور که در مثال باال مشاهده میکنید از یک نوع استثناء مخصوص به یک خطا در داخل بلوک
همچنین میتوانید مقدار استثنا را در داخل یک متغیر قرار داده و سپس آن را. است استفاده کردهایمArithmeticException
:نمایش دهید
try
{
result = x / y; //ERROR
}
catch(ArithmeticException error)
{
System.out.println(error.getMessage());
}
1۱1 مبانی زبان جاوا
/ by zero
متغیر دارای اطالعات مفیدی در مورد استثناء به وجود آمده است .برای نمایش اطالعاتی در مورد استثناء هم از متد )(getMessage
استفاده میکنیم .همه کالسهای استثناء توضیحاتی در مورد خطاها میدهند .در درسهای آینده در مورد خصوصیات استثناءها
بیشتر توضیح میدهیم .اگر فکر میکنید که در بلوک tryممکن است با چندین خطا مواجه شوید میتوانید از چندین بلوک catch
استفاده نمایید ولی به یاد داشته باشید که برای هر کدام از آن خطاها از کالس استثناء مربوط به هر یک استفاده کنید:
;int result
;int x = 5
;int y
try
{
;)(y = input.nextInt
result = x / y; //ERROR
}
)catch(ArithmeticException error
{
;))(System.out.println(error.getMessage
}
)catch(InputMismatchException error
{
;))(System.out.println(error.getMessage
}
از انجاییکه مقدار yبه وسیله ورودی که از کاربر گرفته میشود ،تعیین میشود ،مقدار آن باید با توجه به مثال باال غیر صفر باشد
(عدد تقسیم بر صفر تعریف نشده است) .اما یک مشکل وجود دارد.چون ممکن است که کاربر یک مقدار غیر عددی وارد کند (مثال
یک حرف) که در این صورت برنامه نمیتواند حرف را به عدد تبدیل کند و خطای نوع ) (InputMismatchExceptionاتفاق
میافتد .وقتی استثناء اتفاق افتاد بلوک catchمربوط به این خطا اجرا میشود و محاسبه خارج قسمت تقسیم xبر yنادیده گرفته
حال فرض کنید شما میخواهید تمام خطاهای احتمالی که ممکن است در داخل بلوک tryاتفاق می افتند را فهمیده و اداره کنید
این کار چگونه امکانپذیر است؟ به راحتی و با استفاده از کالس عمومی Exceptionمیتوانید این کار را انجام داد .هر کالس
استثناء در جاوا از این کالس ارث بری میکند بنابراین شما میتوانید هر نوع استثناءیی را در شیئی از کالس Exceptionذخیره
نمایید.
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 530
try
{
//Put your codes to test here
}
)catch (Exception error
{
;)System.out.println(error.Message
}
با استفاده از این روش دیگر الزم نیست نگران اتفاق خطاهای احتمالی باشید چون بلوک catchبرای هر گونه خطایی که در داخل
بلوک tryتشخیص داده شود پیغام مناسبی نشان میدهد .به این نکته توجه کنید که اگر بخواهید از کالس پایه Exception
همراه با سایر کالسهای استثناء دیگر که از آن مشتق میشوند در برنامه استفاده کنید باید کالس پایه Exceptionدر آخرین بلوک
catchقرار گیرد.
try
{
//Put your codes to test here
}
)catch (ArithmeticException e
{
;)"System.out.println("Division by zero is not allowed.
}
)catch (InputMismatchException e
{
;)"System.out.println("Error on converting the data to proper type.
}
)catch (Exception e
{
;)"System.out.println("An error occured.
}
اگر کالس پایه Exceptionرا در اولین بلوک catchقرار دهیم و خطایی در برنامه رخ دهد چون تمام کالسهای استثناء از این
کالس مشتق میشوند در نتیجه اولین بلوک catchاجرا شده و سایر بلوکها حتی با وجود اینکه خطای مورد نظر به آنها مربوط
بلوک finally
گاهی اوقات میخواهید برخی کدها همیشه اجرا شوند خواه استثنا رخ دهد ،خواه رخ ندهد ،در این صورت از بلوک finally
استفاده میشود .قبال یاد گرفتیم که اگر در بلوک tryیک استثناء رخ دهد همه کدهای موجود در این بلوک نادیده گرفته شده و
برنامه به قسمت catchمیرود .کدهای نادیده گرفته شده ممکن است در برنامه نقش حیاتی داشته باشند.
1۱۹ مبانی زبان جاوا
هدف بلوک finallyهم حفظ نقش این کدها به صورت غیر مستقیم است .کدهایی را که فکر میکنید کدهای پایه ای هستند و
برای اجرای برنامه الزم هستند را در داخل بلوک finallyقرار دهید .برنامه زیر نحوه استفاده از این بلوک را نشان میدهد:
\ by zero.
finally blocked was reached.
بلوک finallyبعد از بلوک catchنوشته میشود .اگر از چندین بلوک catchدر برنامه استفاده میکنید بلوک finallyباید بعد
از همه آنها قرار گیرد .میتوان از بلوک tryو finallyدر صورتی که بلوک catchنداشته باشیم به صورت زیر استفاده کرد.
try
{
//some code
}
finally
{
//some code
}
از این بلوک معموال برای بستن یک اتصال پایگاه داده یا بستن یک فایل استفاده میشود.
ایجاد استثناء
شما میتوانید در هر جای برنامه یک خطای ساختگی ایجاد کنید .همچنین اگر پیغام پیشفرض استثناءها را دوست ندارید میتوانید
به دلخواه خودتان یک پیغام برای نمایش ایجاد کنید .به مثال زیر توجه کنید:
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 533
1 package myfirstprogram;
2
3 import java.util.Scanner;
4
5 public class MyFirstProgram
6 {
7 public static void main(String[] args)
8 {
9 Scanner input = new Scanner(System.in);
10
11 int firstNumber, secondNumber, result;
12
13 System.out.print("Enter the first number: ");
14 firstNumber = input.nextInt();
15
16 System.out.print("Enter the second number: ");
17 secondNumber = input.nextInt();
18
19 try
20 {
21 if (secondNumber == 0)
22 {
23 throw new ArithmeticException();
24 }
25 else
26 {
27 result = firstNumber / secondNumber;
28 }
29 }
30 catch (ArithmeticException error)
31 {
32 System.out.println(error.getMessage());
33 }
34
35 }
36 }
میتوان مستقیما. استفاده کردهایمthrow از کلمه کلیدیexception و درست قبل از یک نمونه ایجاد شده از کالس51 در خط
: به مثال زیر توجه کنید. ایجاد و یک خطا را به دام انداختexception یک نمونه از کالس
throw error;
که یک رشته را دریافتException همچنین میتوان یک پیغام خطای سفارشی را به وسیله یکی دیگر از سربارگذاری های کالس
ایجاد استثناء بیشتر در مواقعی به کار. ذخیره میشودgetMessag() در این حالت پیغام خطای پیشفرض تغییر کرده و در متد
.میرود که یک کد در حالت عادی خطا ندارد ولی شما میخواهید در هر صورت به عنوان یک خطا در نظر گرفته شود
استثنایی است که توسط کاربر تعریف میشود و باید از کالس، استثناء سفارشی.در جاوا میتوان یک استثناء سفارشی ایجاد کرد
به کد زیر. ارث میبرد ایجاد میکنیمException برای این کار یک کالس جداگانه که از کالس پایه. ارث بری کندException پایه
:توجه کنید
1 package myfirstprogram;
2
3 import java.util.Scanner;
4
5
6 class NegativeNumberException extends Exception
7 {
8 public NegativeNumberException()
9 {
10 super("The operation will result to a negative number.");
11 }
12
13 public NegativeNumberException(String message)
14 {
15 super(message);
16 }
17
18 public NegativeNumberException(String message, Exception inner)
19 {
20 super(message, inner);
21 }
22 }
23
24 public class MyFirstProgram
25 {
26
27 public static void main(String[] args)
28 {
29 Scanner input = new Scanner(System.in);
30
31 int firstNumber, secondNumber, difference;
32
33 System.out.print("Enter the first number: ");
34 firstNumber = input.nextInt();
35
36 System.out.print("Enter the second number: ");
37 secondNumber = input.nextInt();
38
39 difference = firstNumber - secondNumber;
40
41 try
42 {
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 535
در خط 1مشاهده میکنید کالس ایجاد شده توسط ما از کالس Exceptionارث بری کرده است .به عنوان یک قرارداد باید به آخر
نام کالسهای استثنایی که توسط کاربر تعریف میشوند کلمه Exceptionاضافه شده و 1سازنده برای آنها تعریف شود.
دومین سازنده یک آرگومان از نوع رشته برای نمایش پیغام خطا قبول میکند.
سومین سازنده که دو آرگومان قبول میکند ،یکی پیغام خطا را نمایش داده و یکی بخش innerاست آن برای نشان
حال میخواهیم یک کالس استثناء خیلی سفارشی ایجاد کنیم .به خطوط 56-13توجه کنید .چون که قرار است که از کاربر ورودی
دریافت کنیم از کالس Scannerدر خط 56استفاده کردهایم .از آنجاییکه تولید یک عدد منفی در هیچ برنامه ای یک استثناء
محسوب نمیشود ،ما به صورت دستی و برای خودمان یک استثناء ایجاد کردهایم .ابتدا از کاربر میخواهیم که دو مقدار را وارد کند
(خطوط .)11-11سپس تفاوت دو عدد را محاسبه میکنیم (خط .)16در داخل بلوک tryتست میکنیم که آیا حاصل تفریق دو
عدد ،یک عدد منفی است (خط .)33-31اگر یک عدد منفی بود سپس یک نمونه از کالس NegativeNumberExceptionایجاد
میکنیم (خط .)31بعد از ایجاد نمونه به وسیله بلوک catchو برای نشان داده پیغام خطا آن را اداره میکنیم (خطوط .)30-13
میComparator وComparable این دو رابط.دو رابط مفید برای مقایسه اشیایی که توسط کاربر تعریف شده اند وجود دارد
در یک کالس پیاده سازی می شود و اجازه می دهد کالس یا شی ایجاد شده از کالس با اشیاء دیگر ازComparable رابط.باشند
پیاده، همانطور که از نام این رابط پیداست. در یک کالس جداگانه پیاده سازی می شودComparator.همین کالس مقایسه شوند
گاهی اوقات الزم است که بخواهید دو شیء را بر اساس یک فیلد یا.سازی آن باعث ایجاد یک کالس مقایسه پذیر می شود
حال به نحوه استفاده از. انجام دهیدComparator این کار را می توانید با استفاده از پیاده سازی رابط،خاصیت مقایسه کنید
. می پردازیمComparable رابط
Comparable رابط
: را پیاده سازی می کندComparable در مثال زیر یک کالس نشان داده شده است که رابط
1 package myfirstprogram;
2
3 class Person implements Comparable<Person>
4 {
5 public String FirstName;
6 public String LastName;
7 public int Age;
8
9 public Person(String FirstName, String LastName, int Age)
10 {
11 this.FirstName = FirstName;
12 this.LastName = LastName;
13 this.Age = Age;
14 }
15
16 @Override
17 public int compareTo(Person other)
18 {
19 if (this.Age > other.Age)
20 return 1;
21 else if (this.Age < other.Age)
22 return -1;
23 else
24 return 0;
25 }
26 }
27
28 public class MyFirstProgram
29 {
30 public static void main(String[] args)
31 {
32 Person person1 = new Person("John", "Smith", 21);
33 Person person2 = new Person("Mark", "Logan", 19);
34 Person person3 = new Person("Luke", "Adams", 20);
35
36 Person youngest = GetYoungest(person1, person2, person3);
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 533
را نیزcompareTo() الزم است که تنها متد آن یعنی متد،)1 استفاده می کند (خطComparable وقتی که یک کالس از رابط
این متد همچنین یک آرگومان قبول می. یک مقدار صحیح را بر می گرداندcompareTo() ) متد31-51 پیاده سازی کند (خطوط
( شخصage) در مثال باال ما سنcompareTo() در داخل متد.کند که همان شیی است که قرار است با شی جاری مقایسه شود
طبق قرارداد اگر سن شخص مورد نظر ما از سن شخص دیگر بیشتر بود مقداری.فعلی را با سن شخص دیگر مقایسه کرده ایم
پیاده سازی50-16 خطوط. اگر کمتر بود مقداری کمتر از صفر و اگر مساوی بود مقدار صفر برگشت داده می شود،بزرگتر از صفر
. برنامه جوانترین و پیرترین شخص را تشخیص می دهد. را نشان می دهدPerson توسط شیComparable رابط
1۵۱ مبانی زبان جاوا
در خطوط 15-13سه شی Personبا مقادیر کامال اختیاری ایجاد شده است .در خطوط 11-11متغیرهایی برای نگهداری جوانترین
و پیرترین شخص تعریف شده اند .در خط 11متد )( GetYoungestرا فراخوانی کرده ایم .این متد در خطوط 31-11تعریف
شده است و سه شخص را که قرار است از لحاظ سنی با هم مقایسه شوند را قبول می کند.
در خط 31فرض را بر این گذاشته ایم که اولین شخص ) (person1جوانترین شخص است .سپس با استفاده از پیاده سازی متد
)( compareToتست می کنیم که آیا شخص دوم ) (person2از شخص اول جوانتر است یا نه .در داخل متد مذکور سن شخص
دوم و اول را با هم مقایسه می کنیم .اگر سن شخص دوم کمتر بود ،باید مقدار -3برگشت داده شده و در خط person2 ،13به
عنوان جوانترین شخص معرفی شود .در خطوط 15-11از تکنیکی مشابه برای شخص سوم استفاده کرده ایم .بعد از مقایسه
جوانترین شخص در خط 11به عنوان نتیجه برگشت داده می شود .در خط 11متد )( GetOldestکه در خطوط 10-16تعریف
شده است فراخوانی می شود .کد های داخل این متد شبیه به متد )( GetYoungestاست با این تفاوت که تست می شود که
آیا سن شخص دیگر بزرگتر از سن شخص مورد نظر ماست یا نه؟ بنابراین باید انتظار داشته باشیم که مقدار 3به جای -3توسط متد
برگشت داده شود .در خطوط 16و 33نام جوانترین و پیرترین شخص چاپ می شود.
نکته :پیاده سازی رابط Comparableیک مشکل دارد و آن این است که اشیاء فقط به یک طریق مرتب می شوند مثال بر حسب
نام .با این روش نمی توان یک بار بر حسب نام ،یک بار دیگر بر حسب مثال فامیلی و … اشیاء را مرتب کرد .
رابط Comparator
Comparatorدر یک کالس جداگانه پیاده سازی می شود .همانطور که از نام این رابط پیداست ،پیاده سازی آن باعث ایجاد یک
کالس مقایسه پذیر می شود .به وسیله این رابط می توان چندین مقایسه برای کالس Personایجاد کرد.یعنی می توان مقایسه
های مختلفی بر روی اشیاء یک کالس انجام داد .روش کار به صورت زیر است:
ابتدا کالس اصلی یعنی که کالسی که می خواهیم مقایسه بر روی آن انجام شود ،باید رابط Comparableرا پیاده سازی
کند.
در چند کالس جدا که رابط Comparatorرا پیاده سازی کرده اند ،و در داخل متد )( compareاین رابط ،مقایسه های
sort() با ایجاد لیست می توانیم از متد. یک لیست از می سازیم و اشیاء مختلف کالس اصلی را در آن قرار می دهیم
چون این متد دو پارامتر می گیرد اولین پرامتر یک لیست است که همان اشیاء کالس. استفاده کنیمCollectionکالس
را پیاده سازی کرده است و کار مرتبComparator اصلی می باشند و دومین پارامتر هم یک شیء از کالسی که رابط
. نام و یا نام خانوادگی مورد مقایسه قرار می گیرند،(age) بر اساس سنPerson اشیاء ایجاد شده از کالس،در مثال زیر
1 package myfirstprogram;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.Comparator;
6 import java.util.List;
7 import java.util.Scanner;
8
9 class Person implements Comparable<Person>
10 {
11 public String FirstName;
12 public String LastName;
13 public int Age;
14
15 public Person(String FirstName, String LastName, int Age)
16 {
17 this.FirstName = FirstName;
18 this.LastName = LastName;
19 this.Age = Age;
20 }
21
22 @Override
23 public int compareTo(Person other)
24 {
25 if (this.Age > other.Age)
26 return 1;
27 else if (this.Age < other.Age)
28 return -1;
29 else
30 return 0;
31 }
32 }
33
34 class FirstNameComparer implements Comparator<Person>
35 {
36 @Override
37 public int compare(Person person1, Person person2)
38 {
39 return person1.FirstName.compareTo(person2.FirstName);
40 }
41 }
42
43 class LastNameComparer implements Comparator<Person>
44 {
45 @Override
46 public int compare(Person person1, Person person2)
47 {
48 return person1.LastName.compareTo(person2.LastName);
49 }
50 }
51
52 class AgeComparer implements Comparator<Person>
53 {
54 @Override
1۵1 مبانی زبان جاوا
Original Order
John Smith, Age: 21
Mark Logan, Age: 19
Luke Adams, Age: 20
New Order
John Smith, Age: 21
Luke Adams, Age: 20
Mark Logan, Age: 19
Original Order
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 530
New Order
Luke Adams, Age: 20
Mark Logan, Age: 19
John Smith, Age: 21
Original Order
John Smith, Age: 21
Mark Logan, Age: 19
Luke Adams, Age: 20
New Order
Mark Logan, Age: 19
Luke Adams, Age: 20
John Smith, Age: 21
هنگام استفاده از این رابط الزم است یک متد به نام )( compareکه دو شیء قبول می کند و یک عدد صحیح را به عنوان نتیجه
بر می گرداند را پیاده سازی کند .از آنجاییکه از رابط Comparatorاستفاده کرده ایم متد )( compareبه طور خودکار دو شئ
Personقبول می کند .همانطور ک ه اشاره شد ،این رابط به وسیله کالس جداگانه پیاده سازی می شود و ما این کار روا در خطوط
13-۱۹انجام داده ایم .در این خطوط سه کالس تعریف کرده ایم که این رابط را پیاده سازی کرده (خطوط 31 ،13و )13و در نتیجه
وظیفه دارند که متد )( compareاین رابط را هم Overrideکنند .در داخل بدنه این متد هم مقایسه های مختلف را می نویسیم.
در مثال باال با استفاده از کالس FirstNameComparerکه رابط Comparatorرا پیاده سازی می کند ،دو شئ Personبر اساس
نام مقایسه می شوند .در متد )( Compareبه سادگی و با استفاده از متد )( compareToاز رابط Comparableاستفاده کرده ایم
به روشی مشابه از کالس های LastNameComparerو AgeComparerبرای مقایسه اشیاء بر اساس نام خانوادگی و سن استفاده
می کنیم .متد )( compareدر صورتی که دو پارامتر با هم برابر باشند ،مقدار ، 3اگر پارامتر اول از پارامتر دوم بزرگتر باشد ،مقداری
1۵۹ مبانی زبان جاوا
بزرگتر از 3و اگر پارامتر اول از پارامتر دوم کوچکتر باشد مقداری کوچکتر از 3را بر می گرداند .در مثال باال از کاربر سوال می شود که
لیستی از اشیاء را قرار است بر اساس کدام خاصیت مرتب کند.در خطوط 13-11اشیا با مقادیر از پیش تعریف شده ای برای هر یک
از خاصیت هایشان ایجاد شده است.در خطوط 10-13ترتیب عادی و اصلی این اشیاء نمایش داده شده است .در خطوط 13-11
لیستی از انتخاب هایی که کاربر بر اساس آنها می تواند عملیات مرتب سازی را انجام دهد آورده شده است .در خطوط 11-16از
کاربر در مورد انتخابش سوال می شود .در خط 03متد )( ReorderPersonsمتد از پیش تعریف شده ی خطوط 00-333را
فراخوانی می کنیم .این متد انتخاب کاربر و لیستی از اشیا که قرار است بر اساس خاصیتی که کاربر انتخاب کرده است مرتب شوند
را قبول می کند .در داخل متد یک متغیر تعریف کرده ایم که از نوع Comparatorاست و در نتیجه می تواند هر نوع کالسی که
رابط مذکور را پیاده سازی می کند را شامل شود .در خطوط 65-61چک می کنیم که اگر کاربر یک مقدار عددی خاص را انتخاب کرد،
چه کارهایی انجام شود .در خط 33از متد )( sortکالس Collectionsاستفاده کرده ایم .این متد دارای یک نسخه سربارگذاری
شده است که یک شی Comparatorرا قبول می کند .ما در خط 66کالس مقایسه کننده بر اساس نوع انتخاب کاربر را به این متد
می دهیم و سپس متد )( ،sortشی Personرا بر اساس این کالس مرتب می کند.
به طور خالصه کالسی که رابط Comparableرا پیاده سازی کند ،به کالسی مقایسه پذیر تبدیل می شود و کالسی که رابط
Comparatorرا پیاده سازی کند ،می تواند به وسیله متدهای )( Collections.sortیا )( Arrays.sortمرتب شود ،کاری
کلکسیونها)(Collections
قبال یاد گرفتیم که آرایهها به ما اجازه ذخیره چندین مقدار از یک نوع را میدهند .آرایهها از کالس Java.util.Arraysارث بری
میکنند که این کالس دارای خواص و متدهایی برای کار با دادههای ساده ای مانند طول آرایه میباشد .آرایههای ساده در جاوا
دارای طول ثابتی هستند که یک بار تعریف و مقدار دهی میشوند و شما نمیتوانید طول یک آرایه خاص را افزایش یا کاهش
دهید .جاوا گزینه بهتری برای جایگزین کردن با آرایهها پیشنهاد میدهد و بیشتر آنها کالسها و رابطهایی هستند که در پکیج
و کالس java.util.ArrayListقرار دارند .به عنوان مثال کالس ArrayListرفتاری شبیه به یک آرایه معمولی دارد با این
تفاوت که به شما اجازه میدهد که طول آن را به صورت پویا تغییر داده یا یک عنصر را در طول اجرای برنامه به آن اضافه کرده و یا
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 553
از آن حذف نمایید .در درس بعد پی میبرید که چگونه یک کالس که شامل مجموعه ای از اشیاء است را به وسیله اجرا کردن و یا
کالس ArrayList
کالس ArrayListبه شما اجازه ذخیره مقادیر انواع داده ای مختلف ،و توانایی حذف و اضافه عناصر آرایه در هر لحظه را میدهد.
;package myfirstprogram
;import java.util.ArrayList
;)"myArray.add("John
;)myArray.add(5
;)myArray.add(true
;)myArray.add(3.65
;)'myArray.add('R
John
5
true
3.65
R
برای استفاده از این کالس ابتدا باید در قسمت فضاهای نامی ،فضای نام java.util.ArrayListرا وارد کنیم (خط .)1همانطور
که در مثال مشاهده میکنید یک نمونه از کالس ArrayListایجاد میکنیم .برای اضافه کردن یک عنصر به آرایه باید از متد
)( addاستفاده کنیم .از آنجاییکه شیء ایجاد شده از کالس ArrayListآرگومانی از نوع Objectقبول میکند بنابراین میتوان
مقادیری از هر نوع داده ای به آن ارسال کرد چون هر چیز در جاوا از Objectارث بری میکند.
11۵ مبانی زبان جاوا
حال برای نمایش توانایی این کالس در نگهداری انواع داده ای مختلف پنج مقدار از پنج نوع مختلف داده را به آن اضافه میکنیم.
سپس همه مقادیر را با استفاده از دستور foreachمیخوانیم .چون کالس ArrayListدارای انواع داده ای مختلفی است
نمیتوانیم از یک نوع داده ای خاص برای خواندن مقادیر استفاده کنیم .لذا برای این کار باید از نوع Objectکه میتواند هر نوع
داده ای در خود ذخیره کند استفاده نمود .به این نکته توجه کنید که برای دسترسی به هر عنصر میتوانید از طریق اندیس آن اقدام
نمایید .کد زیر نحوه استفاده از حلقه forبرای دسترسی به هر یک از اعضا را نشان میدهد.
به متد )( sizeدر کد باال توجه کنید .این متد درست شبیه به خاصیت lengthآرایه معمولی است و کار آن شمارش تعداد
عناصر شیء ArrayListمیباشد .در کد باال همانطور که نشان داده شده است میتوان به هر یک از عناصر با استفاده از اندیسشان
دست یافت () .)get(iنکته دیگر این است که شما میتوانید به کالس ArrayListیک ظرفیت ابتدایی بدهید .به عنوان مثال
شما میتوانید با استفاده از یک سازنده سربارگذاری شده نشان دهید که یک شیء ArrayListمیتواند دارای 1عنصر باشد.
کد باال 1مکان خالی به وجود میآورد و شما میتوانید با استفده از متد )( addیکی دیگر به آنها اضافه کنید .میتوان با استفاده
از متد )( removeکالس ArrayListعناصر را پاک کرد .متد )( removeیک شیء که مطابق مقدار یک عنصر در آرایه است را
قبول میکند .این متد به محض رسیدن به مقدار مورد نظر آن را حذف میکند .اگر عنصری را که مکانی غیر از مکان آخر آرایه باشد
حذف کنید بقیه عناصر بعد از آن عنصر مکان خود را تنظیم میکنند به این معنی که فرض کنید آرایه ای دارای 1عنصر است و شما
عنصر 1را حذف میکنید ،در این صورت جای خالی این عنصر توسط عنصر 3و جای عنصر 3توسط عنصر 1پر میشود .به تکه کد
12 myArray.add("John");
13 myArray.add(5);
14 myArray.add(true);
15 myArray.add(3.65);
16 myArray.add('R');
17
18 for (int i = 0; i < myArray.size(); i++)
19 {
20 System.out.println(MessageFormat.format("myArray[{0}] = {1}", i, myArray.get(i)));
21 }
22
23 myArray.remove(2);
24
25 System.out.println("\nAfter removing myArray[1] (The value true)...\n");
26
27 for (int i = 0; i < myArray.size(); i++)
28 {
29 System.out.println(MessageFormat.format("myArray[{0}] = {1}", i, myArray.get(i)));
30 }
31 }
32 }
myArray[0] = John
myArray[1] = 5
myArray[2] = true
myArray[3] = 3.65
myArray[4] = R
myArray[0] = John
myArray[1] = 5
myArray[2] = 3.65
myArray[3] = R
) همه عناصر متوالی در آرایه باال مکان خود را تغییر51 را حذف کردهایم (خطmyArray[2] از آنجاییکه در مثال باال مقدار عنصر
این متد یک آرگومان. میتوان چک کرد که آیا یک مقدار خاص در داخل آرایه وجود دارد یا خیرcontains() با استفاده از متد
وindexOf() از متدهای، را بر میگرداندtrue از نوع شیء را قبول کرده و اگر یک مقدار را در داخل لیست عناصر پیدا کند
هر دو متد ،در صورتیکه مقدار مورد نظر را پیدا نکنند مقدار -3را بر میگردانند.
برای جایگزین کردن یک مقدار با یک مقدار موجود در ArrayListاز متد )( setاستفاده میشود .فرض کنید که میخواهید عدد
31را جایگزین عدد 1در مثال باال کنید برای اینکار باید به صورت زیر عمل کنید:
;)myArray.set(2,15
عدد 5در مثال باال نشان دهنده اندیس مقداری از ArrayListاست که ما میخواهیم مقداری دیگر را جایگزین آن کنیم .در این
مثال اندیس 5نشان دهنده مقدار 1است .برای به دست آوردن تعداد عناصر در یک Arraylistاز متد )(size
)(myArray.size
;)(myArray.clear
مرتب سازی در ArrayListزمانی معنا دارد که همه آیتمها از یک نوع مثال عدد صحیح باشند .برای ایجاد یک کالس ArrayList
که در آن typeنوع داده ای مجموعه و CollectionNameنامی است که برای مجموعه انتخاب کردهایم .فرض کنید که میخواهیم
یک مجموعه از نوع اعداد صحیح ایجاد و مرتب کنیم .به مثال زیر توجه کنید:
17
18 ;)Collections.sort(myArray
19
20 )for (int i = 0; i < myArray.size(); i++
21 {
22 ;)))System.out.println(MessageFormat.format("myArray[{0}] = {1}", i, myArray.get(i
23 }
24 }
25 }
همانطور که در مثال بال مشاهده میکنید در خط 3پکیج Collectionsرا وارد برنامه کردهایم .وجود این پکیج برای مرتب سازی
الزامی است .در خط 33یک مجموعه از نوع اعداد صحیح ایجاد و در خطوط 31-36به صورت نامرتب چند آیتم به آن اضافه کردهایم.
با استفاده از متد )( sortمیتوان مقادیر یک آرایه را مرتب نمود .اعداد از بزرگ به کوچک و رشته بر اساس حروف الفبا مرتب
میشوند .اگر از این متد استفاده کنید همه اجزا با هم مقایسه میشوند .به عنوان مثال نمیتوان یک رشته و یک عدد از نوع int
را در داخل ArrayListقرار داد و آنها را با متد )( Sortمرتب نمود .در درس آینده یاد خواهید گرفت که چگونه از یک مقایسه
Iteratorو ListIterator
برای دسترسی ،ویرایش و حذف هر یک از عناصر یک کلکسیون ابتدا باید عنصر مورد نظر را پیدا کنیم .برای این کار الزم است که
در میان عناصر بگردیم .سه راه برای گردش در میان عناصر یک کلکسیون یا مجموعه وجود دارد:
. یک مجموعه یا کلکسیون را رو به جلو پیمایش کرده و شما را قادر می سازد که عناصر را حذف و ویرایش کنیدIterator رابط
می سازیم میIterator وقتی یک شیء از. می باشدiterator() هر کلکسیون برای ایجاد یک پیمایشگر دارای متدی به نام
توضیح متد
چک می کند که آیا عنصری بعد از عنصر فعلی وجود دارد یا نه؟ hasNext
package myfirstprogram;
import java.util.*;
arraylist.add("A");
arraylist.add("B");
arraylist.add("C");
arraylist.add("D");
while (iterator.hasNext())
{
System.out.println(iterator.next());
}
}
}
A
B
C
D
در کد باال با فراخوانی متد )( iteratorاز کلکسیونمان که در اینجا arraylistاست آن را به مجموعه ای قابل پیمایش توسط
رابط ListIteratorیک مجموعه را با استفاده از متدهایی که در جدول زیر آمده اند ،هم رو به جلو و هم رو به عقب پیمایش
می کند:
توضیح متد
چک می کند که آیا عنصری بعد از عنصر فعلی وجود دارد یا نه؟ hasNext
چک می کند که آیا عنصری قبل از عنصر فعلی وجود دارد یا نه؟ hasPrevious
این رابط فقط در مجموعه هایی قابل دسترسی است که رابط Listرا پیاده سازی کرده باشند:
;package myfirstprogram
;*import java.util.
;)"arraylist.add("A
;)"arraylist.add("B
;)"arraylist.add("C
;)"arraylist.add("D
;)"System.out.println("\n\n
System.out.println(listiterator.previous());
}
}
}
A
B
C
D
D
C
B
A
از این حقله نمی توان برای ویرایش. است که می تواند در میان عناصر یک مجموعه گردش کندfor نسخه ای از حلقهForeach
را پیاده سازیIterable می تواند در میان هر مجموعه ای از اشیاء که رابطforeach حلقه.عناصر یک مجموعه استفاده کرد
package myfirstprogram;
import java.util.*;
arraylist.add("A");
arraylist.add("B");
arraylist.add("C");
arraylist.add("D");
A
B
C
D
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 550
Vector
کالس Vectorهم ،رابط Listرا پیاده سازی می کند .همانند ArrayListمی تواند تعداد نامشخصی عنصر داشته باشد ولی
سرعت آن در جستجو ،اضافه و حذف عناصر نسبت به ArrayListکمتر است .سه روش برای ایجاد یک شیء از کالس Vector
وجود دارد .در روش اول تعداد عناصر را مشخص نمی کنیم .در این حالت ظرفیت پیشفرض vectorده عنصر می باشد :
نکته ای که در این روش وجود دارد این است که وقتی شما بخواهید یازدهمین عنصر را وارد کنید ،ظرفیت Vectorدو برابر می
در مثال باال Vectorسه عنصر را می تواند در خود جای دهد .و روش سوم هم دو آرگومان برای Vectorدر نظر می گیریم.
آرگومان اول به معنای ظرفیت پیشفرض و آرگومان دوم هم به معنای ظرفیت نهایی می باشد :
یعنی در مثال فوق بعد از وارد کردن پنجمین عنصر سایز Vectorبه 33و بعد از وارد کردن یازدهمین عنصر ظرفیت Vectorبه
توضیح متد
چک می کند که آیا همه عناصر یک مجموعه در داخل Vectorهستند یا خیر؟ containsAll
چک می کند که آیا یک عنصر خاص در موقعیتی خاص از Vectorوجود دارد یا نه؟ elementAt
11۹ مبانی زبان جاوا
1 package myfirstprogram;
2
3 import java.util.*;
4
5 public class MyFirstProgram
6 {
7 public static void main(String[] args)
8 {
9 /* Vector of initial capacity(size) of 2 */
10 Vector<String> myVector = new Vector<String>(2);
11
12 /* Adding elements to a vector*/
13 myVector.addElement("Apple");
14 myVector.addElement("Orange");
15 myVector.addElement("Mango");
16 myVector.addElement("Fig");
17
18 /* check size */
19 System.out.println("Size is: "+ myVector.size());
20 System.out.println("Default capacity increment is: " + myVector.capacity());
21
22 /* capacityIncrement */
23 myVector.addElement("fruit1");
24 myVector.addElement("fruit2");
25 myVector.addElement("fruit3");
26
27 /*size and capacityIncrement after two insertions*/
28 System.out.println("Size after addition: " + myVector.size());
29 System.out.println("Capacity after increment is: " + myVector.capacity());
30
31 /*Display Vector elements*/
32 System.out.println("\nElement are: ");
33 for(String vector : myVector)
34 {
35 System.out.println(vector);
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 513
36 }
37 }
38 }
Element are:
Apple
Orange
Mango
Fig
fruit1
fruit2
fruit3
همانطور که در کد باال مشاهده می کنید ،ظرفیت Vectorبرابر عدد 5است (خط )33ولی چون ما در خطوط 31-31چهار عنصر به
آن اضافه کرده ایم ،ظرفیت آن به 3تغییر می کند .به این نکته توجه کنید که متد )( sizeتعداد عناصر و متد )(capacity
حجم Vectorرا نشان می دهد .به ادامه کد توجه کنید .در خطوط 51-51سه عنصر دیگر به Vectorاضافه کرده ایم .در نتیجه
خروجی تعداد عناصر را 1و حجم Vectorرا 0نشان می دهد .در آخر هم با استفاده از یک حلقه foreachتمام عناصر Vector
List
Listیکی از interfaceهای اصلی Collection Frameworkجاواست که برای نگه داری یک لیست از آن استفاده میشود،
زیر کالسهای مختلفی همچون Vector ،ArrayList ،LinkedListدر جاوا وجود دارند که هر کدام با استفاده از ساختمان
دادههای متفاوت به نحوی مفهوم لیست را پیاده سازی کردهاند .یک لیست باید حداقل شرایط زیر را بر آورده کند:
بتوان با استفاده از اندیس (با شروع از صفر) به عناصر داخل آن دسترسی داشت.
متدهای Listدر جدول زیر آمدهاند ،کالسهایی که از کالس Listارث بری دارند موظف هستند این متدها را پیاده سازی
کنند.
کاربرد متد
یک عنصر جدید را در اندیس مورد نظر درج میکند. )add(index,Object o
اگر تمام اعضای کالکشن cدر لیست فعلی وجود داشته باشند trueبر میگرداند. )containsAll(Collection c
در صورت وجود عناصر تکراری آخرین اندیس یک عنصر را بر میگرداند. )lastIndexOf(Object o
تمام عناصر یک کالکشن دیگر را از لیست فعلی حذف میکند. )removeAll(Collection c
اشتراک لیست فعلی را با کالکشن دیگر محاسبه میکند و سایر اعضا را حذف میکند. )retainAll(Collection c
در ادامه با یک مثال با Listآشنا میشویم و مثالهای بیشتر را به آموزشهای بعدی موکول میکنیم.
;package myfirstprogram
;import java.util.List
;import java.util.LinkedList
;)System.out.println(list
;)"list.set(indexOfC, "X
;)System.out.println(list
}
}
][A, B, C, D
2
][A, B, X, D
در مثال باال ابتدا یک Listایجاد میکنیم ،چون Listیک interfaceاست برای ساخت یک شیء جدید از آن باید از یکی
از زیر کالسهای پیاده سازی شده آن استفاده کنیم که در اینجا LinkedListرا انتخاب کردیم .سپس با استفاده از متد )(add
چندین عضو به لیست اضافه کردیم .سپس از چاپ لیست ،با استفاده از متد )( indexOfاندیس عنصر Cرا به دست آورده و
آن را در متغیر indexOfCذخیره میکنیم .بعد از چاپ indexOfCبا استفاده از متد )( setعنصر موجود در اندیس indexOfC
Map
1۳۳ مبانی زبان جاوا
Mapیکی از interfaceهای اصلی Collection Frameworkجاواست که برای نگه داری زوج کلید-مقدار ) (key-valueاز
آن استفاده میشود و در پکیج java.util.Mapقرار دارد .زیر کالسهای مختلفی همچون ،IdenentityHashMap ،HashMap
WeakHashMap ،LinkedHashMapو TreeMapدر جاوا وجود دارند که هر کدام با استفاده از الگوریتمها و ساختمان دادههای
متفاوت به نحوی مفهوم نگه داری زوج کلید-مقدار را پیاده سازی کردهاند .به هر زوج کلید-مقدار در Mapیک entryگفته میشود
که با استفاده از Map.Entryمیتوان به آنها دسترسی داشت و کلید ) (keyیا مقدار ) (valueرا استخراج کرد .کلید در Map
یک عنصر یکتاست ولی مقدار متناظر با آن میتواند یک Objectساده یا پیچده (مثال یک لیست) و یا حتی nullباشد ،به
عالوه ممکن است برای چند کلید مختلف مقادیر تکراری داشته باشیم null .نیز میتواند یک کلید منحصر به فرد در نظر گرفته
شود لذا هر Mapمیتواند حداکثر یک کلید با مقدار nullنیز داشته باشد .کاربردهای Mapبه صورت کلی عبارتاند از:
قادر باشیم زوج کلید-مقدار را در Mapذخیره کنیم و هر زمان که الزم شد تنها با داشت کلید بتوانیم مقدار متناظر با آن را
استخراج کنیم.
راهکاری برای تشخیص وجود یا عدم وجود کلید در Mapداشته باشیم.
راهکاری برای تشخیص وجود یا عدم وجود یک مقدار در Mapداشته باشیم.
متدهای Mapدر جدول زیر آمدهاند ،کالسهایی که از کالس Mapارث بری دارند موظف هستند این متدها را پیاده سازی کنند.
کاربرد متد
بررسی میکند که آیا کلید ) (keyمورد نظر در Mapوجود دارد یا خیر؟ )containsKey(Object key
بررسی میکند که آیا مقدار مورد نظر در Mapوجود دارد یا خیره؟ containsValue(Object
)val
یک کلید ) (keyرا حذف میکند که این عمل باعث حذف مقدار متناظر با آن نیز میشود. )remove(Object key
Map.Entry
Map.Entryیک interfaceبرای دسترسی به زوج کلید-مقدار ) (entryاست که متدهایی را برای استخراج کلید یا مقدار در
کاربرد متد
در ادامه با دو مثال با Mapآشنا میشویم و مثالهای بیشتر را به آموزشهای بعدی موکول میکنیم .در مثال اول یک Mapبه
صورت زوجهای نام-نمره ایجاد میکنیم که در آن کلید نام افراد و مقدار نمره آنهاست.
;package myfirstprogram
;import java.util.Map
;import java.util.HashMap
;)myMap.put("Jenny", 85
;)myMap.put("Jenny", 87
;)"myMap.put("Peter", "No Score
;)myMap.put("Mary Jane", 64
;)myMap.put("Azhar", 87
;)System.out.println(myMap
}
}
در مثال باال ابتدا یک شیء از Mapایجاد کردیم ،چون Mapتنها یک interfaceاست برای استفاده از newو ساخت یک شیء
واقعی باید از یکی از زیر کالسهای آن استفاده کنیم که در اینجا از HashMapکه بعدا با آشنا میشویم استفاده کردیم .پس از
ساخت Mapبا استفاده از متد )( putزوجهای کلید و مقدار را در Mapقرار دادیم ،چون کلید نمیتواند تکراری باشد پس از
فراخوانی ) (“Jenny”, 85مقدار قبلی متناظر با Jennyیعنی 01از Mapپاک میشود ولی دقت کنید که مقادیر میتوانند
تکراری باشند (بر خالف کلید) ،به عنوان مثال Azharو Jennyهر دو دارای مقدار 01هستند .در مثال دوم با Map.Entryآشنا
;package myfirstprogram
;import java.util.Map
;import java.util.Set
;import java.util.HashMap
{
)public static void main(String[] args
{
;)(><Map myMap = new HashMap
;)myMap.put("Jenny", 87
;)"myMap.put("Peter", "No Score
;)myMap.put("Mary Jane", 64
;)myMap.put("Azhar", 87
;)(Set<Map.Entry> s = myMap.entrySet
}
}
)[Azhar] = (79
)[Jenny] = (87
)[Mary Jane] = (64
)[Peter] = (No Score
همانطور که مشاهده میکنید کلیدها را بین ][ و مقادیر را بین )( قرار میدهیم .پس از ساخت Mapمتد )( entryرا فراخوانی
میکنیم و نتیجه را در یک Setمیریزیم ،باید مشخص کنیم که عناصر این از نوع Map.Entryهستند .پس از آن در داخل یک
حلقه forهر کدام از Map.Entryها را استخراج میکنیم و سپس با فراخوانی متد )( getKeyکلید و با فراخوانی متد
Set
Setیکی از interfaceهای اصلی Collection Frameworkجاواست که برای نگه داری یک مجموعه بدون تکرار از آن استفاده
میشود ،زیر کالسهای مختلفی همچون HashSet ،TreeSetو LinkedHashSetدر جاوا وجود دارند که هر کدام با استفاده از
الگوریتمها و ساختمان دادههای متفاوت به نحوی مفهوم “مجموعه بدون تکرار” را پیاده سازی کردهاند null .نیز میتواند یک
مقدار منحصر به فرد در نظر گرفته شود لذا هر Setمیتواند حداکثر یک مقدار nullنیز داشته باشد .کاربردهای Setبه صورت
صرفه جویی حافظه در الگوریتمهای جست و جوی پیشرفته (با تشخیص گرههای تکراری)
متدهای Setدر جدول زیر آمدهاند ،کالسهایی که از کالس Setارث بری دارند موظف هستند این متدها را پیاده سازی کنند.
کاربرد متد
اگر تمام اعضای کالکشن cدر Setفعلی وجود داشته باشند trueبر میگرداند. )containsAll(Collection c
اشتراک Setفعلی را با کالکشن دیگر محاسبه میکند و سایر اعضا را حذف میکند. )retainAll(Collection c
در ادامه با دو مثال با Setآشنا میشویم و مثالهای بیشتر را به آموزشهای بعدی موکول میکنیم .در مثال اول یک Setایجاد
;package myfirstprogram
;import java.util.Set
;import java.util.HashSet
;)set.add(null
;)"set.add("Jenny
;)"set.add("Jenny
;)"set.add("Jenny
;)"set.add("Azhar
;)set.add(null
;)"set.add("Azhar
;)System.out.println(set
}
}
همانطور که مشاهده میکنید با اینکه عنصر ” “Jennyسه بار و عنصر nullدوبار به مجموعه اضافه شدند در نتیجه نهایی از هر
عنصر تنها یک نمونه وجود دارد .در مثال باال ابتدا یک شیء از Setایجاد کردیم ،چون Setتنها یک interfaceاست برای
استفاده از newو ساخت یک شیء واقعی باید از یکی از زیر کالسهای آن استفاده کنیم که در اینجا از HashSetکه بعدا با آشنا
میشویم استفاده کردیم .پس از ساخت Setبا استفاده از متد )( addعناصری را به آن اضافه کردیم .در مثال دوم با retainAll
آشنا میشویم.
;package myfirstprogram
;import java.util.Set
;import java.util.HashSet
;)B.add(2
1۳۹ مبانی زبان جاوا
;)B.add(4
;)B.add(5
;)System.out.println(A
;)System.out.println(B
;)A.retainAll(B
;)System.out.println(A
}
}
][2, 4, 6
][2, 4, 5
][2, 4
در کد قبل دو مجموعه به نامهای Aو Bایجاد میکنیم ،مجموعه اول شامل اعداد 1 ،3 ،5و مجموعه دوم شامل اعداد 1 ،3 ،5
خواهد بود ،پس از استفاده از retainAllاعضایی از Aکه در مجموعه Bقرار ندارند از Aحذف میشوند و نتیجه به صورت
HashSet
کالس HashSetزیر کالس AbstractSetاست و مفهوم Setیعنی یک مجموعه بدون تکرار را پیاده سازی میکند و در پکیج
java.util.HashSetقرار دارد .قبال با مفهوم Setآشنا شدیم ،کالس HashSetبرای پیاده سازی Setاز الگوریتم درهم سازی
) (hashingاستفاده میکند .مهمترین کاربرد HashSetاین است که تشخیص دهیم شی خاصی در مجموعه وجود دارد یا خیر ؟
چون HashSetاز جدول Hashو الگوریتم درهم سازی استفاده می کند عمل جست و جو در آن بسیار سریع است و از این ویژگی
آن در جست و جوهای پیشرفته مانند الگوریتمهای جست و جوی هوش مصنوعی استفاده میشود .برای ساخت HashSetباید
)(HashSet
یک HashSetخالی با جدول نگه دارنده ای با اندازه پیش فرض ایجاد میکند.
)HashSet(Collection c
)HashSet(int Capacity
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 533
یک HashSetخالی با جدول نگه دارنده ای با اندازه Capacityایجاد میکند ،هر زمان که الزم باشد اندازه جدول نگه دارنده به
یک HashSetخالی با جدول نگه دارنده ای با اندازه Capacityایجاد میکند ،هر زمان که الزم باشد اندازه جدول نگه دارنده به
صورت خودکار افزایش مییابد ،پارامتر fillRationعددی بین 3.3و 3.3است و مشخص میکند که جدول نگه دارنده چه زمان
باید تغییر اندازه داده شود ،به عنوان مثال 3.0به معنی آن است که هنگامی که ظرفیت جدول به بیش از هشتاد درصد رسید اندازه
کاربرد متد
متدهای )( addو )( removeو )( containsدر HashSetفوق العاده سریع هستند و این مهمترین ویژگی
HashSetاست.
در مثال زیر با استفاده از متد )( addچند عضو به HashSetاضافه میکنیم و سپس کل مجموعه را چاپ میکنیم ،با متد
)( removeعنصری را حذف میکنیم و مجددا کل مجموعه را چاپ می کنیم ،در انتها نیز وجود یا عدم وجود دو مورد در مجموعه را
;package myfirstprogram
;import java.util.HashSet
;)"mySet.add("A
;)"mySet.add("B
;)"mySet.add("C
;)"mySet.add("A
;)"mySet.add("D
;)"mySet.add("E
;)System.out.println(mySet
;)"mySet.remove("D
;)System.out.println(mySet
;))"System.out.println(mySet.contains("D
;))"System.out.println(mySet.contains("E
}
}
][A, B, C, D, E
][A, B, C, E
false
true
در کد باال مشاهده میکنید که HashSetعضو تکراری نگه داری نمی کند ،به عالوه هنگامی که عضوی در مجموعه وجود نداشته
LinkedList
کالس LinkedListپیاده سازی interfaceهای Dequeو Listاست و برای همین صفات لیست و صف را با هم داراست،
این کالس به صورت ساختمان داده لیست دو پیوندی ) (Doubly-LinkedListپیاده سازی شده است و برای همین میتوان به
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 535
سادگی و در زمان کم به ابتدا و انتهای عنصر جدید اضافه کرد ،به عالوه به دلیل دو پیوندی بودن عمل حذف به صورت بهینه تری
انجام میپذیرد .از این کالس میتوان به عنوان یک لیست ساده با دسترسی تصادفی ،صف دو طرفه ،صف FIFOیا حتی صف
LIFOاستفاده کرد.این کالس از لحاظ عملکرد بسیار شبیه ArrayListاست و تفاوت آنها در ساختمان داده ای است که به کار
ArrayListاز یک آرایه پویا و LinkedListاز ساختمان داده لیست دو پیوندی استفاده میکند.
عمل درج یا حذف عنصر در ابتدای در LinkedListبسیار سریع است ولی در ArrayListممکن است سریع نباشد.
عمل درج یا حذف عنصر در انتها در هر دو کالس به سرعت انجام میشود.
عمل جست و جو در هر دو کالس به صورت خطی است و چندان بهینه نیست.
عمل حذف با داشتن گره ،در LinkedListسریع تر است ولی اگر گره در دسترس نباشد و مجبور به عمل جست و جو
قبل از حذف گره باشیم هر دو کالس تقریبا یکسان هستند و چندان بهینه نیستند.
کالس LinkedListاز طریق مسیر java.util.LinkedListقابل دستیابی است .برای ساخت شیء از کالس LinkedList
)(LinkedList
)LinkedList(Collection c
این سازنده یک LinkedListجدید ایجاد میکند و اعضای کالکشن cرا به عنوان آیتمهای اولیه به LinkedListاضافه
کاربرد متد
عنصر جدید را در اندیس مورد نظر درج میکند. )add(int index,Object o
11۳ مبانی زبان جاوا
بررسی می کند که عنصر مورد نظر در لیست وجود دارد یا خیر؟ )contains(Object o
اگر از LinkedListبه عنوان Stackاستفاده کرده باشیم عنصری را به باالی آن اضافه )push(Object o
میکند.
عنصر موجود در اندیس مورد نظر را بر میگرداند و حذف میکند. )remove(int index
عنصر موجود در اندیس مورد نظر را به شی دیگری تغییر میدهد. )set(int index,Object o
بسیاری از متدهای فوق عمل یکسانی انجام می دهند و اینکه در عین کاربرد از کدام یک از آنها استفاده کنیم بیشتر به سالیق
برنامه نویس مربوط میشود .در ادامه با چند مثال با LinkedListآشنا میشویم .در این مثال با کاربرد LinkedListبه عنوان
;package myfirstprogram
;import java.util.LinkedList
myLL.add("A");
myLL.add("B");
myLL.add("C");
System.out.println(myLL);
System.out.println(myLL.get(1));
System.out.println(myLL);
System.out.println(myLL.remove(1));
System.out.println(myLL);
System.out.println(myLL.indexOf("C"));
}
}
[A, B, C]
B
[A, B, C]
B
[A, C]
1
می دانیم که، عناصری را به آن اضافه میکنیمadd() ایجاد میکنیم و سپس با استفاده از متدLinkedList در کد باال ابتدا یک
عنصرget() با استفاده از متد. پس از ساخت لیست یک بار آن را چاپ میکنیم.این متد عناصر را به انتهای لیست اضافه میکند
عنصر موجود در اندیس یک را با متد. را به دست آورده و آن را چاپ کرده و سپس کل لیست را چاپ میکنیم3 موجود در اندیس
اندیس از صفر شروعLinkedList حذف میشود زیرا درB میبینیم که عنصر، حذف کرده و آن را چاپ میکنیمremove()
به ابتدا و انتهای، در مثال دوم. را به دست آورده و چاپ میکنیمC اندیس عنصرindexOf() در انتها با استفاده از متد.میشود
package myfirstprogram;
import java.util.LinkedList;
myLL.add("O");
myLL.addFirst("A1");
myLL.addLast("B1");
System.out.println(myLL);
myLL.addFirst("A2");
myLL.addLast("B2");
System.out.println(myLL);
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 531
;)(myLL.removeFirst
;)System.out.println(myLL
;)(myLL.removeLast
;)System.out.println(myLL
}
}
در کد باال ابتدا با استفاده از متد )( addیک عنصر به لیست اضافه میکنیم ،سپس عنصر A1را با استفاده از متد )(addFirst
به ابتدای لیست و عنصر B1را با استفاده از متد )( addLastبه انتهای لیست اضافه میکنیم و بعد لیست را چاپ میکنیم.
عنصر A2را به ابتدای لیست و عنصر B2را به انتهای لیست اضافه میکنیم و لیست را چاپ میکنیم .با استفاده از متد
)( removeFirstعنصر ابتدای لیست را حذف میکنیم .با استفاده از متد )( removeLastعنصر انتهای لیست را حذف میکنیم.
میتوانیم به اشکال زیر از LinkedListبه عنوان پیاده سازی Deque ،Queueو Listاستفاده کنیم:
از LinkedListمیتوانیم به عنوان صف LIFOنیز استفاده کنیم ،کلمه LIFOمخفف عبارت Last in First Outاست و
بدین معنی است که عنصری که دیرتر اضافه میشود زودتر خارج میشود ،به چنین صفی Stackنیز گفته میشود .در جاوا کالس
اختصاصی برای Stackنیز وجود دارد ولی میتوانیم از LinkedListنیز به جای آن استفاده کنیم:
;package myfirstprogram
;import java.util.LinkedList
;)"myLIFO.push("A
;)"myLIFO.push("B
;)"myLIFO.push("C
;)System.out.println(myLIFO
;))(System.out.println(myLIFO.pop
;)System.out.println(myLIFO
;))(System.out.println(myLIFO.pop
;)System.out.println(myLIFO
;))(System.out.println(myLIFO.pop
;)System.out.println(myLIFO
}
}
][C, B, A
C
][B, A
B
][A
A
][
در کد باال با استفاده از متد )( pushعناصر را به صف LIFOاضافه میکنیم ،در انتها عنصر Cدر باالی صف قرار خواهد داشت.
در ادامه با استفاده از متد )( popعنصر باالی صف را حذف میکنیم ،می دانیم که در این شیوه عنصری که دیرتر اضافه شده زودتر
حذف میشود لذا ابتدا Cو سپس Bو در انتها Aاز صف حذف میشوند .هر بار پس از عمل حذف صف را نیز چاپ میکنیم.
Queue
Queueیکی از interfaceهای مهم در Collection Frameworkجاواست که برای تعریف مفهوم صفاز آن استفاده میشود،
صف ساختمان داده ای است که بتوان اشیایی را با ترتیبی خاص به آن وارد کرد و با الگوریتم مشخصی از آن استخراج یا حذف
نمود ،الگوریتم ها و پیاده سازی های مختلفی از انواع صف وجود دارند که در مباحث بسیار پیشرفته ای همچون تئوری صفها
) (Queueing Theoryمطرح میشوند ،سه پیاده سازی ساده و مهم صف در جاوا عبارتاند از:
:LinkedListصفی با ساختار FIFOرا پیاده سازی میکند که از لیست پیوندی استفاده میکند.
کلمه FIFOمخفف عبارت First In First Outاست ،صف FIFOصفی است که در آن عنصری که ابتدا وارد شود اولین
عنصری خواهد بود که خارج میشود ،مشابه صف نانوایی و بسیاری از صفهای دیگر که در زندگی روزمره تجربه میکنیم .در کنار
ساختمان دادههای ساده و معمولی فوق کالسهای پیشرفته تری برای کار در مباحثی همچون شبکه ،چند نخی
ConcurrentLinkedDequeو … نیز وجود دارند .به صورت کلی یک صف صرف نظر از ساختمان داده داخلی آن و الگوریتم ورود
Queueاز طریق مسیر java.util.Queueقابل دسترسی است و متدهای زیر را تعریف میکند .کالسهایی که از این کالس ارث
بری داشته باشند موظف هستند این متدها را پیاده سازی کنند :متدهای مربوط به مفهوم صف:
کاربرد متد
یک عنصر جدید به صف اضافه میکند .اگر قادر به این کار نباشد یک خطا پرتاب میکند. )add(Object o
یک عنصر جدید به صف اضافه میکند اگر قادر به این کار نباشد تنها falseبر میگرداند. )offer(Object o
عنصر سر را بر میگرداند و آن را از صف حذف میکند ،اگر صف خالی باشد nullبر میگرداند. )(poll
کاربرد متد
اگر تمام اعضای کالکشن cدر صف فعلی وجود داشته باشند trueبر میگرداند. )containsAll(Collection c
اشتراک صف فعلی را با کالکشن دیگر محاسبه میکند و سایر اعضا را حذف میکند. )retainAll(Collection c
در مثال زیر یک صف ساده ایجاد میکنیم ،عناصری به آن اضافه میشوند و سپس تک تک عناصر را از صف خارج میکنیم.
;package myfirstprogram
;import java.util.Queue
;import java.util.LinkedList
;)q.add(1
;)q.add(8
;)q.add(3
;)System.out.println(q
;))(System.out.println(q.poll
;)System.out.println(q
;))(System.out.println(q.poll
;)System.out.println(q
;))(System.out.println(q.poll
;)System.out.println(q
}
}
][1, 8, 3
1
][8, 3
8
][3
3
][
در کد باال یک Queueایجاد کردیم ،چون Queueتنها یک interfaceاست برای ساخت شیء جدید باید از یکی از زیر کالسهای
پیاده سازی شده آن استفاده کنیم ،در این مثال از LinkedListاستفاده کردیم ،با استفاده از متد )( addعناصر 0 ،3و 1را به
صف اضافه کرده و سپس کل صف را چاپ نمودیم .در ادامه با استفاده متد )( pollعنصر سر صف را حذف و چاپ کرده و پس
از آن صف باقی مانده را نیز چاپ میکنیم ،مشاهده میکنیم عناصر با همین ترتیبی که وارد صف شدهاند از صف نیز خارج میشود
HashMap
قبال با مفهوم Mapبه عنوان وسیله ای برای نگه داری زوجهای کلید-مقدار آشنا شدیم ،کالس HashMapزیر کالس AbstractMap
است و از الگوریتم درهم سازی برای نگه داری زوجها نگه داری میکند .مهمترین مزیت HashMapاین است که دسترسی به کلیدها
در زمان بسیار کوتاهی صورت میگیرد و با داشتن کلید به سرعت میتوانیم مقدار را به دست بیاوریم .از HashMapمیتوان برای
ساخت جداولی همچون دفترچه تلفن ،لیست نمرات و غیره استفاده کرد.به عالوه در بسیاری از کاربردهای هوش مصنوعی از
HashMapبرای شناسایی گرههای تکراری در جست و جوهای پیشرفته استفاده میشود .در HashMapمقدار nullهم به عنوان
1۱۵ مبانی زبان جاوا
کلید و هم به عنوان مقدار مجاز است ولی حداکثر یک کلید با مقدار nullمیتواند در آن وجود داشته باشد .کالس HashMapاز
طریق مسیر java.util.HashMapقابل دستیابی است .برای ساخت شیء جدید از کالس HashMapباید از یکی از سازندههای
)(HashMap
)HashMap(int capacity
یک HashMapجدید با جدول نگه دارنده ای با اندازه capacityایجاد میکند ،البته هر زمان که الزم باشد جدول نگه دارنده به
مشابه سازنده قبلی است با این تفاوت که پارامتر loadFactorتعیین میکند که چه زمان اندازه جدول نگه دارنده باید افزایش
یابد.
)HashMap(Map mp
یک HashMapجدید ایجاد میکند و اعضای mpرا به آن اضافه میکند .متدهای مهم HashMapدر جدول زیر آمدهاند:
توضیح متد
بررسی میکند که شی مورد نظر در بخش کلیدها قرار دارد یا خیر؟ )containsKey(Object key
بررسی میکند که شی مورد نظر رد بخش مقادیر قرار دارد یا خیر؟ )containsValue(Object value
کلید مورد نظر و مقدار متناظر با آن را از مجموعه حذف میکند. )remove(Object key
در مثال زیر یک دفترچه تلفن ساده طراحی میکنیم که کلید نام افراد و مقدار شماره آنهاست ،هدف آن است که با داشتن نام
;package myfirstprogram
;import java.util.HashMap
;)"myHashMap.put("Jenny", "0916532365
;)"myHashMap.put("Peter", "0912534689
;)"myHashMap.put("Mary Jane", "09152136458
;)"myHashMap.put("Azhar", "09132536489
;))"System.out.println(myHashMap.get("Jenny
}
}
0916532365
در کد باال ابتدا یک سری داده با استفاده از متد )( putبه HashMapاضافه میکنیم ،کلید نام افراد و مقدار شماره آنهاست .در
ادامه با استفاده از متد )( getشماره شخصی با نام Jennyرا از مجموعه استخراج کرده و چاپ میکنیم .می دانیم که در ساختار
HashMapکلید منحصر به فرد است و کلید تکراری وجود ندارد ولی در یک دفترچه تلفن است ممکن است برای یک نفر چندین
شماره ثبت کرده باشیم ،برای اینکه بتوانیم به یک کلید چندین مقدار نسبت دهیم باید از راهکاری ابتکاری استفاده کنیم .برای این
منظور میتوانیم مقدار را به صورت یک کالکشن در نظر بگیریم .در ادامه با این روش آشنا میشویم .
1۱۳ مبانی زبان جاوا
][09152136458, 0916532365
در کد باال از HashMapبه شیوه ای استفاده کردیم که کلید در آن از نوع Stringو مقدار در آن TreeSetاست لذا مقدار در آن
میتواند شامل چندین عضو باشد مهمترین قسمت کد باال متد phoneNumberاست .در ابتدای این متد با استفاده از یک if
مشخص میکنیم که آیا قبال مقداری برای کلید nameنسبت داده شد است؟ اگر خروجی متد )( getبرابر با nullباشد یعنی
قبال به این کلید ) (nameهیچ مقداری نسبت داده نشده است لذا یک لیست خالی از جنس TreeSetایجاد میکنیم ،در غیر
این صورت (کد داخل بخش ،)elseلیست نمراتی که قبال به کلید ) (nameنسبت داده شده بود را استخراج میکنیم .بعد از
بررسی باال میتوانیم شماره جدید را با استفاده از متد )( addبه لیست اضافه کنیم (می دانیم که TreeSetمقدار تکراری نگه
داری نمیکند و به عالوه اعضا در آن به صورت مرتب نگه داری میشوند) ،پس از آن با استفاده از متد )( putلیست جدید را به
کلید ) (nameنسبت میدهیم .همانطور که در خروجی میکنید هنگامی که عبارت ” “Jennyرا به عنوان کلید myHashMapبه
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 513
در این مثال.) چاپ میشودTreeSet کار میبریم خروجی به صورت یک لیست دو عنصری چاپ میشود (در حقیقت محتوای یک
package myfirstprogram;
import java.util.Map;
import java.util.Set;
import java.util.HashMap;
myHashMap.put("A", "10");
myHashMap.put("B", "20");
myHashMap.put("C", "30");
myHashMap.put("D", "40");
myHashMap.put("E", "50");
//containsKey
System.out.println(myHashMap.containsKey("A"));
System.out.println(myHashMap.containsKey("10"));
//containsValue
System.out.println(myHashMap.containsValue("A"));
System.out.println(myHashMap.containsValue("10"));
true
false
false
true
D : 40
E : 50
A : 10
B : 20
C : 30
سپس. زوجهای کلید و مقداری را در آن درج کردیمput() جدید ایجاد کردیم و با استفاده از متدHashMap در کد باال ابتدا یک
وجودA میبینیم که کلید، این متد وجود یا عدم وجود کلیدها را بررسی میکند، را مورد بررسی قرار دادیمcontainsKey() متد
این متد وجود یا عدم وجود مقدار، را مورد بررسی قرار دادیمcontainsValue() سپس از آن متد. وجود ندارد33 دارد ولی کلید
در33( وجود دارد33 در بخش کلیدها وجود داشت) ولی مقدارA( وجود نداردA میبینیم که مقدار،(و نه کلید) را بررسی میکند
1۱۱ مبانی زبان جاوا
بخش کلیدها وجود نداشت) .پس از آن با استفاده از متد )( entrySetتمام زوجهای کلید-مقدار مجموعه را در یک Setبا
اعضایی از نوع Map.Entryریختیم .در داخل یک حلقه forهر آیتم از allValueرا در متغیر xاستخراج کرده سپس با متد
)( getKeyکلید و با متد )( getValueمقدار متناظر با آن را به دست آورده و چاپ کردیم.
TreeMap
کالس TreeMapزیر کالس AbstractMapاست و مفهوم Mapرا پیاده سازی میکند ،قبال با مفهوم Mapآشنا شدیم ،کالس
TreeMapاز درخت موازنه Red-Blackبرای نگه داری زوج کلید-مقدار استفاده میکند و درخت مربوطه از روی کلیدها ساخته
میشود ،برای خالف HashMapکه نظم خاصی را برای کلیدها حفظ نمیکند در TreeMapکلیدها به صورت پیش فرض بر اساس
ترتیب الفبایی نگه داری میشوند .عملیات درج ،حذف و جست و جو در TreeMapبسیار سریع است و این ویژگی آن باعث
میشود به عنوان یک ابزار بهینه سازی از آن استفاده شود .کالس TreeMapاز طریق مسیر java.util.TreeMapقابل دستیابی
است .برای ساخت یک شیء جدید از TreeMapمیتوانیم از یکی از سازندههای زیر استفاده کنیم:
)(TreeMap
)TreeMap(Comparator cmp
اگر بخواهیم کلیدها بر اساس یک ترتیب اختصاصی نگه داری شوند میتوانیم برای اینکار یک Comparatorایجاد کنیم و آن را
)TreeMap(Collection c
این سازنده یک TreeMapجدید ایجاد میکند و اعضای کالکشن cرا به آن اضافه میکند.
)TreeMap(SortedMap sm
مشابه سازنده قبلی است با این تفاوت که در اینجا آیتمها با همان ترتیب smدر TreeMapنگه داری میشوند .متدهای مهم
کاربرد متد
یک زوج کلید-مقدار که کلید آن بزرگتر یا مساوی با keyباشد بر میگرداند. )ceilingEntry(Object key
بررسی میکند که کلید مورد نظر وجود دارد یا خیره؟ )containsKey(Object key
بررسی میکند که مقدار مورد نظر وجود دارد یا خیر؟ )containsValue(Object value
یک زوج کلید-مقدار بر میگرداند که در آن کلید کوچکتر یا مساوی با key )Map.Entry floorKey(Object key
باشد.
یک زیر مجموعه به صورت SortedMapبر میگرداند که در آن کلیدها از )headMap(Object toKey
toKeyکوچکتر هستند.
1۱1 مبانی زبان جاوا
زیر مجموعه ای را بر میگرداند که در آن کلیدها بزرگتر یا مساوی fromkey )SortedMap tailMap(Object fromKey
هستند.
;package myfirstprogram
;import java.util.Map
;import java.util.TreeMap
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 510
treemap.put(2, "A");
treemap.put(9, "B");
treemap.put(3, "A");
treemap.put(7, "D");
treemap.put(7, "X");
treemap.put(12, "C");
System.out.println(treemap);
System.out.println(treemap);
System.out.println(treemap.get(3));
System.out.println(treemap.keySet());
، ایجاد کرده و به صورت نامنظم دادههایی را به آن اضافه کرده و سپس آن را چاپ میکنیمTreeMap در مثال باال ابتدا یک
به عالوه چون کلیدها منحصر به فرد است برای،مشاهده میکنیم که مجموعه به صورت مرتب (بر اساس کلیدها) چاپ میشود
همچنین میبینیم که مقادیر میتوانند تکراری. (آخرین مقداری که برای این کلید درج شد) نگه داری میشودX فقط مقدار1 کلید
مقدار را حذف و چاپ میکنیم و بعد از آن کل مجموعه را- سپس اولین زوج کلید.) استA برابر با1 و5 باشند (مقادیر کلیدهای
1۱۹ مبانی زبان جاوا
مجددا چاپ میکنیم .مقدار متناظر با کلید 1را چاپ میکنیم .مجموعه کل کلیدها را با متد )( keySetبه دست آورده و چاپ
میکنیم .در ادامه یک بار با کلید 1که جز کلیدهای مجموعه است و یک بار با کلید 1که جز کلیدهای مجموعه نیست متدهای
)( floorKeyو )( ceilingKeyو )( lowerKeyو )( higherKeyرا مورد بررسی قرار میدهیم.
TreeSet
کالس TreeSetزیر کالس AbstractSetاست و مفهوم Setیعنی یک مجموعه بدون تکرار را پیاده سازی میکند ،قبال با
مفهوم Setآشنا شدیم ،کالس TreeSetاز ساختمان داده درخت موازنه برای نگه داری اعضای مجموعه استفاده میکند ،لذا
اعضای این مجموعه به صورت مرتب نگه داری میشوند و عملیات درج ،حذف ،جست و جو در زمان کوتاهی (زمان لگاریتمی)
صورت میپذیرد.
در حقیقت TreeSetاز TreeMapاستفاده میکند و کالس TreeMapبا استفاده از ساختمان داده Red-Black Treeپیاده
اشیای داخل TreeSetبه صورت پیش فرض بر اساس ترتیب الفبایی مرتب هستند مگر آنکه در سازنده آن صریحا از یک
همیشه مجموعه مورد نظر مرتب است و برای مرتب سازی نیاز به استفاده از الگوریتمهای sortنداریم.
عملیات درج ،حذف و جست و جو همگی با سرعت بسیار باالیی اجرا میشوند.
به دلیل بهینه بودن TreeSetاز آن در الگوریتمهای پیشرفته ای همچون الگوریتمهای مسیر یابی استفاده میشود.از طریق مسیر
java.util.TreeSetمیتوانیم به این کالس دسترسی داشته باشیم.برای ساخت شیء جدید از TreeSetمیتوانیم از یکی از
)(TreeSet
)TreeSet(Collection c
)TreeSet(Comparator cmp
)TreeSet(SortedSet ss
یک TreeSetجدید ایجاد کرده و اعضای ssرا به آن اضافه میکند به عالوه ترتیب اعضا را نیز به همان شکل قبلی نگه
کاربرد متد
میکند.
خواهد بود.
خواهد بود.
11۵ مبانی زبان جاوا
کنیم.
مجموعه را بر میگرداند.
خواهد بود.
مانند متد قبلی است با این تفاوت )NavigableSet headSet(Object to,boolean include
میکند.
قرار میدهد.
را بر میگرداند.
میکند.
یک زیر مجموعه که اعضای آن از )NavigableSet subSet(Object from,boolean fi,Object to,boolean ti
fromبزرگتر و از toکوچکتر
باشند بر میگرداند.پارامترهای
خیر؟
11۳ مبانی زبان جاوا
to مساوی و از-بزرگترfrom
.باشند
بزرگتر مساوی؟
ساده ایجاد میکنیم و چند متد بسیار مهم آن راTreeSet در مثال زیر یک. بیشتر آشنا میشویمTreeSet در ادامه با چند مثال با
package myfirstprogram;
import java.util.TreeSet;
treeset.add(5);
treeset.add(1);
treeset.add(4);
treeset.add(9);
treeset.add(1);
treeset.add(6);
treeset.add(5);
System.out.println(treeset);
//higher
System.out.println(">5 :" + treeset.higher(5));
System.out.println(">8 :" + treeset.higher(8));
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 513
//ceiling
;))System.out.println(">=5 :" + treeset.ceiling(5
;))System.out.println(">=8 :" + treeset.ceiling(8
//lower
;))System.out.println("<5 :" + treeset.lower(5
;))System.out.println("<8 :" + treeset.lower(8
//floor
;))System.out.println("<=5 :" + treeset.floor(5
;))System.out.println("<=8 :" + treeset.floor(8
}
}
][1, 4, 5, 6, 9
1
9
>5 :6
>8 :9
>=5 :5
>=8 :9
<5 :4
<8 :6
<=5 :5
<=8 :6
در کد باال ابتدا یک TreeSetایجاد میکنیم و سپس اعدادی را با استفاده از متد addبه آن اضافه میکنیم و سپس مجموعه را
چاپ میکنیم مشاهده میکنیم که مجموعه دارای عضو تکراری نیست و به صورت مرتب نگه داری میشود .پس از آن با استفاده
از متدهای firstو lastاعضای ابتدایی ( کوچکترین) و انتهایی (بزرگترین) مجموعه را چاپ میکنیم .سپس متد higher
را مورد بررسی قرار میدهیم ،مشاهده میکنیم که این متد عضوی را بر میگرداند که حتما از شی مورد نظر بزرگتر باشد .سپس
متد )( ceilingرا مورد بررسی قرار میدهیم ،مشاهده میکنیم که این متد عضوی را بر میگرداند که بزرگتر یا مساوی با شی
مورد نظر باشد .سپس متد )( lowerرا مورد بررسی قرار میدهیم ،مشاهده میکنیم که این متد عضوی را بر میگرداند که حتما
از شی مورد نظر کوچکتر باشد .سپس متد )( floorرا مورد بررسی قرار میدهیم ،مشاهده میکنیم که این متد عضوی را بر
;package myfirstprogram
;import java.util.TreeSet
;)treeset.add(5
;)treeset.add(1
11۱ مبانی زبان جاوا
;)treeset.add(4
;)treeset.add(9
;)treeset.add(8
;)treeset.add(6
;)treeset.add(5
;)System.out.println(treeset
;))System.out.println(treeset.subSet(4, 8
;))(System.out.println(treeset.pollFirst
;))(System.out.println(treeset.pollLast
;)System.out.println(treeset
;))(System.out.println(treeset.descendingSet
}
}
در کد باال مشابه کد قبلی یک TreeSetایجاد میکنیم و سپس آن را چاپ میکنیم ،سپس متد subSetرا با پارامترهای 3و 0
فراخوانی میکنیم مشاهده میکنیم که اعضای زیر مجموعه مورد نظر بزرگتر مساوی 3و کوچکتر از 0هستند .سپس عنصر
ابتدایی را حذف و چاپ میکنیم .سپس عنصر انتهایی را حذف و چاپ میکنیم .مجددا کل مجموعه را چاپ میکنیم .سپس با
Stack
Stackزیر کالس Vectorاست و ساختمان داده ای با همین نام را پیاده سازی میکند ،در حقیقت Stackیک صف LIFO
محسوب میشود ،به ساختمان داده Stackپشته نیز گفته میشود .عبارت LIFOمخفف Last In First Outمیباشد و
صف LIFOصفی است که عضوی که آخر وارد میشود اول خارج میشود Stack.کاربردهای زیادی در برنامه نویسی دارد که از
فرم غیر بازگشتی جست و جوی اول عمق)(Depth First Search
یکی از موارد روزمره ای که با آن رو به رو میشویم حافظه مرورگرها در مورد urlهاست ،هنگامی که دکمه بازگشت را میزنیم
همیشه به آخرین مورد قبلی باز میگردیم.کالس Stackاز طریق مسیر java.util.Stackقابل دستیابی است.برای ساخت
)(Stack
متدهای مهم Stackدر جدول زیر آمدهاند ولی مهمترین آنها push ،peekو popهستند.
کاربرد متد
یک عنصر در اندیس مورد نظر درج میکند. )add(int index,Object o
عنصر باالی پشته (آخرین عنصر) را بر میگرداند ولی آن را از پشته حذف نمیکند. )(peek
اندیس یک شیء را بر میگرداند (در این حالت شروع اندیس از 3تعبیر میشود) )search(Object o
;package myfirstprogram
;import java.util.Stack
;)"stack.push("URL_1
;)"stack.push("URL_2
;)"stack.push("URL_3
;)"stack.push("URL_4
))(while (!stack.empty
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 510
{
;))(System.out.println(stack.pop
}
}
}
URL_4
URL_3
URL_2
URL_1
مثال باال عملکرد یک مرورگر را به صورت خیلی ساده شبیه سازی میکند ،ابتدا URL_1و سپس URL_2و … را مشاهده میکنیم.
عمل مشاهده را با عمل pushشبیه سازی میکنیم .سپس عمل فشردن دکمه بازگشت را شبیه سازی میکنیم ،هر بار که دکمه
بازگشت زده میشود مرورگر باید آخر ین صفحه مشاهده شده قبلی را نمایش دهد ،به عنوان مثال هنگامی که در حال مشاهده
URL_4هستیم اگر کاربر دکمه بازگشت را فشار دهد مرورگر باید URL_3را نمایش دهد ،اگر کاربر در حال مشاهده URL_3باشد
با زدن دکمه بازگشت مروگر باید URL_2را نمایش دهد.این عمل تا زمانی قابل انجام است که آدرسی برای نمایش وجود داشته
باشد ،به عبارتی پشته خالی نباشد ( emptyنباشد)در کد باال هر بار که متد )( popفراخوانی میشود عنصر باالی پشته حذف
میشود .البته پیاده سازی عملکرد دکمه بازگشت در مرورگر کمی پیچیده تر است و مثال باال یک نمونه بسیار بسیار ساده از این
عمل میباشد.
PriorityQueue
کالس PriorityQueueیک صف اولویت را با استفاده از ساختمان داده Min-Heapپیاده سازی میکند ،لذا در کاربردهایی که
نیاز داریم به صورت پیوسته به عنصر کمینه دستیابی داشته باشیم مفید واقع میشود ،برای نمونه میتوان به پیاده سازی الگوریتم
مرتب سازی Heap Sortاشاره کرد .به صورت پیش فرض این کالس از ترتیب طبیعی (الفبایی) پیروی میکند مگر آنکه در سازنده
آن از یک Comparatorاختصاصی برای تعریف نوع خاصی از ترتیب استفاده کنیم .به دلیل استفاده از ساختار Min-Heapبیشتر
عملیات این کالس مانند poll ،offerو … در زمانی لگاریتمی یا حتی ثابت انجام میشوند ،به عبارت دیگر این عملیات بسیار
سریع انجام میشوند .این کالس از طریق مسیر java.util.PriorityQueueقابل دستیابی است.
برای ساخت شیء جدید از این کالس میتوانیم از یکی از سازندههای زیر استفاده کنیم:
)(PriorityQueue
)PriorityQueue(Collection c
یک صف اولویت جدید ایجاد میکند و اعضای کالکشن cرا به آن اضافه میکند .
)PriorityQueue(int capacity
یک صف اولویت جدید ایجاد میکند ،چون کالس PriorityQueueبه صورت Min Heapپیاده سازی میشود برای ابتدای کار
یک آرایه برای آن در نظر گرفته میشود که پارامتر capacityاندازه این آرایه را مشخص میکند البته در عین کار ممکن است
مشابه سازنده قبلی است با این تفاوت که در اینجا برای مقایسه اشیای داخل صف اولویت از یک Comparatorاختصاصی
استفاده میکنیم.
)PriorityQueue(PriorityQueue other
یک صف اولویت جدید ایجاد میکند و اعضای یک صف اولویت دیگر را به آن اضافه میکند.
)PriorityQueue(SortedSet ss
یک صف اولویت جدید ایجاد میکند و اعضای یک مجموعه مرتب را به آن اضافه میکند .متدهای مهم کالس PriorityQueue
کاربرد متد
یک عنصر جدید به صف اولویت اضافه میکند ،این متد بسیار سریع است و در زمانی لگاریتمی انجام )add(Object o
میشود.
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 513
اگر از یک Comparatorاختصاصی استفاده کرده باشیم آن را بر میگرداند اما اگر از ترتیب طبیعی )(comparator
بررسی میکند که یک شیء مورد نظر در این مجموعه قرار دارد یا خیر؟ این متد در زمانی خطی انجام contains(Object
)o
میشود و چندان بهینه نیست.
یک Iteratorاز روی مجموعه بر میگرداند که دارای نظ م خاصی نیست و فقط اعضای مجموعه را )(iterator
پیمایش میکند.
عنصر سر ( کوچکترین عضو) صف را بر میگرداند ولی آن را حذف نمیکند ،اگر صف خالی باشد خروجی )(peek
این متد nullخ واهد بود ،این متد در زمان ثابت اجرا میشود و فوق العاده سریع است.
عنصر سر ( کوچکترین عضو) صف را حذف میکند و آن را بر میگرداند ،اگر صف خالی باشد خروجی این )(poll
متد nullخواهد بود ،این متد در زمان لگاریتمی انجام میشود و سریع است.
یک شیء خاص را در زمان خطی از مجموعه حذف میکند ،این متد چندان بهینه نیست. remove(Object
)o
;package myfirstprogram
;import java.util.PriorityQueue
{
)public static void main(String[] args
{
;)(PriorityQueue priorityqueue = new PriorityQueue
;)priorityqueue.add(1
;)priorityqueue.add(10
;)priorityqueue.add(2
;)priorityqueue.add(9
;)priorityqueue.add(5
;)System.out.println(priorityqueue
;))(System.out.println(priorityqueue.peek
;)System.out.println(priorityqueue
;))(System.out.println(priorityqueue.poll
;)System.out.println(priorityqueue
}
}
در کد باال ابتدا یک PriorityQueueایجاد میکنیم و سپس اعضایی را به آن اضافه میکنیم ،سپس آن را چاپ میکنیم ،مشاهده
میکنیم که اعضای داخل آن دارای نظم قابل تشخیصی نیستند فقط عنصر ابتدای لیست کمینه است .سپس با استفاده از متد
)( peekکوچکترین عنصر را به دست آورده و چاپ میکنیم و سپس لیست را چاپ میکنیم .مشاهده میکنیم که استفاده از متد
)( peekتغییری در صف اولویت ایجاد نمیکند .سپس با استفاده از متد )( pollکوچکترین عنصر را به دست آورده ،آن را چاپ
میکنیم و بعد از آن کل لیست را چاپ میکنیم .مشاهده میکنیم که متد )( pollعنصر کمینه را از لیست حذف کرده است و در
لیست جدید مجددا کوچکترین عنصر در ابتدای لیست قرار دارد .در PriorityQueueعنصر کمینه همیشه در ابتدای لیست قرار
دارد .
در این مثال به سادگی الگوریتم مرتب سازی Heap Sortرا با استفاده از PriorityQueueپیاده سازی میکنیم .
;package myfirstprogram
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 515
import java.util.LinkedList;
import java.util.PriorityQueue;
priorityqueue.add(1);
priorityqueue.add(10);
priorityqueue.add(2);
priorityqueue.add(9);
priorityqueue.add(5);
priorityqueue.add(18);
while (!priorityqueue.isEmpty())
{
result.add(priorityqueue.poll());
}
System.out.println(result);
}
}
PriorityQueue سپس اعضای نامرتبی را به، خالی ایجاد میکنیمLinkedList و یکPriorityQueue در کد باال ابتدا یک
خالی نشده است عنصر کمینه آن را حذفPriorityQueue تا زمانی کهwhile در ادامه در داخل یک حلقه. اضافه میکنیم
اضافه میکنیم لذا در هر مرحله کوچکترین عضو از صف اولویت خارج شده و به لیست پیوندی اضافهLinkedList میکنیم و به
. الگوریتم مرتب سازی فوق بسیار سریع است.میشود و در نتیجه لیست پیوندی در نهایت مرتب خواهد بود
ترتیب معکوس
اگر بخواهیم صف اولویت به صورت معکوس نگه داری شود یعنی عنصر ابتدای لیست بزرگترین آیتم آن باشد (به عبارتی به
مثال قبل را با این نکته بازنویسی میکنیم. عنصر بیشینه را بر میگرداندpoll() وpeek() در این صورت متدهای.استفاده کنیم
package myfirstprogram;
import java.util.Collections;
import java.util.LinkedList;
11۳ مبانی زبان جاوا
import java.util.PriorityQueue;
priorityqueue.add(1);
priorityqueue.add(10);
priorityqueue.add(2);
priorityqueue.add(9);
priorityqueue.add(5);
priorityqueue.add(18);
while (!priorityqueue.isEmpty())
{
result.add(priorityqueue.poll());
}
System.out.println(result);
}
}
[18, 10, 9, 5, 2, 1]
Hashtable
ارث بریSerializable وClonable وMap هایinterface است و ازDictionary زیر کالسHashtable کالس
همانطور که از نام آن پیداست این کالس،مقدار به کار میرود- این کالس نیز برای نگه داری زوج کلیدHashMap همانند.میکند
برخی از تفاوتهای.مقدار استفاده میکند- از الگوریتم درهم سازی برای نگه داری زوجهای کلیدHashMap نیز همچون کالس
. چنین محدودیتی وجود نداردHashMap نیستیم ولی درnull مجاز به استفاده از کلید یا مقدارHashtable در
در برنامههای پیشرفته چند ریسمانی بهتر است از ConcurrentHashMapبه جای Hashtableاستفاده شود .کالس Hashtable
از طریق مسیر java.util.Hashtableقابل دستیابی است .برای ساخت یک شیء جدید از این کالس میتوانیم از یکی از
)(Hashtable
یک Hashtableخالی جدید با ظرفیت اولیه پیش فرض ( 33درایه) و load factor=0.75ایجاد میکند.
)Hashtable(int capacity
مشابه سازنده قبلی است با این تفاوت که در اینجا خودمان اندازه جدول اولیه را تعریف میکنیم.
یک Hashtableخالی ایجاد میکند که اندازه جدول و loadFactorآن را خودمان تعیین میکنیم (پارامتر loadFactor
)Hashtable(Map mp
یک Hashtableجدید ایجاد میکند و اعضای mpرا به آن اضافه میکند .متدهای مهم این کالس در جدول زیر آمدهاند:
کاربرد متد
.( و مقدار متناظر با آن را از مجموعه پاک میکندkey) کلید مورد نظر remove(Object key)
package myfirstprogram;
import java.util.Hashtable;
hashtable.put(1, "one");
hashtable.put(2, "two");
hashtable.put(3, "three");
System.out.println(hashtable);
System.out.println(hashtable.get(2));
System.out.println(hashtable.keySet());
System.out.println(hashtable.values());
}
}
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 511
سپس کل. مقداری اطالعات به آن اضافه میکنیمput() جدید ایجاد میکنیم و با استفاده از متدHashtable در کد باال ابتدا یک
مجموعه کلیدها و باkeySet() را چاپ کرده و سپس با استفاده از متد5 در ادامه مقدار متناظر با کلید.مجموعه را چاپ میکنیم
مربوطEnumeration برای به دست آوردنkeys() را ترجیح میدهید میتوانید از متدEnumeration اگر برای پیمایش اعضا
کد زیر کلیدها و مقدارها را. مربوط به مقادیر استفاده کنیدEnumeration برای به دست آوردنelements() به کلیدها و از متد
package myfirstprogram;
import java.util.Hashtable;
import java.util.Enumeration;
hashtable.put(1, "one");
hashtable.put(2, "two");
hashtable.put(3, "three");
System.out.println();
3 2 1
three two one
111 مبانی زبان جاوا
در داخل حلقه forابتدا یک Enumerationبه دست میآوریم ،سپس با متد )( hasMoreElementsبررسی میکنیم که عنصر
بعدی ای وجود دارد یا خیر؟ در صورت که عنصر دیگری وجود داشته باشد عنصر بعدی را با متد )( nextElementبه دست آورده
و آن را چاپ میکنیم.
BitSet
کالس BitSetکالسی است که آرایه ای از بیتها را شبیه سازی میکند و میتوان از آن در الگوریتمهای مختلفی مانند غربال
اراتستن ،بزرگترین زیر مجموعه مشترک و … استفاده کرد ،به عالوه این کالس عملگرهای بیتی همچون OR ،ANDو غیره را نیز
مهمترین ویژگی BitSetاین است که مصرف حافظه آن بهینه سازی شده است و برای کاربردهایی که در آن به تعداد زیادی عنصر
به صورت پیشفرض تمام خانههای BitSetصفر هستند .این کالس از طریق مسیر java.util.BitSetقابل دستیابی است.
برای استفاده از این کالس میتوانیم از یکی از سازندههای زیر استفاده کنیم.
)(BitSet
این کالس یک BitSetخالی ایجاد میکند و اندازه آن در طی زمان بر حسب نیاز افزایش مییابد.
)BitSet(int nbits
این کالس یک BitSetبا تعداد بیتهای مورد نیاز ما ایجاد میکند که البته در طول زمان ممکن است اندازه آن نیز افزایش یابد.
کاربرد متد
ابتدا بیتهای BitSetدیگر را معکوس کرده و سپس با BitSetفعلی AND )andNot(BitSet other
تمام بیتهای داخل یک باز خاص (از اندیس fromتا اندیس )toرا صفر )clear(int from,int to
میکند.
مشخص میکند که بیت یک اندیس خاص صفر ) (falseاست یا یک )get(int index
)(true
اگر BitSetفعلی با BitSetدیگر حداقل یک بیت (true) 3مشترک داشته )intersetcts(BitSet other
اندیس اولین بیت صفر بعد از اندیس fromرا بر میگرداند. )nexClearBit(int from
اندیس اولین بیت صفر قبل از اندیس fromرا بر میگرداند. )previousClearBit(int from
بیت موجود در اندیس indexرا بر اساس مقدار valueمقداری دهی )set(int index,boolean value
تمام بیتهای یک بازه مشخص را به مقدار valueتغییر میدهد. set(int from,int to,boolean
)value
متاسفانه کالس BitSetابزاری برای تبدیل یک رشته صفر و یک به BitSetرا ندارد و خودمان باید کد الزم برای این کار را به
در کد باال در داخل یک حلقه forبه ازای هر کاراکتری از رشته strکه 3باشد اندیس متناظر با آن در BitSetرا یک )(true
میکنیم.
متاسفانه کالس BitSetابزار مناسبی برای نمایش دودویی BitSetنیز در اختیار ما قرار نمیدهد و مجددا خودمان باید کد الزم
را بنویسیم ،کد زیر با داشتن تعداد بیتها ) (nbitsیک Stringاز روی بیتهای BitSetمیسازد و بر میگرداند .
منطق کد باال بسیار ساده است ،اگر بیت اندیس iدر BitSetیک باشد یک 3به انتهای رشته resultاضافه میکنیم در غیر
این صورت یک 3به انتهای رشته اضافه میکنیم .با کمک دو متد باال آمادهایم تا مثالی از کالس BitSetمشاهده کنیم .
;package myfirstprogram
;import java.util.BitSet
{
result += "1";
}
else
{
result += "0";
}
}
return result;
}
public static void main(String[] args)
{
int nbits = 6;
BitSet A = new BitSet(nbits);
BitSet B = new BitSet(nbits);
fromString(A, "110011");
fromString(B, "100111");
A.or(B); //A=A OR B
System.out.println("A :\t" + toString(A, nbits));
A.set(0); //A[0]=1
System.out.println("A :\t" + toString(A, nbits));
}
}
A : 110011
B : 100111
B : 011000
A : 111011
A : 011000
A : 111000
A : 111011
آن دو را مقدار دهیfromString() ایجاد کردیم و سپس با متدهای کمکیB وA خالی به نامBitSet در کد باال ابتدا دو
flip() را با کمک متدB 1 تا3 سپس بیتهای اندیس. چاپ کردیمtoString() کرده و برای اطمینان آنها را کمک متد کمی
سایر خطوط نیز مشابه هستند و همراه آنها در کد. کردیمOR را با بیتست دومA بیتستor معکوس و بعد با کمک متد
ArrayDeque
کالس ArrayDequeزیر کالس AbstractCollectionاست و مفهوم صف دو طرفه را با استفاده از ساختمان داده آرایه حلقوی
( )circular arrayپیاده سازی کرده است و کالسی فوق العاده سریع و بهینه است این کالس برای پیاده سازی صف دو طرفه به
جای لیست پیوندی از آرایه استفاده میکند و دارای مزایای زیر است:
اگر به عنوان صف LIFOیا همان پشته از آن استفاده شود از کالس Stackسریعتر خواهد بود.
میتوان به عنوان یک آرایه پویا (آرایه قابل رشد) به جای ArrayListهم از آن استفاده کرد.
در بعضی از کاربردها که نیاز به حذف گره میانی در عین پیمایش لیست داریم ممکن است LinkedListاز ArrayDequeبهینه
تر باشد.
این کالس از طریق مسیر java.util.ArrayDequeقابل دستیابی است.برای ساخت شیء جدید از این کالس میتوانیم از یکی
)(ArrayDeque
)ArrayDeque(Collection c
یک صف دو طرفه جدید ایجاد میکند و اعضای کالکشن cرا به آن اضافه میکند .
)ArrayDeque(int numElements
به صورت پیش فرض ArrayDequeبا یک آرایه با اندازه 31شروع به کار میکند و در صورت نیاز اندازه آن افزایش مییابد ،با
استفاده از سازنده فوق میتوانیم آرایه اولیه ای با اندازه ای به غیر از 31به اندازه numElementsدر آن ایجاد کنیم که البته باز هم
اندازه آن در صورت نیاز افزایش خواهد یافت.متدهای مهم این کالس در جدول زیر آمدهاند:
کاربرد متد
11۳ مبانی زبان جاوا
بسیاری از متدهای فوق مشابه هم عمل میکنند و برنامه نویس باید طبق سلیقه خود یکی از آنها را انتخاب کند .
;package myfirstprogram
;import java.util.ArrayDeque
;)"fifo.add("A
11۱ مبانی زبان جاوا
;)"fifo.add("B
;)"fifo.add("C
;)"fifo.add("D
))(while (!fifo.isEmpty
{
;))(System.out.println(fifo.poll
}
}
}
A
B
C
D
درکد قبل از ArrayDequeبه عنوان صف FIFOاستفاده کردیم و مشاهده میکنید که شی ای که اول وارد صف اول هم از صف
خارج شده ،برای خروج اشیا از صف از یک حلقه whileاستفاده کردیم و تا زمانی که صف خالی نشد (متد )( isEmptyمقدار
trueبر نگرداند) عنصر ابتدای صف را با متد )( pollخارج کرده و چاپ نمودیم.
اگر قصد داشته باشیم از ArrayDequeبه عنوان پشته (صف )LIFOاستفاده کنیم بهتر است از متدهای )( pop() ،pushو
)( peekاستفاده کنیم ،دقت کنید که در این حالت متد )( peekعنصر باالی پشته را بر میگرداند ولی آن را حذف نمیکند و متد
;package myfirstprogram
;import java.util.ArrayDeque
;)"stack.push("A
;)"stack.push("B
;)"stack.push("C
;)"stack.push("D
))(while (!stack.isEmpty
{
;))(System.out.println(stack.peek
;))(System.out.println(stack.pop
}
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 501
}
}
D
D
C
C
B
B
A
A
همانطور که مشاهده میکنید این بارشی ای که آخر وارد شده اول خارج شده است ،همچنین مشاهده میکنید که خروجی
متدهای )( peekو )( popیکسان است .حلقه whileتا زمانی خالی شدن صف (بر قرار شد شرط )isEmptyاجرا میشود.
Properties
کالس Propertiesزیر کالس Hashtableاست و برای نگه داری جداولی به کار میرود که در آن کلید و مقدار هر دو از نوع
متنی هستند ،مهم ویژگی این کالس این است که به ما اجازه خواندن و نوشتن فایلهای تنظیمات ) (configuration filesو
دسترسی به تنظیمات سیستمی را میدهد .مهمترین متدهای این کالس متدهای )( loadو )( storeبرای خواندن و نوشتن
برای خواندن و نوشتن در فایل تنظیمات XMLهستند .این کالس توسط تنظیمات در فایل و loadFromXMLوstoreToXML
بسیاری از کالسهای دیگر برای ارائه اطالعات یا تغییر تنظیمات استفاده میشود.این کالس از مسیر java.util.Properties
قابل دستیابی است.برای ساخت یک شیء از این کالس باید از یکی از سازندههای زیر استفاده کنیم:
)(Properties
)(Properties
از روی یک Propertiesدیگر یک لیست اولیه ایجاد میکند .متدهای مهم این کالس در جدول زیر آمدهاند:
کاربرد متد
111 مبانی زبان جاوا
مانند متد قبلی است با این تفاوت که )getProperty(String key,String default
defauleرا بر میگرداند.
مینویسد.
مینویسد.
بارگذاری میکند.
میخواند.
XMLمیخواند.
Enumerationبر میگرداند.
میدهد.
.مینویسد
مانند متد قبل عمل میکند با این storeToXML(OutputStream out,String comments,String encoding)
.نیز هستیمencoding
.میگرداند
put() وget() همچونHashtable است عالوه بر متدهای قبلی از متدهای کالسHashtable چون کالس فوق زیر کالس
میتوانیم اطالعات مفیدی را در مورد سیستمی که از آن استفاده میکنیم به دستSystem.getProperties() با استفاده از
. کاربر و نام سیستم عامل را چاپ میکندhome مسیر، ساختار سیستم عامل، کد زیر مسیر جاوا،بیاوریم
package myfirstprogram;
import java.util.Properties;
System.out.println(myProperty.get("java.home"));
System.out.println(myProperty.get("os.arch"));
System.out.println(myProperty.get("user.home"));
System.out.println(myProperty.get("os.name"));
}
}
11۹ مبانی زبان جاوا
ذخیره در فایل
: (یا به عبارتی فایل تنظیمات) را در یک فایل ذخیره کنیمProperties در این مثال یاد میگیریم که چگونه یه فایل
package myfirstprogram;
import java.io.*;
import java.util.Properties;
myProperty.setProperty("username","root");
myProperty.setProperty("password","123456");
myProperty.setProperty("database","localhost");
myProperty.store(fileoutputstream,"Database Config!");
}
}
دادههایی را در آن مینویسیم و درsetProperty() خالی ایجاد میکنیم و سپس با استفاده از متدProperties در کد باال یک
: اگر فایل مورد نظر را باز کنید به صورت زیر خواهد بود. آن را در فایل مینویسیمstore() آخربه سادگی با استفاده از متد
#Database Config!
#Mon May 01 08:04:02 IRDT 2017
password=123456
database=localhost
username=root
.البته در فایل مورد نظر تاریخ نیز درج میشود که در این مثال آن را حذف کردیم
خواندن از فایل
. در این مثال قصد داریم همان فایل را بخوانیم و در خروجی چاپ کنیم، را در فایل نوشتیمProperties در مثال قبل یک
package myfirstprogram;
import java.io.*;
import java.util.Properties;
{
public static void main(String[] args) throws Exception
{
FileInputStream fileinputstream = new FileInputStream("D:/Sample.config");
Properties myProperty = new Properties();
myProperty.load(fileinputstream);
username :root
password :123456
database :localhost
خواندیم و مقادیر موردProperties محتوای فایل را در یکload() همانطور که مشاهده میکنید به سادگی با استفاده از متد
XMLذخیره در فایل
package myfirstprogram;
import java.io.*;
import java.util.Properties;
myProperty.setProperty("username","root");
myProperty.setProperty("password","123456");
myProperty.setProperty("database","localhost");
myProperty.storeToXML(fileoutputstream,"Database Config!!");
}
}
xml اگر فایل، هستیمxml به سادگی قادر به نوشتن تنظیمات در فایلstoreToXML() مشاهده میکنید که با استفاده از متد
: مورد نظر را باز کنید مشاهده میکنید که محتوای آن به صورت زیر است
1۹۵ مبانی زبان جاوا
XMLخواندن از فایل
. قبلی خوانده و نتایج را در خروجی چاپ میکنیمXML در این مثال از فایل
package myfirstprogram;
import java.io.*;
import java.util.Properties;
myProperty.loadFromXML(fileinputstream);
username :root
password :123456
database :localhost
. هستیمxml به سادگی قادر به خواندن از فایلloadFromXML() همانطور که مشاهده میکنید با استفاده از متد
(Generics)جنریک ها
متدها یا رابطهایی هستند که بسته به نوع داده ای که به آنها اختصاص داده میشود رفتارشان را سازگار، کالسها،جنریک ها
همچنین میتوان یک متد ایجاد کرد. به عنوان مثال میتوان یک متد جنریک تعریف کرد که هر نوع داده ای را قبول کند.میکنند
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 565
که بسته به نوع دریافتی ،مقادیری از انواع داده ای مانند double ،intیا Stringرا نشان دهد .اگر از جنریک ها استفاده نکنید
باید چند متد و یا حتی چندین متد سربارگذاری شده برای نمایش هر نوع ممکن ایجاد کنید.
با استفاده از جنریک ها میتوان متد جنریکی ایجاد کرد که هر نوع داده ای را قبول کند.
متدهای جنریک را در درسهای آینده توضیح خواهیم داد .حتما این سؤال را از خودتان میپرسید که چرا نباید از نوع آبجکت که
هر نوع داده ای را قبول میکند استفاده کنیم؟ در آینده مشاهده میکنید که با استفاده از جنریک ها نیاز به عمل ( castتبدیل
صریح) ندارید .درباره جنریک ها در درسهای بعد مطالب بیشتری توضیح میدهیم.
متدهای جنریک
اگر بخواهید چندین متد با عملکرد مشابه ایجاد کنید و فقط تفاوت آنها در نوع داده ای باشد که قبول میکنند (مثال یکی نوع
intو دیگری نوع doubleرا قبول کند) میتوان از متدهای جنریک برای صرفه جویی در کدنویسی استفاده کرد .ساختار عمومی
مشاهده میکنید که قبل از نوع برگشتی متد یک نوع در داخل دو عالمت بزرگتر و کوچکتر آمده است )> (<typeکه همه انواع
در جاوا میتوانند جایگزین آن شوند .برنامه زیر مثالی از نحوه استفاده از متد جنریک میباشد:
;package myfirstprogram
;)Show(intValue
;)Show(doubleValue
;)Show(stringValue
;)Show(boolValue
}
}
5
10.54
Hello
true
یک متد جنریک ایجاد کردهایم که هر نوع داده ای راقبول کرده و مقادیر آنها را نمایش میدهد (خطوط .)1-0سپس دادههای
مختلفی با وظایف یکسان به آن ارسال میکنیم .متد نیز نوع Xرا بسته به نوع داده ای که به عنوان آرگومان ارسال شده است تغییر
میدهد .به عنوان مثال وقتی یک داده از نوع intارسال میکنیم ،همه مکانهایی که Xدر آنها وجود دارد به intتبدیل میشوند
به یک نکته در مورد استفاده از متدهای جنریک توجه کنید و آن این است که شما نمیتوانید در داخل کدهای مربوط به متد
محاسبات انجام دهید مثال دو عدد را با هم جمع کنید چون کمپایلر نمیتواند نوع واقعی عملوندها را تشخیص دهد ،ولی به سادگی
میتوان مقادیر را در داخل متد نشان داد چون کمپایلر هر نوع داده ای را که توسط متد )( System.out.printlnاستفاده
شما میتوانید چندین نوع خاص را برای متد جنریک ارسال کنید ،برای این کار هر نوع را به وسیله کاما از دیگری جدا کنید.
به مثال زیر که در آن دو مقدار مختلف به متد ارسال شده است توجه کنید:
;)Show(5, true
مشاهده میکنید که Xبا نوع intو Yبا نوع boolجایگزین میشود .این نکته را نیز یادآور شویم که شما میتوانید دو آرگومان
;)Show(5, 10
کالس جنریک
تعریف یک کالس جنریک بسیار شبیه به تعریف یک متد جنریک است .کالس جنریک دارای یک عالمت بزرگتر و کوچک تر و یک
نوع پارامتر خاص میباشد .برنامه زیر مثالی از یک کالس جنریک میباشد:
20 {
21 return someField;
22 }
23 }
24
25 public class MyFirstProgram
26 {
27 public static void main(String[] args)
28 {
29 GenericClass genericDouble = new GenericClass(30.50);
30 GenericClass genericString = new GenericClass("Hello World!");
31
32 System.out.println(MessageFormat.format("Double Value : {0}",
33 genericDouble.GetSomeProperty()));
34 System.out.println(MessageFormat.format("String Value : {0}",
35 genericString.GetSomeProperty()));
36 }
37 }
-35 ) و یک سازنده (خطوط33-55 یک خاصیت (خطوط،)1 ) که دارای یک فیلد (خط1-51 در مثال باال یک کالس جنریک (خطوط
. در آنها قرار دارد بعدا توسط انواعی که مد نظر شما است جایگزین میشوندT تمام مکانهایی که ورودی.) است را ایجاد میکنیم6
مانند متدهای جنریک میتوانید.)<int>( یک نوع هم برای آن در نظر بگیرید،وقتی یک نمونه از کالس جنریک تان ایجاد میکنید
. از چه نوعی هستند نمیتوانید مانند مثال زیر از آنها نمونه جدید ایجاد کنیدT3 وT2 ،T1 چون نمیدانید
. اما باید یک نوع برای پارامتر کالس پایه جنریک تعریف کنید،کالسهای غیر جنریک میتوانند از کالسهای جنریک ارث بری کنند
}
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 561
.یک کالس جنریک هم میتواند از یک کالس غیر جنریک ارث بری کند
List<T> برای ایجاد یک کلکسیون عمومی از کالس.می توان یک کلکسیون عمومی تعریف کرد که شامل هر نوع داده ای باشد
در نتیجه. باشدT می تواند مجموعه ای از اشیاء نوعList<T> . استفاده می شودjava.util.List مربوط به فضای نامی
و دیگرadd() ،remove() ،removeAll() دارای متدهایList<T> کالس. مجموعه ای از مقادیر صحیح استList<int>
. متدهایی است که می توانیم از آنها برای حذف و اضافه کردن عناصر استفاده کنیم
package myfirstprogram;
import java.util.List;
import java.util.ArrayList;
class Animal
{
public String Type;
animals.add(new Animal("Dog"));
animals.add(new Animal("Cat"));
animals.add(new Animal("Rat"));
Dog
Cat
Rat
نوع کلید وTkey . قرار دارد استفاده کنیدjava.util.HashMap; که در پکیجHashMap<TKey, TVal> می توانید از کالس
package myfirstprogram;
import java.util.HashMap;
class Animal
{
public String Type;
Dog
Cat
Rat
برای به دست. می باشدAnimal و مقادیری از نوع کالسString تعریف کرده ایم که دارای کلیدهایی از نوعHashMap یک
. که شامل همه آیتم های دیکشنری است استفاده کردvalues() می توان از متدHashMap آوردن مقدار آیتم های
Object Initializer
اگر به عنوان مثال چندین خاصیت. به شما اجازه می دهند خاصیت ها را در داخل کالس مقداردهی کنیدObject Initializer
استفادهobject initializer می توانید از،داشته باشید و نخواهید که یک سازنده را جهت مقداردهی به آنها تعریف کنید
package myfirstprogram;
class Sample
{
public int Property1;
public String Property2;
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 560
;sampleClass.Property1 = 100
;"sampleClass.Property2 = "Sample
;sampleClass.Property3 = true
}
}
همانطور که مشاهده می کنید ،الزم است که مقادیر را تک به تک به خاصیت ها اختصاص دهیم .با استفاده از object
;package myfirstprogram
class Sample
{
public int ;Property1
;public String Property2
;public boolean Property3
}
مشاهده می کنید که بعد از ایجاد یک شی از کالس به جای پرانتز از دو آکوالد ( }} ) استفاده کرده و سپس با لیست کردن خاصیت
ها مقادیری را که الزم داریم به آنها اختصاص می دهیم .به این نکته نیز توجه کنید که خواص به وسیله سمیکالن (;) از هم جدا
می شوند .هنگام استفاده از object initializersسازنده پیشفرض بدون پارامتر قبل از هر خاصیت مقداردهی شده فراخوانی
می شود .از آنجاییکه سازنده پیشفرض قبل از اختصاص مقادیر به خاصیت ها اجرا می شود ،می توانید مقادیری پیشفرضی به هر
یک از خواص اختصاص بدهید ،با این کار الزم نیست که حتما به همه خواص با استفاده از initializerمقدار اختصاص داده
شود .اگر یک سازنده غیر پیشفرض ) (non-default constructorبه کالس اضافه کنید باز هم باید یک سازنده بدون پارامتر
پیشفرض برای قدرت استفاده از object initializersوجود داشته باشد .می توان از object initializersتو در تو
1۹۹ مبانی زبان جاوا
هست را داراAge وName که دارای دو خاصیتAnimal مان یک خاصیت از نوعSample فرض کنید کالس.نیز استفاده نمود
: می باشد
package myfirstprogram;
class Animal
{
public String Name;
public int Age;
}
class Sample
{
public int Property1;
public String Property2;
public boolean Property3;
public Animal Property4;
}
( استفاده میgeneric) که در کلکسیون های عمومی، می باشندcollection initializers نوع دیگر از مقداردهنده ها
: شوند
package myfirstprogram;
import java.util.List;
import java.util.ArrayList;
import java.text.MessageFormat;
class Person
{
public String FirstName;
public Person(String f)
{
this.FirstName = f;
}
}
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 133
John
Jenny
Joe
فصل دوم
SWING
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 135
برنامه ارتباط برقرار کند.در روزهای اولیه دنیای کامپیوتر برنامهها مبتنی بر متن بودند ،بدین معنی که شما باید دستورات متنی
زیادی برای ایجاد یک برنامه مفید تایپ میکردید و این کار مستلزم حفظ کردن یک لیست طوالنی از دستورات بود.برنامههای نرم
افزاری امروزی دارای رابط گرافیکی هستند .این رابط گرافیکی تقریبا در همه برنامههایی که امروزه با آنها سر و کار دارید به چشم
میخورد .یک رابط گرافیکی حرفه ای باید جذاب و ساده باشد .ایجاد یک برنامه با رابط کاربری قبال یک کار سخت و کسل کننده
بود .مثال برای ایجاد یک پنجره ساده که یک متن را نمایش دهد نیاز بود که تعداد زیادی کد تایپ شود .اما با ورود برنامه نویسی
ویژوال این کار راحت شد .برنامه نویسی ویژوال ایجاد برنامههای گرافیکی را راحت کرد ،به طوری که شما میتوانید محیط برنامه
خود را با کشیدن کنترلهای الزم از جعبه ابزار به نوعی “نقاشی” کنید .کنترلها اجزای بصری هستند که GUIیا رابط گرافیکی را
تشکیل میدهند .نمونه ای از کنترلها عبارتاند از check boxes ،labels ،text boxes ،buttonsو .radio buttons
NetBeansنیز محیطی را برای ایجاد و طراحی فرمها به صورت زیر برای شما فراهم میآورد:
131 SWING
شکل باال حالت طراحی ) (Designدر NetBeansرا نشان میدهد .در این شکل فرم ویندوزی و کنترلهایی که بر روی آن کشیده
شدهاند نشان داده شده است .در حالت طراحی ،شما میتوانید چگونگی به نظر رسیدن فرم را در حین اجرای برنامه مشاهده کنید.
کدهایی که باعث ایجاد و مقداردهی به کنترلها میشوند از دید کاربر مخفی هستند ،بنابراین شما میتوانید بر روی کارکرد برنامه
بیشتر تمرکز کنید .همچنین میتوانید از ابزارهای NetBeansمانند چپ چین یا راست چین کردن ،تغییر اندازه و … ..برای طراحی
AWTچیست ؟
AWTیا Abstract Window Toolkitیا جعبه ابزار انتزاعی ،مجموعه ای از کالسهاست ،که توسط برنامه نویسان جاوا برای
ایجاد اشیاء رابط گرافیکی کاربر ) (GUIمانند دکمههای ،اسکرول بارها و پنجرهها به کار میروند AWT .قسمتی از کالسهای پایه
ای جاوا ) (JFCاست که توسط شرکت Sun Microsystemsبرنامه نویسی شدهاند JFC .مجموعه ای جامع از کتابخانههای
کالس GUIاست که با استفاده از آنها به راحتی میتوانید رابط کاربری برنامه را ایجاد کرده و توسعه دهید .پکیج java.awt
دارای کالسهایی برای کار با رابط گرافیکی است که در زیر نحوه ارث بری آنها نشان داده شده است:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 133
همانطور که در شکل باال مشاهده میکنید در پکیج ،AWTکالسهای Label ،Buttonو … از کالس Componentارث بری میکنند
و اشیاء ساخته شده از این کالسها کنترلهای بصری AWTرا که در شکل زیر مشاهده میکنید به وجود میآورند:
131 SWING
کنترلهای AWTیک مجموعه از اولین کنترلها برای پلت فرم جاوا هستند که از آنها برای ایجاد برنامههای جاوای قابل استفاده
در محیطهای Windowsو Linuxاستفاده میشود .این کامپوننتها خیلی کند و غیر قابل اطمینان بوده و برای تمام پلت فرمهای
جاوا نیز نمیتوانند مورد استفاده قرار گیرند .با توجه به مشکالت کنترلهای AWTدر ایجاد برنامههای کاربردی ،شرکت Sunبا
همکاری Netscapeو سایر شرکتهای دیگر مجموعه ایای دیگر از کامپوننتها و کتابخانهها را بنام Java Foundation Class
با نام اختصاری JFCبوجود آورند که کنترلهای Swingنیز بخشی از آنها هستند .از آنجاییکه در این سری آموزشی میخواهیم
کنترلها و در کل کتابخانه Swingرا آموزش دهیم به همین توضیحات در مورد AWTبسنده میکنیم و در درس آینده شما را با
Swingآشنا میکنیم.
SWINGچیست ؟
کلمه Swingاز یک موزیک محبوب و معروف در آمریکا که در طی سالهای 3613 – 3631پخش میشده است ،الهام گرفته شده
است .در این زمان هنوز جاوا وجود نیامده بود .کامپوننتهای AWTیک مجموعه از اولین کامپوننتها برای پلت فرم جاوا بودند که از
آنها برای ایجاد برنامههای جاوا ،قابل استفاده در محیطهای Windowsو Linuxاستفاده میشده است .این کامپوننتها خیلی
کند و غیر قابل اطمینان بودند و برای تمام پلت فرمهای جاوا نیز نمی توانسند مورد استفاده قرار گیرند .با توجه به مشکالت
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 131
کامپوننتهای AWTدر ایجاد برنامههای کاربردی ،شرکت Sunبا همکاری Netscapeو سایر شرکتهای دیگر مجموعه هایی دیگر
از کامپوننتها و کتابخانهها را بنام Java Foundation Classبا نام اختصاری JFCبوجود آورند که کنترلهای Swingنیز بخشی
از آنها بودند .کنترلهای Swingبر خالف کنترلهای ،AWTهماهنگی کاملی با سایر فریم ورکهای جاوا داشته و بر روی تمام پلت
فرمها قابل استفاده میباشند .این کنترلهای عالوه بر خواص کنترلهای AWTدارای خواص جدیدی تری نیز بوده و معایب
کنترلهای AWTرا در آنها بر طرف شده است .به عنوان مثال در کامپوننت Buttonاز مجموعه کامپوننتهای AWTنمیتوان از
عکس استفاده کرد ولی این قابلیت در کنترل Buttonاز کتابخانه Swingگنجانده شده است.
مهمترین وجه تمایز بین کنترلهای Swingو AWTاین است که کامپوننتهای Swingهمگی با حرف Jشروع میشوند .به عنوان
مثال کنترل Jbuttonاز کنترلهای Swingمعادل کنترل Buttonاز AWTاست ،و یا کنترل JComboBoxمعادل کنترل Choice
از مجموعه کنترلهای AWTاست .جدول زیر لیست کنترلهای AWTو معادل آنها را در کامپوننتهای Swingنشان میدهد.
SWING AWT
JButton Button
JPanel Canvas
JCheckBox CheckBox
JComboBox Choice
JComponent Component
JPanel Container
JLabel Label
JList List
JMenu Menu
JMenuBar MenuBar
JMenuItem MenuItem
131 SWING
JPanel Panel
JPopupMenu PopupMenu
JScrollBar Scrollbar
JScrollPane ScrollPane
JTextArea TextArea
JTextField TestField
JApplet Applet
JDialog Dialog
JFileChooser FileDialog
JFrame Frame
JWindow Window
وجودAWT دارای کنترلهای جدید دیگری نیز هست که هیچ جایگزینی برای آنها در کنترلهایSwing ،عالوه بر کنترلهای فوق
: دارای کالسهایی برای کار با رابط گرافیکی است که در زیر نحوه ارث بری آنها نشان داده شده استjava.swing پکیج.ندارد
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 130
همانطور که در شکل باال مشاهده میکنید در پکیج ،swingکالسهای JLabel ،JButtonو … از کالس JComponentو این
کالس هم از کالس Componentارث بری میکنند و اشیاء ساخته شده از این کالسها ،کنترلهای بصری Swingرا که در شکل
حال که مختصری با سویینگ آشنا شدید در درسهای آینده با کنترلهای آن و نحوه استفاده از هر یک آشنا میشوید.
برنامه ویندوزی که در آن از یک اداره کننده رویداد ) (event-handlingاستفاده شده است ،را نشان میدهد.من هر مرحله را به
صورت گام به گام انجام داده و به طور مختصر در مورد هر کدام توضیح میدهم.مفاهیم فریم ،کنترل ،کنترل کننده رویداد(event-
) handlingو برخی قسمتهای Swingدر طراحی یک برنامه ویندوزی مورد استفاده قرار میگیرد و در مورد هر کدام از آنها در
درسهای مربوطهشان بحث خواهد شد .قبل از پرداختن به ادامه درس لینک زیر را مشاهده کنید تا نحوه پیکربندی JDKبرای
اجرای فایلهای javaیاد بگیرید و دلیل استفاده از نرم افزار NetBeansدر آموزشها را بفهمید.
136 SWING
یک ویرایشگر.حال میخواهیم یک برنامه ایجاد کنیم که در این برنامه وقتی بر روی یک دکمه کلیک شد متن داخل آن تغییر کند
1 package myfirstprogram;
2
3 import javax.swing.*;
4 import java.awt.event.*;
5
6 public class MyFirstProgram
7 {
8 public static void main(String[] args)
9 {
10 JFrame frame = new JFrame("Swing first program");
11
12 final JButton button = new JButton("Click ME!");
13
14 button.addMouseListener(new MouseListener()
15 {
16 @Override
17 public void mouseClicked(MouseEvent e)
18 {
19 button.setText("You clicked the button!");
20 }
21
22 @Override
23 public void mousePressed(MouseEvent e)
24 {
25
26 }
27
28 @Override
29 public void mouseReleased(MouseEvent e)
30 {
31
32 }
33
34 @Override
35 public void mouseEntered(MouseEvent e)
36 {
37
38 }
39
40 @Override
41 public void mouseExited(MouseEvent e)
42 {
43
44 }
45 });
46
47 frame.add(button);
48 frame.setSize(337, 255);
49 frame.setVisible(true);
50 }
51 }
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 133
با اجرای کد باال پنجره ای به صورت زیر نمایش داده میشود که با کلیک بر روی آن متن داخل دکمه تغییر میکند:
برنامه باال یکی از سادهترین برنامههایی بود که جهت آشنایی شما به Swingآموزش دادیم .در این کتاب قصد داریم که Swing
را از طریق کدنویسی نه از طریق برنامههایی مانند NetBeansبه شما آموزش دهیم تا شما بیشتر با مفاهیم کدها آشنا شوید.
کالس JOptionPane
JOptionPaneکالسی از جاواست است که از آن برای نشان دادن یک پیغام فوری ،اطالعات و یا یک هشدار به کاربران استفاده
میشود .برای نشان دادن یک پیغام به راحتی میتوان از متد )( showMessageDialogکالس JOptionPaneاستفاده نمایید.
سادهترین حالت متد )( showMessageDialogاین است که یک رشته متنی را به عنوان آرگومان قبول میکند و آن را نمایش
میدهد .یک فایل با پسوند javaتوسط Notepad++ایجاد کرده و کدهای زیر را در داخل آن نوشته و با نام MyFirstProgram
ذخیره کنید:
;package myfirstprogram
;*import javax.swing.
بین دو پرانتز مقابل آن اول کلمه nullرا داریم که کلمه ای کلیدی در جاواست و اینجا فقط به این معناست که جعبه پیام به هیچ
چیز دیگری در برنامه وابسته نیست .برنامه را اجرا کرده و نتیجه را مشاهده نمایید:
شما همچنین میتوانید به راحتی و با استفاده از یکی دیگر از سربارگذاریهای متد )( showMessageDialogیک عنوان و یک آیکون
همانطور که در باال مشاهده کردید ،میتوان به جعبه پیام برای نشان دادن معنی و مفهوم آن یک آیکون اضافه کرد .در جدول زیر
انواع آیکونها و کاربرد آنها در جعبه پیام نشان داده شده است:
اگر بخواهید که جعبه متن هیچ گونه آیکونی نداشته باشد میتوانید از متد )( showConfirmDialogاستفاده کنید .برای استفاده
جدول زیر دکمههایی را که میتوان با این متد نمایش داد را نشان میدهد:
تشخیص اینکه چه دکمه ای توسط شما در جعبه. یا عدد صحیح بر میگرداندint یک مقدار را ازshowConfirmDialog() متد
3 ،3 این متد به ترتیب مقادیرCancel وYes ،NO به عنوان مثال با کلیک بر روی دکمههای.متن فشار داده میشود مفید است
. را بر میگرداند5 و
int result =
JOptionPane.showConfirmDialog(null, "Are You Sure ?", "Qestion",
JOptionPane.YES_NO_CANCEL_OPTION);
if (result == 0)
{
//You pressed the Yes button
}
if (result == 1)
{
//You pressed the No button
}
if (result == 2)
{
//You pressed the Cancel button
}
. میتوان از مقادیری که در کد زیر آمده است هم استفاده کنید1 و5 و3 برای تشخیص دکمه فشرده شده به جای اعداد
if (result == JOptionPane.YES_OPTION)
{
//You pressed the Yes button
}
if (result == JOptionPane.NO_OPTION)
{
//You pressed the No button
}
if (result == JOptionPane.CANCEL_OPTION)
{
//You pressed the Cancel button
}
میباشد که از آن برای دریافت ورودی از کاربر استفادهshowInputDialog() متدJOptionPane یکی دیگر از متدهای کالس
استفاده میکند .رویدادها رفتارهایی یا اتفاقاتی هستند که هنگام اجرای برنامه به وقوع میپیوندند .کنترل رویداد فرایند نظارت بر
وقوع یک رویداد مشخص میباشد .فرمهای ویندوزی از کنترل کننده رویداد برای اضافه کردن یک قابلیت و پاسخ به کاربر استفاده
میکنند.بدون کنترل کننده رویداد ،فرمها و رابط گرافیکی تا حد زیادی بدون استفاده هستند .کنترل رویداد در Swingدارای سه
جزء است:
رویداد) :(Eventیک رویداد تغییر حالت یک شیء (مثال یک جعبه متن) است.
منبع رویداد) :(Event Sourceشیئی است که رویداد را تولید میکند (مثال دکمه ای که رویداد کلیک را تولید میکند).
شنونده رویداد) :(Event Listenerاینترفیسی است که منتظر وقوع رویداد است.
یک کالس تولید میکنیم که شنونده رویداد مربوطه را پیاده سازی میکند. .3
چون این کالس شنونده روی داد که یک رابط است را پیاده سازی کرده است ،پس باید کدهای بدنه متدهای این رابط که .5
همان کدهایی هستند که ما میخواهیم بعد از وقوع رویداد اجرا شوند را تأمین کند.
این کالسها. اینترفیس ها و متدهای این اینترفیس ها که در کنترل رویدادها به کار برده میشوند،در جدول زیر کالسهای رویداد
متد اضافه کننده کالس رویداد متدهای شنونده رویداد شنونده رویداد
componentMoved
componentResized
componentShown
componentRemoved
focusLost
keyReleased
keyTyped
mouseEntered
mouseExited
mousePressed
mouseReleased
mouseMoved
windowClosed
windowClosing
windowDeactivated
windowDeiconified
windowIconified
windowOpened
به ستون آخر سمت چپ جدول باال توجه کنید.همانطور که در ابتدای درس اشاره کردیم بعد از پیاده سازی شنونده توسط یک
کالس باید آن کالس را به کنترل مورد نظرمان وصل کنیم این کار را با متدهایی انجام میدهیم که اسم آنها با کلمه addشروع
میشود که در جدول باال و در ست ون (متد اضافه کننده) نام این متدها ذکر شده است .به علت کمبود فضا در جدول باال در جداول
زیر کاربرد کالسهای رویداد و متدها (ستون دوم و سوم) آمده است:
توضیح متد
adjustmentValueChanged
وقتی کاربر کلید را فشرده و سپس رها میکند فراخوانی میشود keyTyped
وقتی کاربر با ماوس روی یک کنترل میکند رود فراخوانی میشود mouseEntered
وقتی پنجره از حال آیکون به حالت عادی تغییر میکند فراخوانی میشود windowDeiconified
وقتی تولید میشود که بر روی یک دکمه کلیک ،یک آیتم انتخاب و یا بر روی لیست آیتم کلیک شود. ActionEvent
وقتی تولید میشود که ماوس Dragیا کلیک شود و یا از یک کنترل خارج و یا وارد یک کنترل شود. MouseEvent
وقتی تولید میشود که یک دکمه از صفحه کلید توسط کاربر فشرده شود. KeyEvent
وقتی تولید میشود کهدکمه وسط ماوس حرکت داده شود. MouseWheelEvent
وقتی تولید میشود که یک کنترل مخفی شود ،حرکت کند ،اندازهاش تغییر کند. ComponentEvent
وقتی تولید میشود که یک کنترل فوکوس گرفته و یا فوکوس خود را از دست بدهد. FocusEvent
برای درک بهتر کنترل رویداد ) (Event handlingبه یک مثال توجه کنید .فرض کنید که میخواهیم وقتی بر روی یک دکمه
کلیک شد یک پیام نمایش داده شود .برنامه NotePadرا باز کرده و کدهای زیر را در داخل آن نوشته و سپس با نام
MyFirstProgramذخیره کنید:
136 SWING
در مثال باال چون ما قرار است از کنترلهای Swingاستفاده و همچنین رویدادها را کنترل کنیم ابتدا کالسها و پکیجهای مربوطه
را در خطوط 3و 5اضافه میکنیم .سپس در خطوط 33-31یک فریم ایجاد و یک دکمه به آن اضافه میکنیم .در درسهای بعد در
مورد این دو کنترل و همچنین این کدها بیشتر توضیح میدهیم .حال نوبت به سه مرحله ای میرسد که در ابتدای درس توضیح
دادیم:
در خطوط 31-53یک کالس به نام ListenToClickایجاد میکنیم و به وسیله آن شنونده ActionListenerرا پیاده .3
شنونده ActionListenerدارای یک متد به نام )( actionPerformedاست .این متد باید توسط کالس .5
ListenToClickپیاده سازی ) (Overrideشود .پس باید کدهایی که میخواهیم بعد از کلیک بر روی دکمه یعنی
رویدادمان اجرا شوند را در داخل بدنه متد )( actionPerformedمینویسیم (خط .)55
در خط 51با استفاده از متد )( addActionListenerکالس ListenToClickرا به دکمه وصل میکنیم. .1
حال برنامه را اجرا کرده و با کلیک بر روی دکمه نتیجه را مشاهده نمایید:
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 153
button1.addActionListener(ListenToClick); //Step 3
در آخر این نکته را یادآور میشوم که ما در مثال باال برخی از موارد مانند تعیین اندازه و محل قرار گیری دکمه و … را توضیح ندادهایم
تا شما اصل مطلب که همان کنترل رویداد است را یاد بگیرید .در درسهای آینده در مورد کنترلهای Swingبیشتر توضیح
میدهیم.
کنترلها
کنترلها اجزای بصری هستند که به وسیلهی آنها محیطهای گرافیکی ) (GUIساخته میشود .هرچیزی که شما در یک محیط
گرافیکی میبینید یک کنترل است ،حتی Frameنیز یک کنترل است .کنترلها در دستههای مختلفی در قسمت نوار ابزار قرار دارند
بیشتر کنترلها از کالس JComponentارث بری میکنند که دارای خواص ،متدها و رویدادهای متفاوتی برای آنها میباشد.
خواص کنترلها
در قسمت زیر بعضی از خاصیتهای مفید کالس JComponentرا مشاهده میکنید.
توضیح خاصیت
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 155
مشخص میکند که آیا کنترل رنگ پس زمینه داشته باشد یا transparentباشد. contentareafilled
آیکون کنترل را زمانی که کنترل غیر فعال است تعیین میکند. disabledicon
این قسمت مشخص میکند که کنترل فعال است یا نه .اگر مقدار آن Falseباشد کنترل غیرفعال میشود. enabled
رنگ پیش زمینهی کنترل و همچنین رنگ قلم کنترل را مشخص میکند. foreground
مشخص میکند که یک کنترل میتواند توسط دکمهی Tabمورد دستیابی قرار گیرد یا خیر. focusable
فاصلهی بین لبههای کنترل مربوطه و لبهی کنترل دیگر را مشخص میکند. margin
نام کنترل را مشخص میکند .این نام برای اشاره به کنترل در زمان کد نویسی استفاده میشود. name
مهمترین خاصیت در جدول باال خاصیت nameاست .این خاصیت به شما اجازه میدهد که از آن نام برای ارجاع به کنترل در
قسمت کد نویسی استفاده کنید .در این قسمت به بحث در مورد بعضی از خاصیت هایی که در بیشتر کنترلها وجود دارند
میپردازیم.
رویدادهای کنترل
در جدول پایین شما برخی از رویدادهای مفید که بین بیشتر کنترلهای رایج هستند را مشاهده میکنید.
توضیح رویداد
این رویداد وقتی رخ میدهد که بر روی کنترل با دکمهی سمت چپ ماوس کلیک شود. actionPerformed
زمانی که عملیات Drag & Dropبر روی کنترل انجام میشود این رویداد رخ میدهد. mouseDragged
این رویداد زمانی رخ میدهد که focusبر روی کنترل باشد و کلیدی از روی صفحه کلید فشرده و رها keyPressed
شود.
این رویداد زمانی رخ میدهد که focusبر روی کنترل باشد و کلیدی که از روی صفحه کلید فشرده شده، keyReleased
یک حالت پیشرفته تر از رویداد actionPerformedاست.کلیک کردن میتواند شامل فشردن کلیدهای mouseClicked
صفحهی کلید نیز باشد .ولی اگر شما نیاز به اطالعاتی نظیر :تعداد کلیک بر روی کنترل ،چرخیدن دکمه
این رویداد زمانی رخ میدهد که دکمه ای از ماوس در داخل کنترل پایین نگه داشته شود. mousePressed
زمانی که مکان نما به یک کنترل وارد میشود این رویداد رخ میدهد. mouseEntered
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 153
این رویداد زمانی رخ میدهد که مکان نما کنترل را ترک کند. mouseExited
این رویداد زمانی رخ میدهد که مکان نما وقتی در داخل محدودهی کنترل است حرکت کند. mouseMoved
این رویداد زمانی رخ میدهد که دکمه ای از ماوس را که قبال فشردهایم ،در داخل کنترل رها کنیم. mouseReleased
این رویداد زمانی رخ میدهد که بر روی کنترل Focusباشد و دکمه چرخنده ماوس حرکت کند. mouseWheelMoved
در مورد بیشتر رویدادهای باال در بخشهای آینده صحبت خواهیم کرد.
متدهای کنترل
به استثنای containerهای سطح باال ،همه کنترلهای Swingی که نام آنها با حرف Jشروع میشود از کالس JComponent
ارث بری میکنند .به عنوان مثال JButton ،JScrollPane ،JPanelو .JTableبه این نکته توجه کنید که JFrameو JDialog
از containerهای سطح باال ارث بری میکنند .کالس JComponentاز کالس Containerو این کالس هم به نوبه خود از
کالس Componentمشتق میشود .از آنجاییکه کالس JComponentکالس پایه کنترلهای Swingاست در نتیجه کنترلهای
Swingاز متدهای این کالس استفاده میکنند .در جدول زیر متدهای پر کاربرد این کالس ذکر شده است:
کاربرد متد
برای به دست آوردن رنگ فونت و پس زمینه کنترل به کار میرود. )(getForeground
)(getBackground
برای به دست آوردن و تعیین فونت کنترل به کار میرود .اگر کنترل فونت نداشته باشد از فونت کنترل )(setFont
)(getFont
والد آن استفاده میشود.
برای به دست آوردن و تعیین نشانگر ماوس زمانیکه ماوس بر روی کنترل میرود به کار میرود. )(setCursor
)(getCursor
151 SWING
تشخیص میدهد که آیا کنترل در صفحه نمایش داده شده است یا نه؟ این بدین معناست که )(isShowing
برای تشخیص و تعیین نمایش و عدم نمایش کنترل به کار میرود. )(setVisible
)(isVisible
بعد سوم ) (z-orderیک کنترل در داخل یک را بر میگرداند .باالترین کنترل دارای بعد سوم )(getComponentZOrder
کوچکتر (عدد کمتر) و پایینترین کنترل دارای بعد سوم بزرگتر ی است.
برای تعیین بهترین اندازه کنترل در مقیاس پیکسل به کار میرود .اندازه کنترل نباید بزرگتر از )(setPreferredSize
)(setMaximumSize
maximum sizeو یا کوچکتر از minimum sizeباشد.
)(setMinimumSize
برای به دست آوردن maximum sizeو minimum sizeکنترل در مقیاس پیکسل به کار )(getPreferredSize
)(getMaximumSize
میرود.
)(getMinimumSize
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 151
برای تعیین تراز بندی کنترل نسبت به کنترلهای دیگر به کار میرود .مقداری کهایم متد میگیرد عددی )(setAlignmentX
)(setAlignmentY
بین 3و 3است.
برای به دست آوردن تراز بندی کنترل نسبت به کنترلهای دیگر به کار میرود. )(getAlignmentX
)(getAlignmentY
برای به دست آوردن عرض و ارتفاع یک کنترل بر حسب پیکسل به کار میرود. )(getWidth
)(getHeight
برای به دست آوردن اندازه کنترل بر حسب پیکسل به کار میرود. )(getSize
)(getSize
برای به دست آوردن نقطه xو yکنترل نسبت به گوشه باال و سمت چپ کنترل والد آن بر حسب )(getX
)(getY
پیکسل به کار میرود.
برای به دست آوردن محدوده یک کنترل (عرض و ارتفاع) بر حسب پیکسل به کار میرود. )(getBounds
برای به دست آوردن مکان یک کنترل نسبت به گوشه باال سمت چپ کنتر ل والد آن بر حسب پیکسل )(getLocation
مکان نسبی را نسبت به گوشه باال سمت چپ صفحه نمایش بر میگرداند. )(getLocationOnScreen
مکان کنترل را نسب به گوشه باال سمت چپ کنترل والد تعیین میکند. )setLocation(Point
اندازه و مکان نسبی کنترل را نسبت به گوشه باال سمت چپ کنترل والدش مشخص میکند. )(setBounds
به این نکته توجه کنید که این کالس دارای متدهای بیشتری است که در این درس به این تعداد بسنده کردهایم.در درسهای آینده
در این درس میخواهیم شما را با برخی از متدها و خاصیتهایی که در درس قبل نام بردیم آشنا کنیم .ولی ابتدا باید یک نکته ای
را یادآور شویم که چون کنترلها همه کالس هستند باید برای استفاده از هر یک از این کالسها باید یک نمونه از آنها ایجاد کرد.
در این درس ما به سه کالس برای توضیح بیشتر خاصیتها و متدها نیاز داریم که عبارتاند از JButton ،JFrameو .JPanelدر
مورد این سه کنترل در درسهای آینده بیشتر توضیح میدهیم .فقط در این درس میخواهیم یک دکمه را به پنل و پنل را فریم
اضافه کنیم و سپس خاصیتها و متدهای پر کاربرد را تست کنیم .برای شروع برنامه NotePadرا باز کرده و کدهای زیر را در داخل
آن بنویسید:
در همین کد باال کاربرد چندین متد را میتوان فهمید .در خطوط 33-35یک ،Frameیک Panelو دو Buttonایجاد کردهایم .در
خط 33دکمه را به پنل و در خط 31هم Panelرا به Frameاضافه کردهایم .این کار را با استفاده از متد )( addانجام دادهایم.
پس فعال با کاربرد متد )( addآشنا شدید .در خط 31با استفاده از متد )( setSizeیک اندازه برای Frameتعیین کرده و در
30با استفاده از متد )( setVisibleفریم را نمایش میدهیم .با اجرای برنامه باال پنجره ای به صورت زیر ایجاد میشود:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 150
به این نکته توجه کنید که تمام کدهای پایین را میتوانید در خط 31کد باال نوشته و بعد از تست و مشاهده نتیجه پاک کرده و کد
بعدی را بنویسید .فرض کنید که میخواهیم رنگ پس زمینه Panelرا تغییر دهیم .برای این کار از متد )(setBackground
استفاده میکنیم .این متد برای تغییر رنگ پس زمینه ،یک شیء از کالس Colorبا عنوان پارامتر قبول میکند .در خط 31کد زیر
را بنویسید:
اعدادی که در داخل متد )( getHSBColorنوشته شدهاند میتوانند اعدادی بین 3-511باشند .برنامه را اجرا و نتیجه را مشاهده
کنید:
البته به جای کد باال میتوانید از نام رنگها هم به صورت زیر استفاده کنید:
156 SWING
;)panel1.setBackground(Color.BLUE
حال فرض کنید که میخواهیم رنگ نوشته Button1را به قرمز تغییر دهیم .برای این کار از متد )( setForegroundاستفاده
;)button1.setForeground(Color.red
برای تغییر فونت دکمه هم میتوان از متد )( setFontو یک شیء از کالس Fontاستفاده کرد .برای این کار به صورت زیر عمل
میکنیم:
همانطور که مشاهده میکنید شیء Fontسه پارامتر میگیرد که اولی نام ،دومی حالت و سومی اندازه فونت را مشخص میکند.
برای تغییر نام یا اختصاص یک نام به یک کنترل هم میتوان از متد )( setTextاستفاده کرد .فرض کنید که میخواهیم نام
دکمه button2را به SecondButtonتغییر بدم .برای این کار به صورت زیر عمل میکنیم:
;)"button2.setText("Second Button
برای غیر فعال کردن یک کنترل هم از متد )( setEnabledاستفاده میشود .فرض کنید که میخواهیم نام دکمه button1را غیر
;)button1.setEnabled(false
برای تغییر نشانگر ماوس هم میتوان از متد )( setCursorبه همراه یک شیء از کالس Cursorاستفاده کرد .این کالس دارای
;))button1.setCursor(new Cursor(Cursor.WAIT_CURSOR
حال اگر برنامه را اجرا کرده و بر روی دکمه با ماوس توقف کنید ،مشاهده میکنید که شکل نشانگر ماوس تغییر میکند .برای
اختصاص آیکون به یک کنترل مثال دکمه هم از کالس ImageIconاستفاده میشود .من از قبل یک آیکون را در داخل پوشه برنامه
قرار دادهام .برای اختصاص این آیکون به دکمه بعد از خط 6کد زیر را بنویسید:
من در کد باال از آدرس مطلق آیکون استفاده کردهام و ممکن است که این آدرس برای شما به نحو دیگری باشد .سپس سازنده
حال اگر بخواهید آیکون در سمت راست و متن در سپ چپ باشد میتوانید از متد )( setHorizontalTextPositionو رابط
SwingConstantsاستفاده کنید .این رابط مقادیر مختلفی برای تراز بندی دارد که یکی از آنها LEFTاست و متن را در سمت
چپ آیکون قرار میدهد .کد زیر را بعد از ایجاد دکمه بنویسید:
;)button1.setHorizontalTextPosition(SwingConstants.LEFT
برای ایجاد فاصله بین متن و آیکون هم از متد )( setIconTextGapاستفاده میشود:
;)button1.setIconTextGap(50
برای تغییر اندازه کنترل از متد )( setSizeاستفاده میشود .با فرض اینکه همان کد ابتدای درس را در اختیار دارید بعد از خط
;)panel1.setLayout(null
;)button1.setSize(200,150
در مورد متد )( setLayoutالزم نیست چیزی بدانید چون در مورد آن در قسمت کار با الیهها توضیح خواهیم داد .فقط در این
حد بدانید که پارامتر این متد باید nullباشد تا عملکرد متد )( setSizeقابل مشاهده باشد .حال برنامه را اجرا و نتیجه را
مشاهده کنید:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 113
مشاهده میکنید که دکمه نسبت به گوشه باال و سمت چپ کنترل تراز میشود .حال اگر بخواهیم دکمه را به طرف چپ یا راست
;)button1.setBounds(60,30,200,150
دو عدد اول به ترتیب مختصات xو yنسبت به گوشه باال و سمت چپ Panelو دو عدد بعدی هم عرض و ارتفاع کنترل را
مشخص میکنند:
نامگذاری کنترلها
همیشه کنترلها را نامگذاری کنید .ما از خاصیت nameبرای نامگذاری کنترلها استفاده میکنیم .نامگذاری کنترلها از قواعد
نامگذاری متغیرها استفاده میکند ،برای مثال فاصلهها ،کاراکترهای ویژه ،و استفاده از کلمات کلیدی در نامگذاری کنترلها نیز
ممنوع است .یک سری قرار داد در نامگذاری کنترلها وجود دارد که در ادامه به آنها اشاره میکنیم.
شما میتوانید بسته به نوع استفاده ای که از کنترل میکنید آنرا نامگذاری نمایید .برای مثال ،وقتی که قرار است در داخل یک
تکست باکس نام یک شخص یا کاربر وارد شود میتوانید نام آن تکست باکس را برای خوانایی بیشتر firstnameقرار دهید.اما
در نامگذاری کنترلها بهتر است که نام واقعی آن کنترل قبل از نامی که برای آن انتخاب کردهایم بیاید .برای مثال به جای
111 SWING
firstnameدر نامگذاری ،Text Fieldمیتوانید از TextFieldFirstNameاستفاده کنید.با توجه به این قرار دادها ،ما
تکنیک دیگری که برای نامگذاری کنترلها به کار میرود ،خالصه کردن نام آنها است.برای مثال ،به جای استفاده از کلمهی
،TextFieldFirstNameشما میتوانید از txtFirstNameاستفاده کنید .کلمهی txtفرم کوتاه شدهی کلمهی Text Field
است.تعداد زیادی کلمهی کوتاه شده برای هر کنترل وجود دارد و شما حتی میتوانید از کلمهی کوتاه شده ای که خود برای آن کنترل
انتخاب کردهاید استفاده کنید.البته این باید گویا باشد .به طوری که برای کسانی که به کد شما نگاه میکنند واضح باشد.
تکنیک دیگری که برای نامگذاری کنترلها بکار میرود جابجا کردن نام اصلی کنترل با نامی که ما برای آن انتخاب کردهایم و همچنین
استفاده از روش کوهان شتری ) (Camel caseاست.برای مثال یک تکست باکس داریم که نام کاربر یا شخصی را از ورودی
میگیرد ،میتوانید آنرا به صورت firstNameTextFieldنامگذاری کنید و یا یک دکمه دارید که عملیات محاسباتی را انجام
در درسهای آینده از تکنیک سوم ) (Camel Caseاستفاده میکنیم .نیازی به این نیست که شما تمامی کلمات اختصاری کنترلها
را حفظ کنید.وقتی که شما یک کنترل را ایجاد میکنید ،تنها کافیست عدد پسوندی آنرا حذف کنید و به جای آن ،نامی را با توجه
به کاربرد کنترل به آن اضافه کنید.وقتی که شما در حال تایپ کردن هستید و قصد پیدا کردن کنترل خاصی را دارید کافیست براحتی
نام کنترل را تایپ کرده تا پنجرهی intellisenceنام آن کنترل و تمامی کنترلهای مشابه آنرا را برای شما نمایش دهد.برای
مثال ،یک تکست باکس و تمامی کنترلهای تکست باکس در intellisenceبرنامه نمایش داده میشوند ،فقط قسمتی که
مربوط به نامی که شما برای آن کنترل انتخاب میکنید ممکن است طوالنی باشد ،که شما با توجه به قواعدی که پیشتر ذکر شد
میتوانید نسبت به نامگذاری و کوتاه کردن نام کنترلها اقدام کنید .در زیر مثالهایی از نامگذاری کنترلها بسته به کاربرد آنها ذکر
شده است:
کلیدی که برای نشان دادن یک پیغام به کار میرود . buttonConfirm, confirmButton, btnConfirm
یک تکست باکس که یک ایمیل را از کاربر دریافت میکند . textFieldAddress, addressTextBox, txtAddress
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 111
یک RadioButtonکه نشان دهندهی مذکر بودن یک کاربر radioButtonMale, maleRadioButton, radMale
است .
الزم نیست که تمامی کنترلهای یک فرم را نام گذاری کنید .کنترلهایی که هیچوقت در کدنویسی مورد استفاده قرار نمیگیرند،
میتوانند از نام پیش فرض خود استفاده کنند .برای مثال ،اکثر Lableها صرفا برای نامگذاری بکار میروند و در کد نویسی مورد
استفاده قرار نمیگیرند .لذا الزم نیست خاصیت nameآنها را تغییر دهیم .همیشه عادت کنید که کنترلهای خود را نامگذاری
کنید.
کنترل JFrame
Frameپنجره ای است که شما در برنامههایتان ،کنترلهای دیگر را بر روی آن قرار میدهید .شما میتوانید در یک برنامه بیش از
یک Frameداشته باشید .هر Frameاز خواص و متدهای کالس Windowارث میبرد Frame .از لحاظ ویژوالی یا بصری ،در
ظاهر Frame
در شکل زیر شما نام قسمتهای مختلف Frameرا مشاهده میکنید.
111 SWING
در قسمت باال ،نوار عنوان ) (Title Barقرار دارد .نوار عنوان از یک آیکن ) ،(Iconیک عنوان ) ،(Titleو یک جعبهی کنترل
) (Control Boxتشکیل شده است .جعبهی کنترل ) (Control Boxدکمههای کوچکنمایی ) ،(Minimizingبزرگنمایی
) ،(Maxmizingو بستن ) (Closingرا در بر دارد .قسمت داخلی یا همان Content Areaمکانی است که ما کنترلها را در آن
قرار میدهیم .قسمت حاشیه یا Borderکه شامل قسمت Title Barنیز میشود ،به شما اجازه میدهد که سایز فرم را تغییر
دهید ،Frame .نمونه ای از کالس JFrameمیباشد و دارای دو سازنده اصلی میباشد .که یکی از آنها برای ایجاد یک Frame
حال اجازه دهید که یک Frameمانند شکل باال و با استفاده از کدنویسی ایجاد کنیم .به کدهای زیر توجه کنید:
در خط 3کد باال چون قرار است که یک Frameایجاد کنیم در نتیجه کالسهای Swingرا وارد برنامه کردهایم .در خط 1یک کالس
به نام MyFirstProgramایجاد کردهایم .در خط 6یک نمونه از کالس JFrameایجاد کرده و در داخل سازنده آن یک عنوان برای
Frameمینویسیم .در خط 33با استفاده از متد setSizeیک اندازه برای فریم تعیین میکنیم و در خط 33با استفاده از متد
)( setVisibleهم آن را نمایش میدهیم .به این نکته توجه کنید که ما در کد باال فقط اندازه و عنوان را تعیین کردیم و با اجرای
کد قسمت ControlBoxبه صورت پیشفرض در Frameوجود دارد .در حالت پیشفرض وقتی که یک Frameرا میبندید در اصل
مخفی میشود .کالس JFrameدارای ثابتهایی برای بستن یا مخفی کردن Frameمیباشد که در زیر لیست انها آمده است:
توضیح ثابت
در حکم مخفی شدن )) (setVisible(falseپنجره میباشد .این ثابت پیشفرض است. HIDE_ON_CLOSE
برای استفاده از این ثابتها بعد از ایجاد یک نمونه از کالس JFrameمتد )( setDefaultCloseOperationرا فراخوانی کرده و
یکی از ثابتهای باال را به آن ارسال میکنیم .مثال بعد از خط 1کد باال میتوانیم خط زیر را بنویسیم:
;)frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE
یک JFrameدارای یک نمونه از کامپوننت JRootPaneمیباشند .خود JRootPaneشامل دو کامپوننت JPanel glassPane
شده است:
معموال کامپوننت های swingبه Content Paneاضافه میشوند و بطور مستقیم به خود JFrameاضافه نمیشوند و بهتر
133 SWING
است که در هنگام اضافه کردن کنترلها به Frameمشخص کنیم که این کنترل در کدام قاب قرار بگیرد .مثال برای اضافه کردن یک
کنترل به فریمی که در مثال باال ایجاد کردیم از دو متد )( addو )( getContentPaneبه صورت زیر عمل میکنیم:
;)frame1.getContentPane().add(...
فرض کنید که میخواهیم یک کنترل Labelبه فریم اضافه کنیم در این صورت بعد از خط 1کد ابتدای درس کدهای زیر را
بنویسید:
در کد باال ما یک کنترل Labelرا به الیه ContentPaneاضافه کردهایم .همانطور که مشاهده میکنید ابتدا یک کنترل Label
ایجاد کرده و سپس در سازنده کالس آن یک متن برای آن انتخاب کرده و آن را در وسط فریم قرار دادهایم .برای اضافه کردن این
کنترل به الیه ContentPaneهم از متد )( getContentPaneاستفاده نمودهایم .خروجی کد باال به صورت زیر است:
یکی از بحثهای مهم در ساختن یک Graphical User Interfaceیا یک ) (GUIیا به زبان ساده تر یکی از مهمترین و پر
کاربردترین مسأله ای که در هنگام ایجاد یک فریم با آن رو برو هستیم ،مدیریت الیهها و چیدمان کنترلهای آن فریم )(Layout
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 135
است .اینکه بتوانیم فریمی بسازیم که در آن کنترلهای مختلف در جاهای متفاوت در فریم قرار گیرند ،به زیبایی و کارایی برنامه ما
میافزاید .توصیه میکنیم که درس قبل را که در آن در مورد الیهها توضیح دادیم مطالعه بفرمایید.
مدیر الیه با layout managerشیء است که اندازه و مکان کنترلها را در داخل یک جعبه ) (containerکنترل میکند .منظور
از جعبه در جاوا کنترلهایی مانند Frameیا Panelاست ،چون که کنترلهای دیگر در داخل این دو کنترل قرار میگیرند .در این
بخش ما از کلمه Containerبه جای جعبه استفاده میکنیم .هر Containerدارای یک شیء مدیر الیه پیشفرض است که آن
الیه را کنترل میکند .در جاوا پنج مدیر الیه وجود دارد :
FlowLayout
GridLayout
BorderLayout
CardLayout
GridBagLayout
BoxLayout
GroupLayout
SpringLayout
برای استفاده از یک مدیر الیه کافیست که یک شیء از مدیر الیه ایجاد و آن را به متد )( setLayoutارسال کنیم:
;))(aContainer.setLayout(new LayoutManager
BorderLayout
BorderLayoutمدیر الیه پیشفرض contentPanکالسهای JinternalFrame ،JDialog ،JWindow ،JFrameو JApplet
بوده و دارای پنج منطقه چپ ،راست ،باال ،پایین و مرکز میباشد .یعنی کنترلها را میتوان در این پنج منطقه قرار داد .بسته به
اندازه ویندوز این پنج منطقه تغییر اندزاه میدهند و کل صفحه را پوشش میدهند .اگر یک کنترل به Frameاضافه کرده و منطقه
131 SWING
آن را مشخص نکنید به طور پیشفرض در وسط فریم قرار میگیرد و اگر چندین کنترل را به یک منطقه اضافه کنید آخرین کنترل
public BorderLayout()
: عبارتاند از، مشخص کردContainer مناطقی که میتوان هنگام اضافه کردن کنترل به
CENTER
EAST
NORTH
SOUTH
WEST
1 package myfirstprogram;
2
3 import java.awt.*;
4 import javax.swing.*;
5
6 public class MyFirstProgram
7 {
8 public static void main(String[] args)
9 {
10 JFrame frame1 = new JFrame("BorderLayout Demo");
11 frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
12
13 frame1.setLayout(new BorderLayout());
14 frame1.setFont(new Font("Helvetica", Font.PLAIN, 14));
15 frame1.add(new JButton("North"), BorderLayout.NORTH);
16 frame1.add(new JButton("South"), BorderLayout.SOUTH);
17 frame1.add(new JButton("East"), BorderLayout.EAST);
18 frame1.add(new JButton("West"), BorderLayout.WEST);
19 frame1.add(new JButton("Center"), BorderLayout.CENTER);
20
21 frame1.setSize(430 ,315);
22 frame1.setVisible(true);
23 }
24 }
برای ایجاد فاصله بین این قسمتها هم در قسمت سازنده مقادیری از نوع عدد صحیح مینویسید ،vgap .فاصله عمودی و hgap
فاصله افقی از دیگر کنترلها میباشد .مثال خط ۵۳کد باال را به صورت زیر تغییر دهید:
;))setLayout(new BorderLayout(5,8
بعد از اجرای دوباره برنامه فاصلههایی که تعیین کردهاید در بین قسمتها قابل مشاهده است:
131 SWING
اضافه کرده و ناحیه آنها را در آن مشخصContainer ابتدا باید آنها را به یک،اگر بخواهید چند کنترل را در یک ناحیه قرار دهید
وLabel فرض کنید که میخواهیم یک. اضافه کرده و ناحیه آن را مشخص کنیدFrame را به مثالContainer کنید و سپس
Frame را بهPanel اضافه کرده و سپسPanel ابتدا باید آنها را به یک. را در ناحیه باالی فریم اضافه کنیمtextfield یک
1 package myfirstprogram;
2
3 import java.awt.*;
4 import javax.swing.*;
5
6 public class MyFirstProgram
7 {
8 public static void main(String[] args)
9 {
10 JFrame frame1 = new JFrame("BorderLayout Demo");
11 frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
12 frame1.setLayout(new BorderLayout());
13 frame1.setFont(new Font("Helvetica", Font.PLAIN, 14));
14
15 JPanel topPanel = new JPanel(new BorderLayout());
16 JLabel label = new JLabel("Name: ");
17 JTextField text = new JTextField();
18 topPanel.add(label, BorderLayout.WEST);
19 topPanel.add(text, BorderLayout.CENTER);
20 frame1.add(topPanel, BorderLayout.NORTH);
21
22 frame1.setSize(430 ,315);
23 frame1.setVisible(true);
24 }
25 }
. قرار میدهیمBorderLayout ایجاد کرده و مدیر الیه آن راPanel یک31 همانطور که در کد باال مشاهده میکنید ابتدا در خط
Panel در قسمت چپ و وسط36 و30 ایجاد کرده و آنها را در خطTextField و یکLabel یک31 و31 سپس در خطوط
: خروجی کد باال به صورت زیر است. اضافه کردهایمFrame به قسمت باالی53 را در خطPanel سپس.قرار میدهیم
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 131
CardLayout
با استفاده از CardLayoutشما میتوانید چندین کنترل را در یک فضا نمایش دهید .برای درک بهتر برگههای پاسور را در نظر
بگیرید که همه روی هم قراردارند و در لحظه فقط یکی از آنها قابل مشاهده است یا تبهای مرورگرتان را در نظر بگیرید.زمانی که
شما یکی از تبها کلیک میکنید محتوای پنجره تغییر میکند ،در حقیقت تمامی محتویات یک تب قبال بارگذاری شده و در باالی
یکدیگر قرار گرفتهاند .زمانی که شما روی یکی از تبها کلیک میکند فقط یکی از آنها نمایش داده میشود و مابقی تبها غیرقابل
مشاهده میشوند .کتابخانه Swingشامل کنترلهای آماده برای پنجرههای همراه با تبها بنام JTabbedPaneمیباشد.برای درک
24
25 ;)"cardPanel.add(card1,"RedCard
26 ;)"cardPanel.add(card2,"BlueCard
27
28 // create two buttons
29 ;)(JPanel buttonPanel = new JPanel
30 ;)"JButton b1 = new JButton("Red
31 ;)"JButton b2 = new JButton("Blue
32 ;)buttonPanel.add(b1
33 ;)buttonPanel.add(b2
34
35 ;)Frame1.add(cardPanel, BorderLayout.CENTER
36 ;)Frame1.add(buttonPanel, BorderLayout.SOUTH
37
38 // create action listeners for buttons
39 )(b1.addActionListener(new ActionListener
40 {
41 )public void actionPerformed(ActionEvent event
42 {
43 ;)"cardLayout.show(cardPanel, "RedCard
44 }
45 ;)}
46
47 )(b2.addActionListener(new ActionListener
48 {
49 )public void actionPerformed(ActionEvent event
50 {
51 ;)"cardLayout.show(cardPanel, "BlueCard
52 }
53 ;)}
54
55 // Show main Frame1
56 ;)Frame1.setVisible(true
57 }
58 }
هدف کلی کد باال این است که با با کلیک بر روی دو دکمه دو کارت با رنگهای قرمز و آبی که بر روی هم قرار دارند را نمایان کنیم.
یا فرض کنید که این دو دکمه حکم تب دارند .ابتدا یک کالس در در خطوط 1-11تعریف کردهایم .سپس در داخل متد )(main
و در خطوط 35و 31یک Frameایجاد میکنیم .در خط 31یک نمونه از کالس CardLayoutایجاد و آن را در خط 31به یک
Panelوصل میکنیم .این پنل همان پنلی است که کارتهای قرمز و آبی در آن قرار میگیرند .برای ایجاد این دو کارت دو پنل -51
36ایجاد کرده و آنها را به پنل اصلی یعنی cardPanelدر خط 51و 51اضافه میکنیم .به پارامتر دوم متد )( addدر این دو
خط توجه کنید .این پارامترها نامهایی هستند که ما به این دو کارت اختصاص دادهایم .حال نوبت به اضافه کردن دو دکمه میرسد.
در خط 56یک Panelدیگر ایجاد کرده و دو دکمه به نامهای Redو Blueبه این پنل اضافه میکنیم (خطوط .)13-11حال
نوبت به اضافه کردن دو پنل که یکی از آنها حاوی کارتها و دیگری حاوی دکمهها است به Frameمیرسد .این دو پنل را در
خطوط 11و 11به فریم اضافه میکنیم .چون layout managerفریم به صورت پیشفرض BorderLayoutاست میتوانیم یکی
از پنل ها را در وسط و دیگری را در پایین فریم قرار دهیم .در خطوط 16-11هم دو کنترل کننده رویداد برای دو دکمه ایجاد میکنیم
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 130
تا با کلیک بر روی دکمهها کارت مربوط به آن نمایش داده شود .در خطوط 31و 13هم با استفاده از متد )( showکالس
CardLayoutدو کارت را نمایش میدهیم .حال برنامه را اجرا و با کلیک بر روی دو دکمه نتیجه را مشاهده نمایید:
FlowLayout
136 SWING
اگر عرض. کنترلها را در یک سطر تراز میکنیمFlowLayout با استفاده از. استJPanel مدیر الیه پیشفرضFlowLayout
کمتر از عرض همه کنترلهای باشد یعنی کنترلها نتوانند در یک سطر قرار بگیرند به صورت خودکار در دو یا چند سطرcontainer
package myfirstprogram;
import java.awt.*;
import javax.swing.*;
frame1.setSize(430, 315);
frame1.setVisible(true);
}
}
)(public FlowLayout
در حالت پیشفرض کنترلها در وسط قرار میگیرند مگر اینکه نحوه تراز بندی آنها را با استفاده از ثابتهای زیر مشخص کنیم:
LEFT
FCENTER
RIGHT
;))frame1.setLayout(new FlowLayout(FlowLayout.LEFT
GridLayout
سازنده. برای تنطیم کنترلها را در ردیف و ستونهای هم اندازه و منظم و از چپ به راست در کنار هم قرار میدهدGridLayout
public GridLayout()
به کد زیر توجه.مثال در سازنده میتوان تعداد سطر و ستونهایی که قرار است کنترلها درون آنها قرار بگیرند را مشخص کنید
:کنید
package myfirstprogram;
import java.awt.*;
import javax.swing.*;
frame1.add(new JButton("January"));
frame1.add(new JButton("February"));
frame1.add(new JButton("March"));
frame1.add(new JButton("April"));
frame1.add(new JButton("May"));
frame1.add(new JButton("June"));
frame1.add(new JButton("July"));
frame1.add(new JButton("August"));
frame1.add(new JButton("September"));
frame1.add(new JButton("October"));
frame1.add(new JButton("November"));
frame1.add(new JButton("December"));
frame1.setSize(430, 315);
frame1.setVisible(true);
}
}
گذاشتهایم و1 در کد باال تعداد ستون رو.اعداد صفر و دو در خط پررنگ شده کد باال به ترتیب نشان دهنده سطر و ستون هستند
. مواجه میشویدIllegalArgumentException قرار دهید در هنگام اجرای برنامه با خطای3 اگر تعداد سطرها و ستونها را برابر
BoxLayout
111 SWING
دارای یک سازنده است وBoxLayout کالس. کنترلها در یک ردیف یا یک ستون قرار میگیرندBoxLayout در مدل الیه بندی
است کهContainer هم نحوه قرارگیری کنترل درaxis همان کنترلی است که دیگر کنترلها در آن قرار میگیرند وContainer
BoxLayout.X_AXIS
BoxLayout.Y_AXIS
1 package myfirstprogram;
2
3 import java.awt.*;
4 import javax.swing.*;
5
6 public class MyFirstProgram
7 {
8 public static void main(String[] args)
9 {
10 JFrame frame1 = new JFrame("BoxLayout Demo");
11 frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
12 frame1.setFont(new Font("Helvetica", Font.PLAIN, 14));
13
14 Container container = frame1.getContentPane();
15 container.add(new JButton("Button1"));
16 container.add(new JButton("Button2"));
17 container.add(new JButton("Button3"));
18 container.add(new JButton("Button4"));
19
20 frame1.setLayout(new BoxLayout(container, BoxLayout.X_AXIS));
21
22 frame1.setSize(430 ,315);
23 frame1.setVisible(true);
24 }
25 }
Container یک33 اضافه نمیشوند در خطFrame نکته ای که در کد باال وجود دارد این است که چون کنترلها به طور مستقیم به
53 سپس در خط. چهار دکمه را به آن اضافه میکنیم31-30 سپس در خطوط. داردContentPane ایجاد کردهایم که اشاره به الیه
: خروجی کد باال به صورت زیر است. را مشخص میکنیمContainer نحوه قرارگیری کنترلها در این
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 113
به این نکته توجه کنید که میتوان خط 33کد باال را کامال حذف کرد و برای اضافه کردن دکمهها به Frameبه صورت زیر عمل کرد
:
;))"frame1.getContentPane().add(new JButton("...
در javaکالسهایی برای کار با حاشیه کنترلها وجود دارد .از این کالسها میتوان برای کشیدن خط به دور کنترلها ،پر کردن
فضای خالی اطراف آنها و همچنین اضافه کردن یک عنوان به کنترلها استفاده کرد .این کالسها در پکیج borderقرار دارند و
*import javax.swing.border.
در زیر لیست برخی از این کالسهای پکیج borderذکر شده است:
BevelBorder
CompoundBorder
EtchedBorder
LineBorder
MatteBorder
SoftBevelBorder
TitledBorder
برای ایجاد حاشیه با استفاده از کالسهای باال یک شیء از آنها را به عنوان آرگومان به متد )( setBorderارسال میکنیم .به کد
4 import javax.swing.*;
5 import javax.swing.border.*;
6
7 public class MyFirstProgram
8 {
9 public static void main(String[] args)
10 {
11 JFrame frame1 = new JFrame("Border Demo");
12 frame1.setLayout(new GridLayout(2, 4));
13 frame1.setSize(450 , 315);
14
15 JPanel Panel1 = new JPanel();
16 Panel1.setBorder(new TitledBorder("Title"));
17
18 JPanel Panel2 = new JPanel();
19 Panel2.setBorder(new EtchedBorder());
20
21 JPanel Panel3 = new JPanel();
22 Panel3.setBorder(new LineBorder(Color.BLUE));
23
24 JPanel Panel4 = new JPanel();
25 Panel4.setBorder(new MatteBorder(5, 5, 5, 5, Color.GREEN));
26
27 JPanel Panel5 = new JPanel();
28 Panel5.setBorder(new BevelBorder(BevelBorder.RAISED));
29
30 JPanel Panel6 = new JPanel();
31 Panel6.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));
32
33 JPanel Panel7 = new JPanel();
34 Panel7.setBorder(new CompoundBorder(new EtchedBorder(),new LineBorder(Color.RED)));
35
36 frame1.add(Panel1);
37 frame1.add(Panel2);
38 frame1.add(Panel3);
39 frame1.add(Panel4);
40 frame1.add(Panel5);
41 frame1.add(Panel6);
42 frame1.add(Panel7);
43
44 frame1.setVisible(true);
45 }
46 }
پنل را حاشیه دار کردهایم و در ادامه در مورد آنها بیشتر توضیح1 در کد و برای آشنایی شما با نحوه استفاده از کالسهای مذکور
TitleBorder کالس
سازنده این کالس به صورت زیر. برای کشیدن خط به دور کنترل به همراه یک عنوان استفاده میشودTitleBorder از کالس
:مقداردهی میشود
TitledBorder(Border border)
TitledBorder(String string)
TitledBorder(Border border, String string)
TitledBorder(Border border, String string, titleJustification, titlePosition)
TitledBorder(Border border, String string, titleJustification, titlePosition, Font font)
TitledBorder(Border border, String string, titleJustification, titlePosition, Font font,
Color.yellow)
راست چین یا وسط چین بودن عنوان را، چپ چین،titleJustification . نوع حاشیه کنترل را مشخص میکندBorder
LEFT
CENTER
RIGHT
: باال یا پایین قرار گرفتن عنوان را مشخص میکند و مقادیر زیر را میپذیردtitlePosition
TOP
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 110
ABOVE_TOP
BELOW_TOP
BOTTOM
ABOVE_BOTTOM
BELLOW_BOTTOM
برای درک بهتر استفاده از کالس فوق و ثابتهای آن به مثال. رنگ آن را مشخص میکندColor نوع و اندازه فونت عنوان وFont
1 package myfirstprogram;
2
3 import java.awt.*;
4 import javax.swing.*;
5 import javax.swing.border.*;
6
7 public class MyFirstProgram
8 {
9 public static void main(String[] args)
10 {
11 JFrame frame1 = new JFrame("TitledBorder Demo");
12 frame1.setLayout(new GridLayout(3, 3));
13 frame1.setSize(600 , 450);
14
15 JPanel Panel1 = new JPanel();
16 Panel1.setBorder(new TitledBorder
17 (null, "Title", TitledBorder.LEFT, TitledBorder.TOP));
18 JPanel Panel2 = new JPanel();
19 Panel2.setBorder(new TitledBorder
20 (null, "Title", TitledBorder.LEFT, TitledBorder.ABOVE_TOP));
21 JPanel Panel3 = new JPanel();
22 Panel3.setBorder(new TitledBorder
23 (null, "Title", TitledBorder.LEFT, TitledBorder.BELOW_TOP));
24 JPanel Panel4 = new JPanel();
25 Panel4.setBorder(new TitledBorder
26 (null, "Title", TitledBorder.CENTER, TitledBorder.TOP));
27 JPanel Panel5 = new JPanel();
28 Panel5.setBorder(new TitledBorder
29 (null, "Title", TitledBorder.CENTER, TitledBorder.ABOVE_TOP));
30 JPanel Panel6 = new JPanel();
31 Panel6.setBorder(new TitledBorder
32 (null, "Title", TitledBorder.CENTER, TitledBorder.BELOW_TOP));
33 JPanel Panel7 = new JPanel();
34 Panel7.setBorder(new TitledBorder
35 (null, "Title", TitledBorder.RIGHT, TitledBorder.TOP));
36 JPanel Panel8 = new JPanel();
37 Panel8.setBorder(new TitledBorder
38 (null, "Title", TitledBorder.RIGHT, TitledBorder.ABOVE_TOP));
39 JPanel Panel9 = new JPanel();
40 Panel9.setBorder(new TitledBorder
41 (null, "Title", TitledBorder.RIGHT, TitledBorder.BELOW_TOP));
42
43 frame1.add(Panel1);
44 frame1.add(Panel2);
45 frame1.add(Panel3);
116 SWING
46 ;)frame1.add(Panel4
47 ;)frame1.add(Panel5
48 ;)frame1.add(Panel6
49 ;)frame1.add(Panel7
50 ;)frame1.add(Panel8
51 ;)frame1.add(Panel9
52
53 ;)frame1.setVisible(true
54 }
55 }
در کد باال عنوان 6پنل را به حاالت مختلف مشخص کردهایم .خروجی کد باال به صورت زیر است:
با توجه به شکل متوجه میشوید که اگر بخواهید مثال عنوان شم ا در باالی پنل و سمت راست آن نمایش داده شود باید از کد زیر
استفاده کنید:
کلمههای TOPدر کد ابتدای درس را به BOTTOMتغییر داده و برنامه را اجرا و نتیجه را مشاهده کنید .رنگ و نوع فونت عنوان و
MatteBorder کالس
به. هم میتوان یک خط به دور کنترل کشید و هم به جای خط میتوان از آیکون استفاده کردMatteBorder با استفاده از کالس
سازنده این کالس به روشهای زیر.این نکته توجه کنید که قسمتی از فضای اصلی کنترل به وسیله خط یا آیکون اشغال میشود
MatteBorder(Icon)
MatteBorder(Inset, Color)
MatteBorder(Inset, Icon)
MatteBorder(top, left, bottom, right, Color)
MatteBorder(top, left, bottom, right, Icon)
1 package myfirstprogram;
2
3 import java.awt.*;
4 import javax.swing.*;
113 SWING
5 import javax.swing.border.*;
6
7 public class MyFirstProgram
8 {
9 public static void main(String[] args)
10 {
11 JFrame frame1 = new JFrame("Properties and Methods Demo");
12 frame1.setLayout(null);
13 JPanel panel1 = new JPanel();
14 JPanel panel2 = new JPanel();
15
16 panel1.setBounds(60, 40, 200, 150);
17 panel1.setBackground(Color.LIGHT_GRAY);
18
19 panel2.setBounds(270, 40, 200, 150);
20 panel2.setBackground(Color.LIGHT_GRAY);
21
22 frame1.add(panel1);
23 frame1.add(panel2);
24
25 panel1.setBorder(new MatteBorder(10, 10, 10, 10, Color.GREEN));
26
27 panel2.setBorder(new MatteBorder(new ImageIcon("C:\\FrameDemo\\icon.gif")));
28
29 frame1.setSize(540 , 284);
30 frame1.setVisible(true);
31 }
32 }
مهمترین خطوط. با اندازه و پس زمینه یکسان به آن اضافه کردهایمPanel ایجاد کرده و دوFrame کد باال یک33-51 در خطوط
هم به51 در خط. اولی کشیدهایمPanel پیکسل به دور33 یک خط سبز با پهنای51 میباشند که در خط51 و51 کد باال خطوط
: برنامه را اجرا و نتیجه را مشاهده کنید. آیکون را من از قبل در پوشه برنامه قرار دادهام.جای خط از آیکون استفاده کردهایم
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 115
کنترل JButton
وقتی که بر روی کنترل Buttonکلیک میکنیم دستوراتی اجرا میشود ،و این معمولترین استفاده ای است که از این کنترل
میشود .دکمهها به نوعی برای تأیید یا لغو یک عمل و یا باز کردن کادرهای محاوره ای به کار میروند .سازنده این کالس به
;)JButton(Action
;)JButton(String
;)JButton(Icon
;)JButton(String, Icon
کنترل Buttonدارای خواصی است که در جدول زیر تعدادی از این آنها ذکر شده است:
توضیح خواص
اگر مقدار این خاصیت falseباشد بر روی buttonنمیتوان کلیک کرد. enabled
مشخص میکند که آیا کنترل buttonدر روی فرم قابل رویت باشد یا نه visible
فقط با ویرایش خواص یک buttonنمیتوان از آن استفاده کرد .بلکه کنترل دکمه برای انجام برخی اعمال نیاز به واکنش به
توضیح رویداد
وقتی روی میدهد که نشانگر ماوس بر روی کنترل باشد و دکمه ماوس رو به پایین فشار داده شود. mousePressed
.وقتی روی میدهد که دکمه ماوس فشار داده شده و رها شود mouseReleased
اجازه دهید که با ایجاد. میباشدactionPerformed همانطور که قبال مشاهده کردید رویداد پیشقرض کنترل دکمه رویداد
میخواهیم برنامه ای بنویسیم که در آن وقتی که با ماوس بر روی یک دکمه رفتیم و.برنامههایی با رویدادهای دیگر نیز آشنا شویم
: به کد زیر توجه کنید.یا نشانگر ماوس را از آن خارج کردیم متن داخل دکمه تغییر کند
1 package myfirstprogram;
2
3 import javax.swing.*;
4 import java.awt.event.*;
5
6 public class MyFirstProgram
7 {
8 public static void main(String[] args)
9 {
10 JFrame frame1 = new JFrame("Button Demo");
11 frame1.setLayout(null);
12 final JButton button1 = new JButton("buttonSample");
13
14 button1.setBounds(85, 80, 157, 60);
15
16 MouseAdapter MouseAdapter1 = new MouseAdapter()
17 {
18 @Override
19 public void mouseEntered(MouseEvent evt)
20 {
21 button1.setText("Mouse has entered!");
22 }
23
24 @Override
25 public void mouseExited(MouseEvent evt)
26 {
27 button1.setText("Mouse has Left!");
28 }
29 };
30
31 button1.addMouseListener(MouseAdapter1);
32
33 frame1.add(button1);
34
35 frame1.setSize(356 , 263);
36 frame1.setVisible(true);
37 }
38 }
آن را33 یک دکمه ایجاد کرده و در خط35 در خط. یک فریم ایجاد کرده و هیچ الیه بندی برای آن در نظر نمیگیریم33 و33 در خط
همانطور که می دانید برای اینکه. حال نوبت به قسمت مهم برنامه میرسد.نسبت به گوشه باال و سمت چپ فریم تراز میکنیم
کالسی که قرار است رابط را پیاده سازی کند کالس. توسط یک کالس پیاده سازی شودInterface رویدادی اتفاق بیفتد باید یک
در نتیجه این پیاده سازی باید کدهایی برای بدنه متدهای این رابطها هم در نظر گرفته شود .چون ما با دو متد )(MouseEntered
و )( MouseExitedسر و کار داریم پس باید کدهای بدنه این دو متد را هم فراهم کنیم .پس در کل یک شیء از کالس
MouseAdapterدر خط 31ایجاد کرده و در دو متد )( MouseEnteredو )( MouseExitedدر خطوط 53و 51متن داخل دکمه
را تغییر میدهیم .حال میخواهیم این شیء را به دکمه بچسبانیم .این کار را با استفاده از متد )( addMouseListenerدر خط
13انجام میدهیم .در خط 11هم دکمه را به فریم اضافه میکنیم .حال برنامه را اجرا کنید .مشاهده میکنید که با قرار گرفت اشاره
گر ماوس بر روی کنترل buttonخاصیت textآن تغییر میکند .و از طرف دیگر وقتی که اشاره گر از کنترل دکمه دور میشود این
کنترل JLabel
کنترل Labelبرای اضافه کردن یک متن به فرم بکار میرود .این متن میتواند حاوی یک پیام و یا توضیحی در باره عملکرد سایر
)JLabel(Icon
)JLabel(String
)JLabel(Icon, horizontalAlignment
)JLabel(String, horizontalAlignment
)JLabel(String, Icon, horizontalAlignment
خاصیت textمهمترین خاصیت آن میباشد چون هدف اصلی از استفاده از این کنترل نشان دادن متن در فرم است .این متن را
برای ترازبندی Labelهم میتوان از رابط SwingConstantsبه صورت زیر استفاده کرد:
و یا به صورت
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 111
رویدادهایی هم برای این کنترل وجود دارد که اکثر مواقع به آن نیازی نیست و در نتیجه در مورد آنها بحث نمیکنیم.
کنترل TextFieldابتداییترین وسیله برای ورود اطالعات در یک فرم ویندوزی میباشد .این کار را با تایپ آنها (اطالعات) در
)(JTextField
)JTextField(String
)JTextField(Column
)JTextField(String,Column
)JTextField(Document,String,Column
میخواهیم با یک مثال نحوه استفاده از TextFieldرا به شما نشان دهیم .برنامه از شما میخواهد که دو عدد را وارد کنید و با
زدن دکمه جمع آنها در TextFieldسومی نشان دهید .حال به طراحی برنامه میپردازیم .به کد زیر توجه کنید:
آن را به چهار سطر و دو ستون تقسیم31 ایجاد و در خطPanel یک31 در خط. ایجاد کردهایمFrame یک35 در کد باال و در خط
ها و دکمه محاسبه را ایجاد وTextField هم53-11 در خطوط. پنل را تقریبا به وسط فریم انتقال دادهایم30 در خط.نمودهایم
یک کالس به نام10-31 ابتدا در خطوط. میباشد10-36 بخس مهم کد باال خطوط. اضافه کردهایمPanel به
این رابط دارای متدی به نام. را پیاده سازی میکندActionListener تعریف کردهایم که رابطMyActionListener
فراهمMyActionListener حال وظیفه کالس. که زمانی فراخوانی میشود که بر روی کنترلی کلیک شودactionPerformed()
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 110
کردن کدهایی برای بدنه این متد میباشد .این کدها که در خطوط 31-31مشاهده میکنید همان عملیان جمع TextFieldها
میباشند .در خطوط 31و 33با استفاده از متد )( getTextمقادیر ورودی کاربر را دریافت کرده و برای اینکه بتوان بر روی آنها
عملیات جمع را انجام داد با استفاده از متد )( parseDoubleاز کالس Doubleآنها را به نوع اعشار تبدیل میکنیم .چون قرار
است که نتیجه در TextFieldنمایش داده شود در خط 31و با استفاده از متد و کالس )( String.valueOfحاصل جمع را
به نوع رشته تبدیل و در TextFieldسوم نمایش میدهیم .در خط 36هم شیئ از کالس MyActionListenerرا به
متد )( addActionListenerارسال میکنیم تا دکمه درست کار کند .حال برنامه را اجرا و با وارد کردن دو عدد نتیجه را مشاهده
کنید:
در ادامه آموزش کنترل JTextFieldمیخواهیم رویداد TextChangedزبان سی شارپ را به وسیله جاوا پیاده سازی کنیم .برنامه
به این صورت است که وقتی متنی در داخل JTextFieldنوشته میشود ،همزمان در داخل یک کنترل JLabelهم نوشته شود.
برای. است را به آن اضافه کردهایمLabel و یکTextField که حاوی یکPanel یک فریم ایجاد و یک کنترل33-53 در خطوط
توسط یک کالس پیاده سازی شود که ما این کار را در خطDocumentListener کار با متن یا به عبارتی تغییرات متن باید رابط
changedUpdate()
insertUpdate()
removeUpdate()
: در داخل بدنه دو متد آخر کد زیر را مینویسیم.که ما برای پیاده سازی رویداد مذکور به دو به دو متد آخر نیاز داریم
Label1.setText(TextField1.getText());
به متد10 را در خطMydocumentListener سپس یک نمونه از کالس. انجام دادهایم13 و13 کاری که در خطوط
نوشته و نتیجه را مشاهده نماییدTextField حال برنامه را اجرا و متنی را در داخل. ارسال میکنیمaddDocumentListener()
:
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 113
استفادهJTextField به جایJPasswordField شما باید از کنترل، شما میخواهد یک پسورد را بپذیردTextField اگر
public JPasswordField()
public JPasswordField(String text)
public JPasswordField(int columnWidth)
public JPasswordField(String text, int columnWidth)
public JPasswordField(Document model, String text, int columnWidth)
:هر کاراکتری را که در داخل این کنترل بنویسید آن را به صورت ستاره ( * ) نمایش میدهد
JTextArea کنترل
113 SWING
کنترل JTextAreaرا به نوعی میتوان یک JTextFieldدر نظر گرفت با این تفاوت که در JTextFieldورودیهای کاربر در
یک خط نوشته میشدند در حالیکه در JTextAreaمیتوان ورودیها را در چند خط نوشت JTextArea .دارای یک خاصیت و
آن هم textمیباشد .در ا ین کنترل به صورت توکار دارای اسکرول نیست و اگر متن وارد شده توسط کاربر زیاد باشد برای مشاهده
تمام متن باید از کنترل JScrollPaneاستفاده کرد .سازنده این کالس به روشهای زیر مقدار دهی میشود:
public )(JTextArea
public )JTextArea(Document document
public )JTextArea(String text
public )JTextArea(int rows, int columns
public )JTextArea(String text, int rows, int columns
public )JTextArea(Document document, String text, int rows, int columns
توضیح خاصیت
مشخص میکند که زمانیکه به آخر یک سطر در Textareaرسیدیم بقیه متن در سطر بعدی نوشته شود یا نه lineWrap
مشخص میکند که با هر بار زدن دکمه Tabنشانگر ماوس چند کاراکتر به جلو رانده شود. tabSize
توضیح متد
قسمتی از متن Textareaرا انتخاب میکند .این متد دو عدد میگیرد که یکی نشان دهنده نقطه )(select
متنی را که توسط کاربرselect() متد،برای مثال. برای متن انتخاب شده استفاده میشوندTextarea بیشتر متدهای کنترل
select(selectionStart, selectionEnd)
1 package myfirstprogram;
2
3 import java.awt.*;
4 import javax.swing.*;
5
6 public class MyFirstProgram
7 {
8 public static void main(String[] args)
9 {
10 JFrame frame1 = new JFrame("JTextArea Demo");
11
12 JTextArea TextArea1 = new JTextArea("JAVA programming is fun!");
13
14 TextArea1.select(5, 16);
15
16 JPanel Panel1 = new JPanel();
17 Panel1.setLayout(new BorderLayout());
18 Panel1.add(TextArea1, BorderLayout.CENTER);
19 frame1.add(Panel1);
20 frame1.setSize(356 , 263);
21 frame1.setVisible(true);
22 }
23 }
برنامه را. آن را انتخاب کردهایم31 تا اندیس1 از اندیس33 اضافه و در خطTextArea کد باال یک متن پیشفرض به35 در خط
:اجرا کنید
111 SWING
وقتی ما یک متن را انتخاب میکنیم ،میتوانیم متن انتخاب شده را به وسیلهی تعدادی متد که بر روی متن انتخاب شده کار
میکنند قالب بندی کنیم .برای مثال ،شما میتوانید برای تغییر رنگ متن انتخاب شده از متد )( setSelectedTextColorاستفاده
کنید.همچنین میتوانید برای تغییر رنگ پس زمینهی آن از متد )( setSelectionColorاستفاده کنید .بعد از خط 33کد باال
;)TextArea1.setSelectedTextColor(Color.RED
;)TextArea1.setSelectionColor(Color.YELLOW
کنترل JRadioButton
کنترل JRadioButtonیا دکمه رادیویی دکمه ای است که دارای دو حالت خاموش و روشن میباشد .دکمهی JRadioButton
یک دکمهی دایره ای شکل به همراه یک برچسب است .شما با کلیک کردن بر روی دکمهی JRadioButtonمیتوانید آنرا از حالت
خاموش به روشن ویا بلعکس تغییر دهید .وقتی که یک دکمهی JRadioButtonروشن باشد ،یک نقطه در وسط آن قرار میگیرد،
دکمههای رادیویی معموال زمانی استفاده میشوند که یک کاربر میبایست از بین چند گزینه یکی از آنها را انتخاب کند .برای مثال:
زمانی که شما بخواهید جنسیت کاربر را مشخص کنید ،میتوانید از دو دکمه رادیویی با نامهای مرد و زن استفاده کنید .وقتی که
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 113
بهJRadioButton سازنده کالس. فقط میتوانید یکی از آن دو را انتخاب کنید،شما از دکمههای رادیویی استفاده کردید
public JRadioButton()
public JRadioButton(Icon icon)
public JRadioButton(Icon icon, boolean selected)
public JRadioButton(String text)
public JRadioButton(String text, boolean selected)
public JRadioButton(String text, Icon icon)
public JRadioButton(String text, Icon icon, boolean selected)
public JRadioButton(Action action)
1 package myfirstprogram;
2
3 import java.awt.*;
4 import javax.swing.*;
5 import java.awt.event.*;
6
7 public class MyFirstProgram
8 {
9 public static void main(String[] args)
10 {
11 final JFrame frame1 = new JFrame("JRadioButton Demo");
12
13 JPanel Panel1 = new JPanel();
14 Panel1.setLayout(new GridLayout(3,1));
15
16 final JRadioButton radioButtonYes = new JRadioButton("Yes");
17 final JRadioButton radioButtonNo = new JRadioButton("NO");
18 JButton buttonShow = new JButton("Show Choice");
19
20 ButtonGroup ButtonGroup1 = new ButtonGroup();
21 ButtonGroup1.add(radioButtonYes);
22 ButtonGroup1.add(radioButtonNo);
23
24 Panel1.add(radioButtonYes);
25 Panel1.add(radioButtonNo);
26 Panel1.add(buttonShow);
27
28 frame1.add(Panel1);
29
30 class SelectedRadio implements ActionListener
31 {
32 @Override
33 public void actionPerformed(ActionEvent e)
34 {
35 if (radioButtonYes.isSelected())
36 {
37 JOptionPane.showMessageDialog(frame1, "You choosed Yes!");
38 }
39 else if (radioButtonNo.isSelected())
40 {
41 JOptionPane.showMessageDialog(frame1,"You choosed No!");
42 }
43 }
44 }
111 SWING
45
46 ;))(buttonShow.addActionListener(new SelectedRadio
47
48 ;)frame1.setSize(356 , 263
49 ;)frame1.setVisible(true
50 }
51 }
هدف از کد باال این است که با کلیک بر روی یک دکمه یک پیام مبنی بر انتخاب یک دکمه به کاربر نمایش داده شود .در خطوط -33
33یک Frameو یک Panelو در خطوط 31-30دو عدد دکمهی رادیویی با نامهای radioButtonYesو radioButtonNoو یک
کنترل Buttonبا نام buttonShowایجاد کردهایم .این دکمهها را در خطوط 53-51به Panelاضافه میکنیم .در جاوا به طور
همزمان میتوان دو دکمه رادیویی را در حالت انتخاب قرار داد ،در حالیکه انتظاری که ما از دکمههای رادیویی داریم این است که
همزمان یکی از آنها قابل انتخاب باشد .برای رفع این مشکل در جاوا کالسی به نام ButtonGroupوجود دارد که با اضافه کردن
دکمهها به یک شیء از این کالس (خطوط )53-55این امکان را به وجود میآوریم که همزمان یکی از دکمهها انتخاب شود .برای
اداره رویداد کلیک دکمه در خطوط 13-33یک کالس ایجاد میکنیم که رابط ActionListenerرا پیاده سازی میکند .سپس در
داخل بدنه متد )( actionPerformedمربوط به این رابط هم کدهای خطوط 11-35را مینویسیم.
وقتی که شما بر روی buttonShowکلیک میکنید ،برنامه تعیین میکند که کدام JRadioButtonانتخاب شده است .شما
میتوانید این کار را به وسیلهی متد )( isSelectedانجام دهید .این متد در صورتیکه یک کنترل انتخاب شده باشد مقدار true
در غیر اینصورت falseرا بر میگرداند .ما از یک عبارت شرطی ifبرای تعیین اینکه JRadioButtonانتخاب شده است یا خیر
استفاده میکنیم .اگر آن انتخاب نشده باشد ،پس دکمهی JRadioButtonی دیگر انتخاب شده است .چون ما فقط دو دکمهی
کنترل JCheckBox
کنترل JCheckBoxیک دکمه است و به شکل یک جعبهی خالی به همراه یک برچسب در کنار آن نمایش داده میشود .در حالت
عادی ،زمانی که بر روی جعبهی خالی کلیک شود ،یک تیک در داخل جعبه نمایان میشود که به ما میگوید کنترل JCheckBox
در حالت Selectedقرار دارد .برخالف دکمهی Radioکه فقط اجازهی انتخاب یکی از Radioهای فرم را به ما میداد ،شما
میتوانید چند عدد CheckBoxو یا همهی آنها را تیک بزنید .سازنده کالس JCheckBoxبه روشهای زیر مقداردهی میشود
:
111 SWING
public JCheckBox()
public JCheckBox(Icon icon)
public JCheckBox(Icon icon, boolean selected)
public JCheckBox(String text)
public JCheckBox(String text, boolean selected)
public JCheckBox(String text, Icon icon)
public JCheckBox(String text, Icon icon, boolean selected)
public JCheckBox(Action action)
در نتیجه شما به سادگی میتوانید از متد، (تیک خورده و تیک نخورده) را قبول کندOff یاOn دو حالتJCheckBox
تیک نخوردهJCheckBox به معنی اینکهFalse تیک خورده وJCheckBox به معنی اینکهTrue که دو مقدارisSelected()
: را مشاهده میکنیدCheckBox در مثال زیر نحوهی کاربرد کنترل. استفاده کنید،است را بر میگرداند
1 package myfirstprogram;
2
3 import java.awt.*;
4 import javax.swing.*;
5 import java.awt.event.*;
6
7 public class MyFirstProgram
8 {
9 public static void main(String[] args)
10 {
11 final JFrame frame1 = new JFrame("JCheckBox Demo");
12
13 JPanel Panel1 = new JPanel();
14 Panel1.setLayout(new GridLayout(4,1));
15
16 final JCheckBox CheckBox1 = new JCheckBox("Soap");
17 final JCheckBox CheckBox2 = new JCheckBox("Shampoo");
18 final JCheckBox CheckBox3 = new JCheckBox("Toothpaste");
19 JButton buttonShow = new JButton("Show Choice");
20
21 Panel1.add(CheckBox1);
22 Panel1.add(CheckBox2);
23 Panel1.add(CheckBox3);
24 Panel1.add(buttonShow);
25
26 frame1.add(Panel1);
27
28 class SelectedCheckBox implements ActionListener
29 {
30 @Override
31 public void actionPerformed(ActionEvent e)
32 {
33 String items = "";
34 if (CheckBox1.isSelected())
35 {
36 items += "\n Soap";
37 }
38 if (CheckBox2.isSelected())
39 {
40 items += "\n Shampoo";
41 }
42 if (CheckBox3.isSelected())
43 {
44 items += "\n Toothpaste";
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 110
45 }
46 ;)JOptionPane.showMessageDialog(frame1, items
47 }
48 }
49
50 ;))(buttonShow.addActionListener(new SelectedCheckBox
51
52 ;)frame1.setSize(356 , 263
53 ;)frame1.setVisible(true
54 }
55 }
در کد باال قرار است که وقتی کاربر چک باکسها را انتخاب و سپس بر روی دکمه کلیک کرد نام چک باکسهای انتخاب شده
نمایش داده شود .در خطوط 33-51یک Frameایجاد کردهایم .سپس سه کنترل JCheckBoxو یک دکمه را به یک Panelو
خود Panelرا به Frameاضافه نمودهایم .برای اداره رویداد کلیک دکمه در خطوط 13-33یک کالس ایجاد میکنیم که رابط
ActionListenerرا پیاده سازی میکند .سپس در داخل بدنه متد )( actionPerformedمربوط به این رابط هم کدهای خطوط
11-31را مینویسیم .در این کد ،یک متغیر از نوع رشته ای تعریف کردهایم و آنرا با یک رشتهی تهی مقدار دهی کردهایم .سپس
چک میکنیم که کدام یک از چک باکسها تیک خوردهاند ،هر کدام از آنها که تیک خوردهاند نامشان به وسیلهی عملگر =+در
رشته ای که قبال به صورت تهی تعریف کردهایم قرار میگیرد .سپس به وسیلهی یک پیغام ) (JOptionPaneنتایج را در خروجی
نمایش میدهیم.
116 SWING
JPanel کنترل
: سازنده این کالس به روشهای زیر مقداردهی میشود. معموال برای گروه بندی کنترلهای فرم بکار میرودJPanel کنترل
public JPanel()
public JPanel(boolean isDoubleBuffered)
public JPanel(LayoutManager manager)
public JPanel(LayoutManager manager, boolean isDoubleBuffered)
با توجه به اینکه فقط یکی از. را گروه بندی کنیدRadio این است که شما میخواهید دکمههایPanel یکی از کاربردهای خوب
شما میتوانید با گروه بندی کردن آنها بیش از یک دکمهی ، در فرم میتواند فعال باشدJRadioButton دکمههای
JPanel آن کنترل به فرزند، قرار میدهیدJPanel وقتی که شما کنترلی را در داخل یک. فعال داشته باشیدJRadioButton
، بر درک این مساله کافیست، بر درک این مساله کافیست به عنوان مثال. به والد کنترل تبدیل میشودJPanel تبدیل میشود و
: به کد زیر توجه کنید. قرار دارد به همراه آن حرکت میکندJPanel هر کنترلی که در داخل. را تغییر اندازه دهیدJPanel
1 package myfirstprogram;
2
3 import java.awt.*;
4 import javax.swing.*;
5 import javax.swing.border.*;
6
7 public class MyFirstProgram
8 {
9 public static void main(String[] args)
10 {
11 JFrame frame1 = new JFrame("JCheckBox Demo");
12 frame1.setLayout(new GridLayout(1,2));
13
14 JPanel Panel1 = new JPanel();
15 Panel1.setLayout(new GridLayout(2,1));
16 Panel1.setBorder(new TitledBorder
17 (new MatteBorder(1, 1, 1, 1, Color.lightGray),"Group One"));
18
19 JPanel Panel2 = new JPanel();
20 Panel2.setLayout(new GridLayout(2,1));
21 Panel2.setBorder(new TitledBorder
22 (new MatteBorder(1, 1, 1, 1, Color.lightGray),"Group Two"));
23
24 JRadioButton JRadioButton1 = new JRadioButton("JRadioButton1");
25 JRadioButton JRadioButton2 = new JRadioButton("JRadioButton2");
26 JRadioButton JRadioButton3 = new JRadioButton("JRadioButton3");
27 JRadioButton JRadioButton4 = new JRadioButton("JRadioButton4");
28
29 ButtonGroup ButtonGroup1 = new ButtonGroup();
30 ButtonGroup1.add(JRadioButton1);
31 ButtonGroup1.add(JRadioButton2);
32
33 ButtonGroup ButtonGroup2 = new ButtonGroup();
34 ButtonGroup2.add(JRadioButton3);
35 ButtonGroup2.add(JRadioButton4);
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 103
36
37 ;)Panel1.add(JRadioButton1
38 ;)Panel1.add(JRadioButton2
39
40 ;)Panel2.add(JRadioButton3
41 ;)Panel2.add(JRadioButton4
42
43 ;)frame1.add(Panel1
44 ;)frame1.add(Panel2
45
46 ;)frame1.setSize(356 , 263
47 ;)frame1.setVisible(true
48 }
49 }
در کد باال و در خطوط 33-55یک Frameو دو Panelو در خطوط 31و 53دو حاشیه هم به Panelها همراه با عنوان برای آنها
ایجاد کردهایم .در خطوط 53-11چهار دکمه رادیویی ایجاد کرده و آنها را در دو گروه ،گروه بندی میکنیم (خطوط .)56-11گروه
قرار میدهیم (خطوط .)11-33حال برنامه را اجرا و نتیجه را با انتخاب دکمهها مشاهده کنید :
کنترل JComboBox
103 SWING
کنترل. (نوار کرکره ای ) روش دیگری است که به کاربر اجازه دهید از بین گزینههای مختلف یکی را انتخاب کندJComboBox کنترل
، وقتی بر روی دکمهی آن کلیک شود. است که در سمت راست آن یک دکمه قرار داردTextBox شبیه یک کنترلJComboBox
کاربر میتواند از بین این. یک نوار کرکره ای را که حاوی یک لیست از گزینههای مختلف است را نمایش میدهدJComboBox
سازنده این کالس به روشهای زیر. تبدیل میشودJComboBox مورد انتخاب شده به متن داخل.گزینهها یکی را انتخاب کند
:مقداردهی میشود
public JComboBox()
public JComboBox(Object listData[])
public JComboBox(Vector listData)
public JComboBox(ComboBoxModel model)
1 package myfirstprogram;
2
3 import javax.swing.*;
4 import java.awt.event.*;
5
6 public class MyFirstProgram
7 {
8 public static void main(String[] args)
9 {
10 final JFrame frame1 = new JFrame("JComboBox Demo");
11 JPanel Panel1 = new JPanel();
12 final JComboBox ComboBox1 = new JComboBox();
13 Panel1.add(ComboBox1);
14 frame1.add(Panel1);
15
16 ComboBox1.addItem("Johnny");
17 ComboBox1.addItem("Kenneth");
18 ComboBox1.addItem("Mark");
19 ComboBox1.addItem("Ralph");
20 ComboBox1.addItem("Sussie");
21
22 class MyItemListener implements ActionListener
23 {
24 public void actionPerformed(ActionEvent e)
25 {
26 String selectedName = ComboBox1.getSelectedItem().toString();
27 JOptionPane.showMessageDialog(frame1, selectedName);
28 }
29 }
30
31 ComboBox1.addActionListener(new MyItemListener() );
32
33 frame1.setSize(430 , 315);
34 frame1.setVisible(true);
35 }
36 }
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 105
کال هدف از برنامه باال این است که با کلیک بر روی هر آیتم از JComboBoxمقدار آن به صورت پیام نمایش داده شود .در خطوط
33-33کد باال یک ،Frameیک Panelو یک ComboBoxایجاد کردهایم .در خطوط 31-53آیتمهایی را که قرار است به JComboBox
اضافه شوند را با استفاده از متد )( addItemاضافه میکنیم .چون که قرار است با کلیک بر روی آیتمهای کمبوباکس پیام نمایش
داده شود پس باید رابط ActionListenerتوسط یک کالس پیاده سازی شود .این کار را در خط 55انجام دادهایم .در خطوط
51-51هم کدهای بدنه متد )( actionPerformedاین رابط را فراهم میکنیم .در خط 51یک رشته تعریف کردهایم و با استفاده
از متد )( getSelectedItemکنترل JComboBoxمقدار آیتم انتخاب شده را در داخل این رشته میریزیم .در خط 51هم با
استفاده از کالس JOptionPaneمقدار این رشته که همان آیتم انتخاب شده کمبوباکس است را نمایش میدهیم:
برای اضافه کردن آیتمها به کمبوباکس به صورت زیر هم میتوان عمل کرد:
در این روش یک آرایه از نوع رشته تعریف و سپس آیتمهای مورد نظرتان را به آن اضافه میکنید .سپس نام آرایه را به سازنده
کالس JComboBoxارسال میکنید .آیتمهای کمبوباکس دارای اندیس هستند و این اندیسها از صفر شروع میشوند .اندیس
101 SWING
اولین آیتم ،3اندیس دومین آیتم 3و … .برای به دست آوردن اندیس آیتم انتخاب شده از متد )(getSelectedIndex
کنترل JList
کنترل JListبرای نمایش لیستی از آیتمها که قابل انتخاب هستند استفاده میشود.این آیتمها را میتوانید به صورت تکی و
گروهی انتخاب کنید .کنترل JListبهترین گزینه برای مواقعی است که شما میخواهید تعداد زیادی آیتم را در ستونهای افقی
و عمودی نمایش دهید .سازنده این کالس به روشهای زیر مقداردهی میشود:
)(public JList
)][public JList(Object listData
)public JList(Vector listData
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 103
:برای آشنایی بیشتر با خاصیتها و متدهای این کنترل به مثال زیر توجه کنید
1 package myfirstprogram;
2
3 import javax.swing.*;
4
5 public class MyFirstProgram
6 {
7 public static void main(String[] args)
8 {
9 JFrame frame1 = new JFrame("JList Demo");
10 JPanel Panel1 = new JPanel();
11 JList List1 = new JList();
12 Panel1.add(List1);
13 frame1.add(Panel1);
14
15 String[] items = { "Johnny", "Kenneth", "Mark", "Ralph", "Sussie" };
16 List1.setListData(items);
17
18 frame1.setSize(430 , 315);
19 frame1.setVisible(true);
20 }
21 }
JList حال نوبت به اضافه کردن آیتمها به. ایجاد کردهایمJList وPanel ،Frame سه کنترل6-31 در کد باال و در خطوط
setListData() این آرایه را به متد31 در خط. یک آرایه رشته ای تعریف و آیتمها را به آن اضافه میکنیم31 در خط.میرسد
: میتوان از کد زیر استفاده کرد31 و31 به جای خطوط. اضافه میکندJList ارسال میکنیم و این متد آیتمها را به
List1.setModel(DefaultListModel1);
با استفاده. میباشدJList کالسی است که دارای متدهایی برای حذف و اضافه و در کل دستکاری آیتمهایDefaultListModel
ارسالsetListData() آیتمها را به یک شیء از کالس مذکور اضافه و سپس این شیء را به متدaddElement() از متد
کالس DefaultListModelدارای متد )( removeبرای حذف یک آیتم میباشد این متد اندیس آیتمی را که میخواهید حذف
;)DefaultListModel1.remove(2
برای حذف چند آیتم از JListهم میتوان از متد )( removeRangeکه اندیس شروع و پایان آیتمهایی که پشت سر هم هستند
;)DefaultListModel1.removeRange(2,4
در حالت پیشفرض با گرفتن دکمه Ctrlکیبورد و کلیک بر روی آیتمها میتوان چند آیتم را به طور همزمان انتخاب کرد ولی اگر
بخواهید فقط یک آیتم قابل انتخاب باشد میتوانید از متد )( setSelectionModeو ارسال مقدار ثابت SINGLE_SELECTION
از رابط ListSelectionModelبه آن استفاده کرد.همان کد ابتدای درس را در در نظر بگیرید .در خط 31کد فوق کدهای زیر را
بنویسید:
;)List1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION
برای تعیین عرض و ارتفاع آیتمها از متدهای )( setFixedCellWidthبرای تعیین عرض و )( setFixedCellHeightبرای
;)List1.setFixedCellWidth(100
;)List1.setFixedCellHeight(50
برای نمایش سطری و ستونی آیتمها میتوان از متدهای )( setLayoutOrientationبرای تعیین نحوه چیدمان افقی یا عمودی
آیتمها و )( setVisibleRowCountبرای تعیین سطرهای JListکه قرار است آیتمها در آنها نمایش داده شوند استفاده کرد.
;)List1.setLayoutOrientation(JList. HORIZONTAL_WRAP
;)List1.setVisibleRowCount(2
مقدار HORIZONTAL_WRAPباعث چینش افقی آیتمها میشود .آیتمها به طور خودکار طوری در ستونها قرار میگیرند که تعداد
و )(setSelectionBackground متدهای از هم آیتمها فونت رنگ و زمینه پس رنگ تعیین برای
;)List1.setSelectionBackground(Color.RED
;)List1.setSelectionForeground(Color.WHITE
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 100
کنترل JSpinner
کنترل JSpinnerعموما برای دریافت اعداد از ورودی و محدود کردن کاربران برای وارد کردن مقادیر عددی بکار میرود .کنترل
JSpinnerاز لحاظ شکل ظاهری شبیه به کنترل TextBoxاست با این تفاوت که دکمههایی به شکل پیکان در سمت چپ یا
راست آن برای افزایش و یا کاهش مقدار کنترل وجود دارند .مقدار عددی کنترل JSpinnerمیتواند از نوع اعشاری یا صحیح
)(public JSpinner
)public JSpinner(SpinnerModel model
حال میخواهیم یک برنامه بسازیم که کنترل JSpinnerدر آن بکار رفته باشد .به کد زیر توجه کنید:
با نامهایJSpinner دو،Label دو،Panel دو،Frame فقط یک. کار خاصی انجام ندادهایم33-13 در کد باال و در خطوط
میتوان گفت که تنها نکته کد باال در خطوط. و یک دکمه ایجاد کردهایمSpinnerUpDownQuantity وSpinnerUpDownPrice
، یک واحد از مقدار پیشفرض آن یعنی صفرJSpinner در حالت پیشفرض با زدن دکمههای پایین و باالی. نهفته است51 و53
SpinnerNumberModel برای محدود کردن کاربران به یک محدود خاص از اعداد از کالس.کم یا یک واحد به آن اضافه میشود
همانطور که در کد باال. وارد میشود را محدود میکندJSpinner این کالس ورودیهایی که توسط کاربر در.استفاده میشود
دو عدد بعدی،JSpinner پارامتر میگیرد که اولین عدد مبنای شروع افزایش و کاهش عدد3 مشاهده میکنید سازنده این کالس
این. استJSpinner محدوده ای است که ورودیهای کاربر در آن قرار میگیرند و چهارمین عدد هم مقدار افزایش و کاهش عدد
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 163
اعداد همگی میتوانند هم doubleو هم intباشند .در خطوط 55و 53هم اشیاء ساخته شده از این کالس را به سازنده کنترل
در خط 53آخرین پارامتر Pricemodelبرابر با 3.13قرار دادهایم ،بنابراین مقدار SpinnerUpDownPriceبه اندازه 3.13واحد
کم یا زیاد میشود .مقدار سومین پرامتر یعنی نهایت عددی که کاربر میتواند وارد کند 3333است ،پس قیمت ) (Priceبه آن
از آنجاییکه نهایت مقدار Quantitymodelرا برابر 333قرار دادهایم بنابراین شما میتوانید فقط مقادیری نهایتا تا 333را در
SpinnerUpDownQuantityوارد کنید .چون میخواهیم با وارد کردن دو مقدار در دو JSpinnerو سپس زدن دکمه پیامی نمایش
داده شود باید رویداد کلیک دکمه را مدیریت کنیم .این کار را در خطوط 11-13انجام دادهایم .در خطوط 33و 33مقادیری را که در
دو JSpinnerتوسط کاربر وارد شده است را توسط متد )( getValueبه دست میآوریم و سپس با عمل castبه نوع double
و intتبدیل میکنیم .سپس در خط 33حاصلضرب این دو مقدار را در متغیر totalریخته و مقدار این متغیر را در خط 31چاپ
میکنیم:
163 SWING
JSlider کنترل
ناحیه. شبیه یک نوار لغزنده با یک دستگیره است که با استفاده از این دستگیره میتوان مقدار آن را تعیین کنیدJSlider کنترل
کاربر میتواند دستگیره به در جهت افقی حرکت دهد و. ای که دستگیره به آن اشاره میکند نشان دهنده مقدار جاری کنترل است
مقدار این کنترل در حالت افقی از سمت چپ به راست و در حالت.همچنین میتوان جهت حرکت را به صورت عمودی تغییر داد
: سازنده این کالس به روشهای زیر مقداردهی میشود.عمودی از پایین به باال افزایش مییابد
public JSlider()
public JSlider(int orientation)
public JSlider(int minimum, int maximum)
public JSlider(int minimum, int maximum, int value)
public JSlider(int orientation, int minimum, int maximum, int value)
public JSlider(BoundedRangeModel model)
: و استفاده از متدهای آن آمده استJSlider در زیر نحوه ایجاد و استفاده از
1 package myfirstprogram;
2
3 import javax.swing.*;
4
5 public class MyFirstProgram
6 {
7 public static void main(String[] args)
8 {
9 final JFrame frame1 = new JFrame("JSpinner Demo");
10 JPanel Panel1 = new JPanel();
11 JSlider Slider = new JSlider(JSlider.HORIZONTAL, 0, 255, 0);
12 Panel1.add(Slider);
13 frame1.add(Panel1);
14
15 Slider.setMinorTickSpacing(10);
16 Slider.setMajorTickSpacing(50);
17
18 Slider.setPaintLabels(true);
19 Slider.setPaintTicks(true);
20
21 frame1.setSize(364 , 146);
22 frame1.setVisible(true);
23 }
24 }
(JSlider.HORIZONTAL) به صورت افقیSlider ایجاد کردهایم و در داخل سازنده نحوه نمایشSlider کد باال یک33 در خط
در خطوط. آخر هم نقطه شروع اسالیدر میباشد3 هم بازه ای است که اسالیدر میگیرد و عدد511 و3 عدد. مشخص شده است
و از متدSlider ایجاد درجههای بزرگ بر رویsetMajorTickSpacing() از متد. هم این اسالیدر را درجه بندی کردهایم31-36
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 165
: برنامه را اجرا و نتیجه را مشاهده کنید. برای نمایش درجهها و برچسبهای آنها استفاده میشودsetPaintTicks()
. را تغییر داده تا عملکرد این آنها را بهتر درک کنید31 و31 ) و متدهای خطوط33 توصیه میشود که مقادیر موجود در سازنده (خط
حال اجازه دهید که یک. تغییر داده تا کاربرد این دو متد را متوجه شویدfalse را به30 و36 خطوطtrue همچنین مقادیر
به کد زیر توجه. تغییر کندPanel ها رنگ پس زمینه یکSlider باشد و با تغییر مقادیرSlider برنامه بنویسیم که دارای سه
:کنید
1 package myfirstprogram;
2
3 import java.awt.*;
4 import javax.swing.*;
5 import javax.swing.event.*;
6
7 public class MyFirstProgram
8 {
9 public static void main(String[] args)
10 {
11 final JFrame frame1 = new JFrame("JSlider Demo");
12 frame1.setLayout(new BorderLayout());
13
14 JPanel Panel1 = new JPanel();
15 Panel1.setLayout(new GridLayout(3,2));
16
17 JLabel Label1 = new JLabel("RED");
18 JLabel Label2 = new JLabel("GREEN");
19 JLabel Label3 = new JLabel("BLUE");
20
21 final JSlider SliderGreen = new JSlider(JSlider.HORIZONTAL,0,255,0);
22 final JSlider SliderRed = new JSlider(JSlider.HORIZONTAL,0,255,0);
23 final JSlider SliderBlue = new JSlider(JSlider.HORIZONTAL,0,255,0);
24 SliderGreen.setMinorTickSpacing(15);
25 SliderRed.setMinorTickSpacing(15);
26 SliderBlue.setMinorTickSpacing(15);
27 SliderGreen.setPaintTicks(true);
28 SliderRed.setPaintTicks(true);
29 SliderBlue.setPaintTicks(true);
30
31 Panel1.add(Label1);
32 Panel1.add(SliderRed);
161 SWING
33 Panel1.add(Label2);
34 Panel1.add(SliderGreen);
35 Panel1.add(Label3);
36 Panel1.add(SliderBlue);
37
38 final JPanel Panel2 = new JPanel();
39 Panel2.setPreferredSize(new Dimension(0,150));
40 Panel2.setBackground(Color.BLACK);
41
42 frame1.add(Panel1, BorderLayout.CENTER);
43 frame1.add(Panel2, BorderLayout.SOUTH);
44
45 class ColorPicker implements ChangeListener
46 {
47 public void stateChanged(ChangeEvent changeEvent)
48 {
49 int red = SliderRed.getValue();
50 int green = SliderGreen.getValue();
51 int blue = SliderBlue.getValue();
52 Color color = new Color(red, green, blue);
53 Panel2.setBackground(color);
54 }
55 }
56
57 SliderGreen.addChangeListener(new ColorPicker());
58 SliderRed.addChangeListener(new ColorPicker());
59 SliderBlue.addChangeListener(new ColorPicker());
60
61 frame1.setSize(450 , 300);
62 frame1.setVisible(true);
63 }
64 }
قرار دادهایم تا بتوانیم دو پنل راBorderLayout نحوه الیه بندی آن را35 ایجاد کردهایم و در خطFrame کد باال یک33 در خط
در خطوط. سطر و دو ستون تقسیم کردهایم1 آن را به31 اولین پنل را ایجاد و در خط33 در خط.در وسط و پایین آن قرار دهیم
چون کد رنگها. قرار دادهایم3-511 ایجاد و مقادیر آنها را بینSlider سه53-56 در خطوط. ایجاد کردهایمLabel سه31-36
وLabel 13-11 در خطوط.) میباشد511,511,511( ) و کد رنگ سفید3,3,3( مثال رنگ کد سیاه.در همین بازه قرار دارند
دوم را ایجاد کرده و یک ارتفاع به ان میدهیم و رنگPanel 10-33 در خطوط. اولی اضافه میکنیمPanel ها را بهSlider
دارند3 ها مقدارSlider چون زمانی که برنامه را اجرا میکنیم در حالت پیشفرض کل.پیشفرض پس زمینه آن را سیاه میدهیم
هنگام که دستگیره Sliderبه دو طرف حرکت میدهیم در اصل رابط ChangeListenerپیاده سازی میشود .این رابط را در خط
31توسط یک کالس پیاده سازی می کنیم و در داخل بدنه متد )( stateChangedاین رابط کدهای زیر را مینویسیم:
در کدهای باال با استفاده از متد )( getValueمقادیر هر یک از Sliderها را میگیریم .این مقادیر از نوع صحیح هستند .سپس
همین مقادیر را در خط 15به به سازنده کالس Colorارسال میکنیم .وظیفه این کالس ایجاد رنگ است .سپس یک شیء از این
کالس را به متد )( setBackgroundدر خط 11میدهیم تا رنگ را بر روی Panelدومی اعمال کند .و در آخر یک شیء از کالسی
که رابط را پیاده سازی میکند یعنی ( ColorPickerخط )31به متد )( addChangeListenerدر خطوط 11-16ارسال میکنیم.
کنترل JTabbedPane
کنترل JTabbedPaneبه شما اجازه میدهد که برای پنجرههای خود سربرگ ) (Tabبسازید ،شما در برنامههای زیادی این نوع
JTabbedPaneمیتواند حاوی کنترلهای دیگر باشد .با کلیک بر روی هر سربرگ ) (Tabمیتوانید محتویات آنرا مشاهده کنید.
ظاهر یک سربرگ فعال با دیگر سربرگها متفاوت است ،بنابراین شما میتوانید متوجه شوید که کدام یک از سربرگها فعال است.
زمانی که شما بر روی یک سربرگ کلیک میکنید ،کنترلهایی که به آن تعلق دارند نمایش داده میشوند JTabbedPane .به شما
اجازه میدهد که یک فرم را در داخل سربرگهای مختلف سازماندهی کنید ،به طوری که هر سربرگ یک دسته را نمایش دهد .برای
مثال،میتوانید یک فرم که حاوی اطالعات شخصی را در سربرگ Personal Infoو پیش زمینهی آموزشی را در سربرگ
Educational Backgroundقرار دهید .سازنده این کالس به روشهای زیر مقداردهی میشود:
)(public JTabbedPane
)public JTabbedPane(int tabPlacement
)public JTabbedPane(int tabPlacement, int tabLayoutPolicy
همانطور که در خط 33کد باال مشاهده میکنید ابتدا یک شیء از JTabbedPaneایجاد و سپس در خطوط 31و 31دو سربرگ یا
تب به آن با استفاده از متد )( addTabاضافه میکنیم .هر تب حداقل باید یک عنوان داشته باشد و یک کنترل دیگر را در خود جای
ذخیره کنیدD ابتدا دو عکس زیر را در درایو. آیکونی را مشخص کنیدtab به شما اجازه میدهد که برای هرImageIcon کالس
با استفاده از پارامتر اول میتوان کنترل JTabbedPaneرا در قسمت باال ،راست ،چپ و پایین فریم قرار داد .برای این کار کافیست
JTabbedPane.TOP
JTabbedPane.RIGHT
JTabbedPane.LEFT
JTabbedPane.BOTTOM
با استفاده از پارامتر دوم هم میتوان Tabها را در یک یا چند خط نمایش داد .پارامتر دوم میتواند شامل مقادیر زیر باشد:
JTabbedPane.SCROLL_TAB_LAYOUT
JTabbedPane.WRAP_TAB_LAYOUT
حال فرض کنید که میخواهیم کنترلهای دیگری در داخل این دو تب قرار دهیم .چون از قبل دو Panelبه هر دو تب اضافه
کردهایم کافیست که کنترلهای دیگر را در این دو Panelقرار دهیم .در خط 31کد باال کدهای زیر را بنویسید:
;))panel1.setLayout(new GridLayout(2,2,10,10
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 333
panel2.setLayout(new GridLayout(2,2,10,10));
panel1.add(button1);
panel1.add(button2);
panel1.add(button3);
panel1.add(button4);
panel2.add(checkbox1);
panel2.add(checkbox2);
panel2.add(checkbox3);
panel2.add(checkbox4);
چهار چکpanel2 چهار دکمه و در داخلpanel1 را به دو سطر و دو ستون تقسیم کرده و در داخلPanel در این کدهای دو
و در آخر هم این نکته را یاد آور شویم که برای راست چین کردن کنترل JTabbedPaneمیتوان از متد
;)TabbedPane1.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT
کنترل JMenuBar
از کنترل JMenuBarبرای ساخت نوار منو استفاده میشود .در شکل زیر نمایی کلی از یک نوار منو را مشاهده میکنید:
در جاوا برای ایجاد یک نوار منو کامل از کالسهایی که در شکل زیر مشاهده میکنید استفاده میشود:
331 SWING
: به کد زیر توجه کنید.حال اجازه دهید که وارد قسمت کدنویسی شده و نوار منوی باال را شبیه سازی کنیم
1 package myfirstprogram;
2
3 import java.awt.*;
4 import javax.swing.*;
5 import java.awt.event.*;
6
7 public class MyFirstProgram
8 {
9 public static void main(String[] args)
10 {
11 JFrame frame1 = new JFrame("JMenu Demo");
12 frame1.setLayout(new BorderLayout());
13
14 JMenuBar menubar1 = new JMenuBar();
15 frame1.add(menubar1, BorderLayout.NORTH);
16
17 JMenu menu1 = new JMenu("File");
18 JMenu menu2 = new JMenu("Edit");
19 JMenu menu3 = new JMenu("Format");
20 JMenu menu4 = new JMenu("Help");
21
22 menubar1.add(menu1);
23 menubar1.add(menu2);
24 menubar1.add(menu3);
25 menubar1.add(menu4);
26
27 frame1.setSize(430 , 315);
28 frame1.setVisible(true);
29 }
30 }
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 333
در کد باال و در خطوط 33یک فریم ایجاد کرده و در خط 35از کالس BorderLayoutبرای الیه بندی آن استفاده میکنیم .در خط 33
یک نوار منو با استفاده از کالس JMenuBarایجاد کرده و آن را در خط 31به باالی فریم میچسبانیم .اگر خطوط 31-51را پاک
کرده و برنامه را اجرا کنید مشاهده میکنید که هنوز کار خاصی انجام نشده است .برای اضافه کردن منو به منوبار از کالس JMenu
استفاده میشود .در خطوط 31-53چهار منو ایجاد کرده و در خطوط 55-51آنها را به منوبار اضافه میکنیم .حال برنامه را اجرا و
اکنون نوبت به زیر منوها میرسد .برای ایجاد زیر منو از کالس JMenuItemاستفاده میشود .فرض کنید که میخواهیم دو زیر منو
به منوی Fileاضافه کنیم .برای این کار کدهای زیر از 53به بعد کد باال بنویسید (تمامی کدهایی که در ادامه آموزش داده میشود
را از همین خط به بعد بنویسید .شما میتوانید بعد از تکمیل کدها آنها را منظم کنید):
کافیست که یک شیء از این کالس را در بین دو زیر منو. استفاده میشودJSeparator برای ایجاد خط جدا کننده هم از کالس
:قرار دهید
menu1.add(new JSeparator());
همانطور که مشاهده کردید برای ایجاد زیر منو از کالس JMenuItemاستفاده میشود ولی اگر بخواهیم برای یک زیر منو ،زیر
منوی دیگری تعریف کنیم باید زیر منوی اصلی را با استفاده از کالس JMenuایجاد کنیم .برای درک بهتر کد باال را با کدهای زیر
;))(menu1.add(new JSeparator
همانطور که در کد باال مشاهده میکنید ابتدا منوی Openرا با استفاده از کالس JMenuایجاد و سپس با استفاده از کالس
سازنده کالس JMenuItemیک پارامتر دوم هم دریافت میکند که با استفاده از آن میتوان یک آیکون به زیر منو اختصاص داد
:
برای ایجاد کلید میانبر و استفاده از کلیدهای ترکیبی هم از متد )( setMnemonicاستفاده میشود .فرض کنید که میخواهیم با
زدن دکمههای Alt+Fزیر منوهای منوی فایل نمایش داده شود .برای این کار کد زیر را مینویسید:
;)menu1.setMnemonic(KeyEvent.VK_F
اگر برنامه را اجرا کنید مشاهده میکنید که یک خط تیره زیر حرف Fکشیده شده است که نشان دهنده این است که شما میتوانید
از کلید Altبه همراه حرف Fبرای باز شدن منو استفاده کنید .برنامه را اجرا و دکمه Alt+Fرا بزنید:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 330
برای ایجاد ایجاد کلید میانبر با استفاده از دکمه کنترل ) (Ctrlهم میتوانید از کالس KeyStrokeاستفاده کنید .فرض کنید که
میخواهیم با زدن دکمههای Ctrl+Oزیر منوی ( Exitیا همان )menuitem2عمل کند .برای این کار از کد زیر استفاده میکنیم
:
برای ایجاد یک زیر منو از نوع CheckBoxهم از کالس JCheckBoxMenuItemاستفاده میشود .فرض کنید که میخواهیم یک
زیر منو از همین نوع به منوی ( Formatیا همان )menu3اضافه کنیم .برای اینکار به صورت زیر عمل میکنیم :
کنترل JToolBar
از کنترل JToolBarبرای ایجاد نوار ابزار استفاده میشود .سازنده این کالس به روشهای زیر مقداردهی میشود:
)(JToolBar
)JToolBar(int orientation
)JToolBar(String name
)JToolBar(String name, int orientation
نوار ابزار شامل دکمهها و اجزای مفیدی برای راحتی کار کاربر میباشد .مانند منو ،نوار ابزار هم در تعداد زیادی از نرم افزارهای
مشهور مانند Microsoft Office 2003به چشم میخورد .در زیر نوار ابزار Microsoft Office 2003را مشاهده میکنید:
در اصل نوار ابزار را میتوان منو و زیر منوهایی فرض کرد که به دلیل کاربرد زیاد آنها ،برای در دسترس بودن همیشگی ،آنها را به
صورت دکمه و در زیر نوار قرار میدهند .قبل از هر چیز ابتدا آیکونهای برنامه را از لینک زیر دانلود کرده و در پوشه ای به نام
http://www.w3-farsi.com/?p=15248
: در جاوا به کد زیر توجه کنیدJToolBar برای درک بهتر کار با نوار ابزار و کنترل
1 package myfirstprogram;
2
3 import java.awt.*;
4 import javax.swing.*;
5
6 public class MyFirstProgram
7 {
8 public static void main(String[] args)
9 {
10 JFrame frame1 = new JFrame("JToolBar Demo");
11 frame1.setLayout(new BorderLayout());
12
13 JToolBar firstToolbar = new JToolBar();
14 JToolBar secondToolbar = new JToolBar();
15
16 JPanel panel = new JPanel();
17 panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
18
19 JButton New = new JButton(new ImageIcon("D:\\images\\new.png"));
20 JButton Open = new JButton(new ImageIcon("D:\\images\\open.png"));
21 JButton Save = new JButton(new ImageIcon("D:\\images\\save.png"));
22 JButton Cut = new JButton(new ImageIcon("D:\\images\\cut.png"));
23 JButton Copy = new JButton(new ImageIcon("D:\\images\\copy.png"));
24 JButton Print = new JButton(new ImageIcon("D:\\images\\print.png"));
25 JButton Left2right = new JButton(new ImageIcon("D:\\images\\left2right.png"));
26 JButton Right2left = new JButton(new ImageIcon("D:\\images\\right2left.png"));
27 JButton Center = new JButton(new ImageIcon("D:\\images\\center.png"));
28 JButton Right = new JButton(new ImageIcon("D:\\images\\right.png"));
29 JButton Left = new JButton(new ImageIcon("D:\\images\\left.png"));
30
31 firstToolbar.add(New);
32 firstToolbar.add(Open);
33 firstToolbar.add(Save);
34 firstToolbar.add(Cut);
35 firstToolbar.add(Copy);
36 firstToolbar.add(Print);
37 firstToolbar.setAlignmentX(0);
38
39 secondToolbar.add(Left2right);
40 secondToolbar.add(Right2left);
41 secondToolbar.add(Center);
42 secondToolbar.add(Right);
43 secondToolbar.add(Left);
44 secondToolbar.setAlignmentX(0);
45
46 panel.add(firstToolbar);
47 panel.add(secondToolbar);
48 frame1.add(panel, BorderLayout.NORTH);
49
50 frame1.setSize(416, 313);
51 frame1.setVisible(true);
52 }
53 }
333 SWING
در کد باال و در خطوط 31و 33دو نوار ابزار ایجاد کردهایم .در خط 31و 31یک Panelایجاد و نحوه الیه بندی آن را BoxLayout
و در راستای محور Yها قرار دادهایم .چون که میخواهیم دو نوار در زیر هم قرار گیرند .در خطوط 36-56چندین دکمه ایجاد کرده
و با استفاده از کالس ImageIconبه هر کدام از آنها یکی از عکسهایی که در درایو Dذخیره کردیم را اختصاص میدهیم .در
خطوط 13-11چندین دکمه را در نوار ابزار اول و در خطوط 16-31مابقی دکمهها را در نوار ابزار دوم قرار میدهیم .بدون خطوط 11
و 33نوار ابزارها در وسط Panelقرار میگیرند که ما در این دو خط و با استفاده از متد )( setAlignmentXآنها را به سمت
چپ Panelمنتقل میکنیم .در خطوط 31و 31دو نوار ابزار را به Panelو در خط 30خود Panelرا به قسمت باالی Frame
اگر بخواهید که نوارهای ابزارتان در یک خط نمایش داده شوند کافیست که خط 31کد باال را به صورت زیر تغییر دهید:
نوار ابزار را به صورت عمودی هم میشود ایجاد کرد .برای این کار کافیست که خطوط 31و 33کد باال را به صورت زیر تغییر دهید
:
مشاهده میکنید که نوار ابزارها در زیر هم قرار گرفتند و این به خاطر الیه بندی Panelدر خط 31میباشد .حال خطوط 11 ،31و
;)firstToolbar.setAlignmentY(0
;)secondToolbar.setAlignmentY(0
کنترل JTree
کنترل JTreeبرای نمایش درختی آیتمها به کار میرود .برای درک بهتر عملکرد این کنترل میتوان به فهرست مطالب یک کتاب
و یا نمایش فایلها و یا پوشههای درون هارد اشاره کرد .هر شاخه از کنترل JTreeرا یک گره یا Nodeمینامند .پس به جای
هر شاخه در این کنترل شامل یک برچسب و یک عکس اختیاری است و هر شاخه خود میتواند شامل زیر شاخههای دیگر باشد.
با کلیک بر روی عالمت کنار شاخه ،کاربر میتواند زیر شاخههای مربوطه را مشاهده کند .در شکل زیر یک کنترل JTreeساده با
چند شاخه نمایش داده شده است .همانطور که مشاهده میکنید شاخه اصلی یا ،Rootشاخه اصلی ) (Root Nodeاست که
دارای دو زیر شاخه به نامهای NodeAو NodeBمیباشد NodeA .نیز به نوبه خود دارای دو زیر شاخه به نامهای ChildAو
ChildBاست:
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 333
استفادهDefaultMutableTreeNode و برای ایجاد شاخههای آن از کالسJTree برای ایجاد یک درخت در جاوا از کنترل
: در مثال زیر میخواهیم همین شکل باال را ایجاد کنیم. برای روشن شدن مطلب به مثال زیر توجه کنید.میشود
1 package myfirstprogram;
2
3 import javax.swing.*;
4 import javax.swing.tree.*;
5
6 public class MyFirstProgram
7 {
8 public static void main(String[] args)
9 {
10 JFrame frame = new JFrame("JTree Demo");
11
12 DefaultMutableTreeNode RootNode = new DefaultMutableTreeNode("Root");
13
14 DefaultMutableTreeNode NodeA = new DefaultMutableTreeNode("NodeA");
15 RootNode.add(NodeA);
16
17 DefaultMutableTreeNode NodeB = new DefaultMutableTreeNode("NodeB");
18 RootNode.add(NodeB);
19
20 JTree Tree = new JTree(RootNode);
21
22 frame.add(Tree);
23 frame.setSize(430 , 315);
24 frame.setVisible(true);
25 }
26 }
حال میخواهیم دو زیر. ایجاد کردهایمRootNod همانطور که در کد باال مشاهده میکنید ابتدا یک شاخه اصلی یا گره ریشه به نام
33و )31و این دو شاخه را با استفاده از متد )( addدر خطوط 31و 30به شاخه اصلی اضافه میکنیم .سپس در خط 53شاخه
حال فرض کنید که میخواهیم دو زیر شاخه به شاخه NodeAدر شکل باال اضافه کنیم:
همانطور که در کد باال مشاهده میکنید ابتدا با استفاده از کالس DefaultMutableTreeNodeدو زیر شاخه ایجاد و سپس با
اگر بخواهید به هر یک از شاخههای بدون زیر شاخه و شاخههایی که دارای زیر شاخه هستند یک آیکون اختصاص دهید میتوانید
. برای نمایش آیکون شاخههای بدون زیر شاخه به کار میرود: setLeafIcon()
. برای نمایش آیکون شاخههای دارای زیر شاخه در حالت بسته به کار میرود: setClosedIcon()
. برای نمایش آیکون شاخههای دارای زیر شاخه در حالت باز به کار میرود: setOpenIcon()
DefaultTreeCellRenderer DefaultTreeCellRenderer1 =
(DefaultTreeCellRenderer)tree.getCellRenderer();
DefaultTreeCellRenderer1.setLeafIcon(leafIcon);
DefaultTreeCellRenderer1.setClosedIcon(closedIcon);
DefaultTreeCellRenderer1.setOpenIcon(openIcon);
سپس این سه شیء را به سه متد از کالس. قرار دادهایمImageIcon در خطوط باال ابتدا مسیر سه آیکون را در سه شیء از کالس
کنترل JToggleButton
کنترل JToggleButtonدکمه ای دو انتخابه یا دو حالته میباشد .این دکمهها با کلیک بر روی آنها به حالت انتخاب در آمده و
رنگ پس زمینه آنها تغییر میکند و اگر بخواهید آنها را از حالت انتخاب خارج کنید باید دوباره بر روی آنها کلیک کنید .یک
public JToggleButton()
public JToggleButton(Icon icon)
public JToggleButton(Icon icon, boolean selected)
public JToggleButton(String text)
public JToggleButton(String text, boolean selected)
public JToggleButton(String text, Icon icon)
public JToggleButton(String text, Icon icon, boolean selected)
public JToggleButton(Action action)
1 package myfirstprogram;
2
3 import java.awt.*;
4 import javax.swing.*;
5 import java.awt.event.*;
6
7 public class MyFirstProgram
8 {
9 public static void main(String[] args)
10 {
11 JFrame frame = new JFrame("JToggleButton Demo");
12
13 JPanel panel = new JPanel();
14
15 final JLabel label = new JLabel();
16 label.setPreferredSize(new Dimension(200, 200));
17 label.setBackground(Color.red);
18 label.setOpaque(true);
19
20 JToggleButton toggleButton = new JToggleButton("Toggle Button");
21
336 SWING
22 ;)panel.add(label
23 ;)panel.add(toggleButton
24
25 ;)frame.add(panel
26
27 class stateChange implements ItemListener
28 {
29 )public void itemStateChanged(ItemEvent itemEvent
30 {
31 ;)(int state = itemEvent.getStateChange
32
33 )if (state == ItemEvent.SELECTED
34 {
35 ;)label.setSize(50, 50
36 }
37 else
38 {
39 ;)label.setSize(200, 200
40 }
41 }
42 }
43
44 ;))(toggleButton.addItemListener(new stateChange
45
46 ;)frame.setSize(500, 500
47 ;)frame.setVisible(true
48 }
49 }
هدف از برنامه باال این است که با کلیک بر روی یک دکمه JToggleButtonاندازه Labelتغییر کرده و با کلیک دوباره به حالت
قبل بر گردد .در خطوط 31-30یک Labelایجاد کرده و یک اندازه و رنگ پس زمینه هم به آن اختصاص میدهیم .در خط 53یک
کنترل JToggleButtonایجاد کرده و این دو کنترل را در خطوط 55و 51به Panelو Panelرا در خط 51به Frameاضافه
میکنیم .همانطور که اشاره کردیم این دکمهها دو وضعیت ) (stateدارند -3 :انتخاب شده -5انتخاب نشده.
برای کار با این کنترل میتوان رابط ItemListenerرا پیاده سازی کرد .در خطوط 51-35یک کالس با نام stateChanege
ایجاد کرده و رابط مذکور را پیاده سازی میکنیم .این رابط دارای متدی به نام )( itemStateChangedکه باید پیاده سازی شود.
همانطور که در خط 56مشاهده میکنید این متد یک شیء از کالس ItemEventدر یافت میکند .کالس ItemEventدارای متدی
به نام )( getStateChangeکه وضعیت دکمه را میتوان با آن مشخص کرد .در خط 13وضعیت دکمه را به دست میآوریم .در
خطوط 11-33با استفاده از یک دستور ifچک میکنیم که آیا دکمه انتخاب شده است؟ اگر انتخاب شده باشد اندازه Labelرا
تغییر داده و در غیر اینصورت به همان اندازه قبل که در خط 31مشخص کردهایم بر میگردانیم:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 353
همانطور که در اشکال باال مشاهده میکنید با انتخاب دکمه (شکل اول) رنگ پس زمینه JToggleButtonتغییر میکند که نشان
دهنده در حالت انتخاب بودن آن است و با کلیک دوباره بر روی آن یعنی خروج از حالت انتخاب رنگ پس زمینه به حالت عادی بر
میگردد.
353 SWING
رنگ و یا چاپ یک سند میباشند .جاوا دارای کنترلهایی میباشد که به شما اجازه میدهند با فراخوانی کادرهای محاوره ای امور
خاصی را انجام دهید .کادرهای محاوره ای را میتوان با استفاده از خواص این کنترلها سفارشی کرد.
بنابراین میتوانید با اسنتفاده از این کادرهای محاوره ای برنامههای ویژوال استانداردتری ایجاد کنید .این کادرها معموال در تمام
کنترل JFileChooser
از کنترل JFileChooserبرای کار با فایلها و پوشهها استفاده میشود .با استفاده از این کنترل میتوان یک فایل یا یک پوشه
را از بین لیستی از فایلها و پوشهها انتخاب کرد .سازنده این کالس به روشهای زیر مقداردهی میشود:
public )(JFileChooser
public )JFileChooser(File currentDirectory
public )JFileChooser(File currentDirectory, FileSystemView fileSystemView
public )JFileChooser(FileSystemView fileSystemView
public )JFileChooser(String currentDirectoryPath
public )JFileChooser(String currentDirectoryPath, FileSystemView fileSystemView
کادر انتخاب یا ذخیره فایل ،به وسیله سه متد نمایش داده میشود:
)(showDialog
351 SWING
)(showOpenDialog
)(showSaveDialog
در جدول زیر هم لیست متدهایی که برای سفارشی سازی کادر محاوره ای JfileChooserبه کار میروند به همراه کاربرد آنها
کاربرد متد
به کاربر اجازه انتخاب همزمان چند فایل یا پوشه را میدهد و دو مقدار trueو false setMultiSelectionEnabled
میگیرد.
به وسیله این متد میتوان پوشه یا درایو پیشفرضی که هنگام باز شدن کادر محاوره ای نمایش setCurrentDirectory
داده میشود را مشخص کرد .اگر مقدار nullبه آن بدهیم بسته به نوع سیستم عامل یک
این متد سه مقدار میگیرد که در حالتی که کاربر اجازه انتخاب چند فایل یا پوشه را دارد کاربر را setFileSelectionMode
محدود میکند:
به وسیله این متد میتوان پسوند فایلهای قابل نمایش در پنجره را مشخص کرد. setFileFilter
مشخص میکند که گزینه AllFilesدر بین لیست پسوندها نمایش داده شود یا نه؟ setAcceptAllFileFilterUsed
از متد )( showDialogبه همراه یک شیء از کالس JFileChooserمیتوان یک کادر محاوره ای سفارشی برای باز یا ذخیره
کردن یک فایل ایجاد کرد .این متد دو آرگومان میگیرد که اولین آرگومان کنترل والد و دومین آرگومان عنوان دکمه و کادر را مشخص
میکند .برای روشن شدن نحوه استفاده از این متد ،کد زیر را در یک فایل با پسوند جاوا نوشته و اجرا کنید:
;package myfirstprogram
;*import javax.swing.
;)"filechooser.showDialog(null, "Open
}
}
در شکل باال آرگومان دوم متد )( showDialogهم به جای نام دکمه و هم به جای عنوان پنجره به کار رفته است .حال آرگومانهای
;)"filechooser.showDialog(null,"Save
همانطور که احتماال متوجه شدهاید میتوان از این متد هم به جای کادر محاوره ای باز و هم به جای کادر محاوره ای ذخیره فایل
استفاده کرد .البته کالس JFileChooserدارای متدی به نام setDialogTypeمیباشد که با دریافت سه مقدار ثابت زیر نوع
JFileChooser.OPEN_DIALOG
JFileChooser.SAVE_DIALOG
JFileChooser.CUSTOM_DIALOG
در کد باال ما الزم بود که یک عنوان به پنجره و دکمه اختصاص دهیم ولی با استفاده از این متد و ثابتها به طور خودکار نوع کادر
محاوره ای تشخیص داده شده و مقادیری برای دکمه و عنوان اختصاص داده میشود .به کد زیر توجه کنید:
;package myfirstprogram
;*import javax.swing.
;)filechooser.setDialogType(JFileChooser.SAVE_DIALOG
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 351
;)filechooser.showDialog(null, null
}
}
در کد باال مقدار عنوان پنجره و دکمه را nullقرار دادهایم ولی چون در خط قبل از آن نوع پنجره را JFileChooser.SAVE_DIALOG
تشخیص اینکه چه دکمه ای توسط کاربر فشرده شده است بسیار مهم است .متد )( showDialogوقتی که کاربر بر روی دکمههای
Openیا Saveکلیک میکند مقدار 3و وقتی بر روی Cancelکلیک میکند ،مقدار 3و اگر خطایی در هنگام کار با کادر محاوره ای
رخ دهد مقدار -3را بر میگرداند .با مقایسه این سه مقدار برگشتی با سه ثابت از کالس JFileChooserمیتوان کدهای کارامد
تری نوشت:
JFileChooser.APPROVE_OPTION
CANCEL_OPTION
JFileChooser.ERROR_OPTION
1 package myfirstprogram;
2
3 import javax.swing.*;
4
5 public class MyFirstProgram
6 {
7 public static void main(String[] args)
8 {
9 final JFileChooser filechooser = new JFileChooser();
10
11 filechooser.setDialogType(JFileChooser.SAVE_DIALOG);
12
13 int selectedNumber = filechooser.showDialog(null, null);
14
15 switch (selectedNumber)
16 {
17 case JFileChooser.APPROVE_OPTION :
18 JOptionPane.showMessageDialog(null, "You Clicked on Open or Save!");
19 break;
20 case JFileChooser.CANCEL_OPTION :
21 JOptionPane.showMessageDialog(null, "You Clicked on Cancel!");
22 break;
23 case JFileChooser.ERROR_OPTION :
24 JOptionPane.showMessageDialog(null, "An error occured !");
25 break;
26 }
27 }
28 }
سپس همین مقدار را در.( قرار دادهایمselectedNumber) کد باال مقدار برگشتی از متد را در یک متغیر از نوع صحیح31 در خط
با مقادیر ثابت گفته شده مقایسه کرده و در صورت مساوی بودن با هر یک از این مقادیر پیغامهای مختلفی نمایش51 و53 و31
به کد زیر. حال اجازه دهید که با یک برنامه به شما نحوه استفاده از این کادرها و متدهای آنها را به شما آموزش دهیم. دادهایم
:توجه کنید
1 package myfirstprogram;
2
3 import java.io.File;
4 import javax.swing.*;
5 import java.awt.event.*;
6 import javax.swing.filechooser.*;
7
8 public class MyFirstProgram
9 {
10 public static void main(String[] args)
11 {
12 final JFrame frame = new JFrame("JFileChooser Demo");
13 JPanel panel = new JPanel();
14 JButton button = new JButton("Open File");
15 panel.add(button);
16 frame.add(panel);
17
18 final JFileChooser filechooser = new JFileChooser();
19
20 button.addActionListener(new ActionListener()
21 {
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 350
در کد باال یک دکمه به Panelو Panelرا به Frameاضافه کردهایم (خطوط .)35-31حال میخواهیم با کلیک بر روی دکمه ،کادر
محاوره ای باز کردن فایل ) (OpenFileDialogنمایش داده شود .این کار را در خطوط 53-51انجام دادهایم .با اجرای برنامه و زدن
بر روی دکمه مشاهده میکنید که کادر محاوره ای نمایش داده میشود .از این به بعد کدهایی را که توضیح میدهیم بین خطوط
30و 53بنویسید .ابتدا نوع کادر محاوره ای را با استفاده از متد )( setDialogTypeبه صورت زیر مشخص میکنیم:
;)filechooser.setDialogType(JFileChooser.OPEN_DIALOG
مشاهده میکنید که عنوان دکمه و پنجره هر دو Openمیباشد .اگر بخواهید عنوان پنجره را تغییر دهید از متد
;)"filechooser.setDialogTitle("Open a File
356 SWING
فرض کنید که میخواهیم با باز شدن کادر محاوره ای مثال پوشه Program filesدرایو Cبه عنوان پوشه پیشفرض نمایش داده
شود .برای این کار )( setCurrentDirectoryبه صورت زیر استفاده میکنیم:
اگر بخواهیم کاربر را مجبور به انتخاب یک یا چند فایل بکنیم یعنی کاربر نتواند با گرفتن دکمه Ctrlکیبورد هم پوشه انتخاب کند
;)filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY
;)filechooser.setMultiSelectionEnabled(true
در خط اول مقدار JFileChooser.FILES_ONLYرا به متد )( setFileSelectionModeارسال کردهایم ،در نتیجه فقط فایلها
قابل انتخاب هستند و برای حق انتخاب چند فایل هم مقدار trueرا به متد )( setMultiSelectionEnabledارسال میکنیم.
با اجرای برنامه و گرفتن دکمه Ctrlمتوجه میشوید که نمیشود همزمان هم فایل انتخاب کرد و هم پوشه .در حالت پیشفرض
تمامی پسوندها در کادر محاوره ای نمایش داده میشود ( .)All filesولی اگر بخواهیم گزینههای دیگری به کادر محاوره ای
اضافه کنیم که مثال به وسیله آنها فقط فایلهای متنی و یا فقط عکسها نمایش داده شوند از کالسهای FileFilterو
FileNameExtensionFilterبه صورت زیر برای تعیین پسوندهای دلخواه و اضافه کردن آنها به کادر محاوره ای استفاده
میکنید:
در کدهای باال ،اولین پارامتر داخل پرانتز توضیحی درباره پسوندها و پارامترهای بعدی هم خود اسم خود پسوندها میباشند .تا
اینجا ما فقط پسوندها را مشخص کردهایم .برای اضافه کردن آنها به کادر محاوره ای از متد )( setFileFilterبه صورت زیر
استفاده میکنیم:
;)filechooser.setFileFilter(ImageFiles
;)filechooser.setFileFilter(TextFiles
مشاهده میکنید که در جلوی کادر Files of Typeدو گروه پسوند دیگر اضافه شده است که با انتخاب هر یک از آنها فقط
کنترل JColorChooser
از کنترل JColorChooserوقتی استفاده میشود که شما بخواهید یک رنگ انتخاب کنید .به عنوان مثال وقتی بخواهید رنگ یک
فونت یا رنگ پس زمینه فرم را تغییر دهید میتوانید از این کنترل استفاده کنید .سازنده این کالس به روشهای زیر مقداردهی
میشود:
)(public JColorChooser
)public JColorChooser(Color initialColor
)public JColorChooser(ColorSelectionModel model
پنجره JColorChooserاز رنگهای از پیش تعریف شده تشکیل شده است (شماره .)5شما میتوانید با کیلک بر روی سربرگهای
این پنجره (شماره )3تعداد بیشتری رنگ مشاهده کنید به طوری که در پنجره ظاهر شده هر رنگی که دوست دارید را انتخاب نمایید.
همچنین با استفاده از پنجره ( Previewشماره )1میتوانید پیش نمایشی از اعمال رنگ مورد نظرتان بر قسمتهای مختلف یک
کنترل (متن ،پس زمینه متن ،خاشیه کنترل و …) را مشاهده نمایید .برای نشان دادن عملکرد کادر محاوره ای JColorChooser
19 {
20 )public void actionPerformed(ActionEvent e
21 {
22 (Color selectedColor = JColorChooser.showDialog
23 ;))(panel1, "Choose Background Color", panel1.getBackground
24
25 )if(selectedColor != null
26 {
27 ;)panel1.setBackground(selectedColor
28 }
29 }
30 ;)}
31
32 ;)frame1.setSize(416, 313
33 ;)frame1.setVisible(true
34 }
35 }
هدف برنامه باال اعمال رنگ به پس زمینه یه Panelمیباشد .در خطوط 33-31یک کنترل دکمه به Panelو Panelرا به یک
Frameاضافه کردهایم .چون که قرار است با کلیک بر روی دکمه کادر محاوره ای JColorChooserنمایش داده شود ،پس باید
رابط ActionListenerرا پیاده سازی کنیم .در خطوط 30-56این کار را انجام داده و سپس در بدنه متد )(actionPerformed
رابط خطوط 55-50را مینویسید .در خطوط 55-51ابتدا یک رنگ را انتخاب میکنیم .در این خط ابتدا یک شئ از کالس Color
ایجاد میکنیم .این کالس یک رنگ را در اختیار ما میگذارد .در ادامه همین خط چون ما قرار است که با استفاده از کادر محاوره ای
JColorChooserیک رنگ انتخاب کنیم باید ابتدا کادر را نمایش دهیم .این کار را با استفاده از متد استاتیک )(showDialog
;)JColorChooser.showDialog(parent,title,color
پارامتر اول کنترل والد ،پارامتر دوم عنوان کادر محاوره ای و پارامتر سوم رنگ پیشفرضی که هنگام نمایش کادر مشخص میشود،
مشاهده میکنید که عنوان پنجره Choose Background Colorو در قسمت پیشنمایش هم رنگ پیشفرض سفید میباشد.
چون ما هیچ رنگی را از قبل به پس زمینه Panelاختصاص ندادهایم در نتیجه متد )( getBackgroundکه رنگ جاری کنترل را
بر میگرداند ،رنگ سفید را بر میگرداند .استفاده از این متد یک حسن دارد و آن این است که اگر یک رنگ انتخاب کرده و بر روی
دکمه OKکلیک کنید و دوباره کادر را باز کنید ،همان رنگ قبلی را که انتخاب کردهاید به عنوان رنگ پیشفرض کادر به شما نمایش
مشاهده میکنید که به خاطر پارامتر سوم بعد از اجرای برنامه و زدن دکمه ،رنگ پیشفرض کادر محاوره ای قرمز میباشد:
311 SWING
حال اگر چندین بار رنگ انتخاب کرده و در هر بار دکمه OKرا بزنید و دوباره کادر را باز کنید همیشه رنگ قرمز به شما نمایش داده
میشود .در خطوط 53-51چک میکنیم که اگر رنگی انتخاب شده باشد آن را به پس زمینه Panelاعمال کند .برنامه را اجرا ،یک
کالس Date
کالس Dateکالسی از جاوا است که در پکیج java.utilقرار دارد و به شما اجازه استفاده ،ذخیره ،و دستکاری ساعت و تاریخ
را میدهد .این کالس دارای متدهایی برای دستکاری تاریخ مانند اضافه و کم کردن روزها ،ماهها ،یا سالها و مطابق کردن آنها با
تاریخ جاری را میدهند .همچنین دارای متده ایی است که تاریخ را به اشکال متفاوتی نشان میدهند .کد زیر نحوه استفاده از
;package myfirstprogram
;*import java.util.
در این مثال تاریخ و ساعتی که بنده این آموزش را قرار دادهام نمایش داده شده است .همانطور که در کد باال مشاهده میکنید
برای استفاده از این کالس باید پکیج مربوطه ) (java.utilرا با کلمه کلیدی importوارد برنامه کنید .کالس Dateدارای
چندین متد است که در زیر کاربرد آنها نشان داده شده است:
توضیحات متد
مقدار trueرا در صورتی که تاریخ سیستم بعد از تاریخ داده شده بصورت پارامتر باشد برمی گرداند. )(after
مقدار trueرا در صورتی که تاریخ سیستم قبل از تاریخ داده شده بصورت پارامتر باشد برمی گرداند. )(before
مقایسه تاریع سیستم با تاریخ پارامتر .در صورتی که برابر باشند مقدار 3در صورتی که تاریخ سیستم )(compareTo
قبل باشد مقدار منفی و در صورتی که بعد باشد مقدار مثبت بر میگرداند.
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 310
.چک میکند که آیا کالس داده شده در پارامتر از نوع تاریخ هست یا نه compareTo()
. در صورت برابر بودنtrue مقایسه تاریخ موجود با تاریخ و زمان پارامتر و بازگشت مقدار equals()
3613 ژانویه3 تنظیم زمان با دادن تعداد میلی ثانیه از setTime()
package myfirstprogram;
import java.util.*;
false
true
Wed Jul 08 18:44:03 IRDT 2015
-1
false
1436364843809
1845766767
. استفاده کردSimpleDateFormat و هم از کالسprintf() برای قالب بندی یا نمایش دلخواه تاریخ در جاوا هم میتوان از متد
.قبل از خواندن ادامه آموزش توصیه میشود که ابتدا این پست را بخوانید
http://www.w3-farsi.com/?p=8321
316 کار با تاریخ ،فایل و رشته
هنگامی که یک شئ Dateایجاد میکنیم برای نمایش تاریخ و زمان به صورت سفارشی میتوان از متد )( printfو کارکترهای
Mon May 04 09:51:52 CDT 2015 نمایش تاریخ و زمان بصورت کامل c
19 نمایش شماره 5رقمی نشان دهنده ساعت در فرمت 53ساعته 33تا 53 H
17 نمایش ساعت بدون گذاشتن 3قبل از ساعت یک رقمی 3تا 51 k
07 شماره 5رقمی نشان دهنده ساعت در فرمت 35ساعته 33تا 35 I
7 نمایش ساعت بودن گذاشتن 3قبل از ساعت یک رقمی 3تا 35 l
20 نمایش دقیقه بدون گذاشتن 3قبل از آن درصورت 3رقمی بودن S
برای اینکه با کاربرد کاراکترهای باال در متد و همچنین قالب بندی آشنا شوید به مثال زیر توجه کنید:
333 کار با تاریخ ،فایل و رشته
;)System.out.printf("%tY", today
2015
در مثال باال از %tYبرای قالب بندی تاریخ استفاده کردهایم .قالب بندی همیشه با عالمت %شروع میشود .حرف tبعد از آن به
معنای آن است که ما میخواهیم یک مقدار زمانی را قالب بندی کنیم و حرف Yهم ،همانطور که در جدول مشاهده میکنید برای
نمایش سال به صورت چهار رقمی است .حال فرض کنید که میخواهیم یک زمان را به صورت کامل نمایش دهیم:
همانطور که در کد باال مشاهده میکنید Due Today ،یک رشته است و اولین آرگومان بعد از رشته قالب بندی شده ،در نتیجه از
%1$sبرای قالب بندی آن استفاده کردهایم .عدد یک به معنای اولین آرگومان ،عالمت $محدود کننده است و برای قالب بندیهای
چند بخشی کاربرد دارد یا به عبارت دیگر اندیس آرگومانها باید در داخل دو عالمت %$قرار بگیرد .عالمت sکوچک هم به معنای
رشته میباشد .دومین آرگومان بعد از رشته قالب بندی شده هم به صورت سه بخشی قرار است نمایش داده شود پس هر بخش
با %2$tشروع و بعد از این عبارت هم یکی از کاراکترهای موجود در جدول باال آمده است t .به معنای تاریخ است.
کالس SimpleDateFormatهم که در پکیج java.textقرار دارد با دریافت کاراکترهای خاصی تاریخ را فرمت بندی میکند.
لیست کاراکترهایی که میتوانیم به سازنده این کالس بدهیم در جدول زیر آمده است:
کالس Math
از کالس Mathبرای انجام محاسبات ریاضی استفاده میشود .از این کالس میتوان برای گرد کردن اعداد ،گرفتن جذر یا نتیجه
توان یک عدد استفاده کرد .این کالس یک کالس finalاست و دارای تعدادی متد staticبوده که از آنها برای انجام اعمال
مختلف ریاضی از جمله به دست آوردن توان ،جذر گرفتن و … استفاده میشود .برای روشن شدن مطلب برخی از متدهای این
توضیح متد
کوچکترین مقدار صحیحی که بزرگتر یا مساوی با عدد مورد نظر ما باشد را بر میگرداند. ceil
بزرگترین مقدار صحیحی که کوچکتر یا مساوی با عدد مورد نظر ما باشد را بر میگرداند. floor
میتوان با استفاده از )( Math.ceilو )( Math.floorیک عدد با قسمت اعشار را گرد کرد .متد )( Math.ceilیک عدد از نوع
doubleرا گرفته و یک مقدار از نوع doubleگرد شده را بر میگرداند .نتیجه این متد بزرگتر یا مساوی آرگومان دریافت شده
است Math.floor .یک عدد doubleرا گرد کرده و نتیجه کوچکتر یا مساوی آرگومان گرفته شده است .برای روشن شدن مطلب
Math.Ceiling(34.567) = 35
Math.Floor(34.567) = 34
اگر بخواهید یک عدد اعشاری را گرد کنید میتوانید از متد )( Math.roundاستفاده کنید:
;))System.out.println(Math.round(firstNumber
;))System.out.println(Math.round(secondNumber
3
4
همانطور که در کد باال مشاهده میکنید اگر اولین رقم اعشار از 1کوچکتر باشد عدد اعشار رو به پایین و اگر بزرگتر از 1باشد عدد
برای به توان رساندن یک عدد از متد )( Math.powاستفاده میشود .این متد دو آرگومان از نوع doubleقبول کرده که اولین
آرگومان پایه و دومی توان میباشد .مقدار برگشتی از این متد doubleاست .به کد زیر توجه کنید:
برای محاسبه ریشه یک عدد از متد )( Math.sqrtاستفاده میشود .این متد یک عدد به عنوان آرگومان قبول میکند که همان
عددی است که میخواهیم ریشه آن را محاسبه کنیم .مقدار برگشتی از این متد هم doubleمیباشد.
;))System.out.println(Math.sqrt(25
5.0
کالس Mathدارای متدهای )( Math.minو )( Math.maxبرای یافتن بزرگترین و کوچکترین عدد از بین چندین عدد میباشد.
هر دو متد دو آرگومان از نوع عددی قبول میکنند .در حالت پیشفرض دو عدد را میتوانید با هم مقایسه نمایید.
;))System.out.println(Math.min(1,2
;))System.out.println(Math.max(1,2
1
2
برای جلوگیری از محدودیت این متدها میتوان به صورت تو در تو از آنها به صورت زیر استفاده کرد:
Max = 3
Min = 1
:همچنین میتوانید یک تابع تعریف کنید که کوچکترین و بزرگترین هر تعداد عدد را به شما معرفی کند
package myfirstprogram;
return maximum;
}
return minimum;
}
45
5
در داخل توابع ما فرض را بر.) آرایه ای از اعداد صحیح قبول میکنند (هر تعداد عدد را قبول میکنندGetMin() وGetMax() توابع
3 ایجاد کرده که با اندیسfor سپس یک حلقه.این گذاشتهایم که اولین مقدار بزرگترین و آخرین مقدار کوچکترین عدد است
تعیین میکنیم که آیا عنصر جاری حلقه از مقدار جاری اعدادMath.max() وMath.min() با استفاده از متدهای.شروع میشود
331 کار با تاریخ ،فایل و رشته
بزرگتر است یا کوچکتر .که در این صورت مقدار جاری را جایگزین متغیرهای بزرگ یا کوچک میکنیم .سپس مقادیر نتیجه را
برگشت میدهیم.
Math.PI
از ثابت PIکه مقدار 1.33316511110616151031را در خود ذخیره دارد ،زمانی که بخواهید محیط یا مساحت یک دایره را پیدا
کنید ،استفاده میشود .برای یافتن محیط یک دایره به صورت زیر عمل میشود که در آن radiusشعاع میباشد:
کالس Mathدارای متدهای بیشتری است که ما به توضیح همین چند متد بسنده کردیم.
;import java.util.Random
سادهترین روش برای تولید اعداد تصادفی استفاده از متدهای )( nextDouble ،nextIntو … است .برای این کار ابتدا یک شیء
از کالس Randomمیسازیم و سپس از متدهای مذکور برای تولید اعداد تصادفی استفاده میکنیم .به مثال زیر توجه کنید:
;package myfirstprogram
;import java.util.Random
;)System.out.println(booleanValue
;)System.out.println(intValue
;)System.out.println(doubleValue
;)System.out.println(floatValue
}
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 330
}
false
-240333896
0.07659793195249542
0.6878707
حال اگر برنامه باال را چندین بار اجرا کنید نتیجههای مختلفی در خروجی مشاهده خواهید کرد .برای اینکه نحوه کار با این کالس
و متدهای آن را راحت درک کنید در مثالهای بعدی با اعداد صحیح کار میکنیم .فرض میکنیم که شما میخواهید ده عدد از نوع
intتولید کنید:
306495489
861232443
1265448050
-30370747
499374488
-1865142177
1196801248
-1061328848
62018178
1609249893
خروجی شما مطمئنا متفاوت است چون همه اعداد تصادفی میباشند .یکی دیکر از نسخههای متد )( nextIntبه شما اجازه
میدهد که تعدادی عدد تصادفی که کوچکتر از یک عدد خاص هستند ،تولید کنید .فرض کنید که میخواهید یک عدد صحیح در
یک بازه تولید کنید ،مثال عددی بین 3و ( 3یعنی 3و 3هم جزء اعداد تولید شده باشند) .برای این کار باید به صورت زیر عمل کنید
:
1
4
1
0
3
1
336 کار با تاریخ ،فایل و رشته
4
4
4
0
همانطور که در مثال باال مشاهده میکنید عدد 1را به عنوان آرگومان به متد )( nextIntدادهایم و سپس با استفاده از حلقه
forده بار خروجی این متد را چاپ کردهایم .مشاهده میکنید که عدد 1هرگز چاپ نمیشود ،چون مقداری که این کالس و متد
ایجاد میکنند عددی بزرگتر مساوی با 3و کوچکتر از 1است نه خود عدد .1پس برای اینکه عدد 1هم چاپ شود باید به دو
3
1
1
4
2
3
4
2
5
کد باال باعث تولید اعداد 3 ،1 ،5 ،3و 1میشود .یعنی مفهوم کد باال با اضافه کردن عدد 3این است که کوچکترین عدد تولیدی 3
و بزرگترین عدد 1باشد .حال فرض کنید به جای عدد 3از عدد 5یا عدد دیگر استفاده کنیم .در مثال زیر از عدد 5استفاده میکنیم
:
در کد باال کوچکترین عدد تولیدی 5و بزرگترین عدد تولید )5+1(-3خواهد بود:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 313
6
3
6
2
5
4
3
3
6
6
میتوان از یک مقدار هم ب رای تولید یک توالی تکراری از اعداد تصادفی استفاده کرد.بدین معنی که با هر بار اجرای برنامه توالی و
نوع اعداد تولید شده مانند سری قبلی باشد که برنامه اجرا شده است .این مقدار هر عددی میتواند باشد .برای اختصاص این
مقدار باید آن را در داخل پرانتز سازنده کالس Randomقرار دهید.مانند عدد صفر در مثال زیر:
0
3
4
2
0
3
1
1
4
4
با هر بار اجرای برنامه باال همین اعداد را مشاهده خواهید نمود .حال اجازه بدهید که یک مثال ساده را توضیح دهیم .این برنامه
;package myfirstprogram
;import java.util.Random
)switch (messageNumber
{
case 1:
313 کار با تاریخ ،فایل و رشته
برنامه مقادیر 3تا 1را تولید میکند .سپس با استفاده از دستور switchبرای نشان دادن یک پیغام برای هر مقدار ممکن استفاده
میکنیم .بعد از چندین بار اجرای برنامه متوجه میشوید که پیغام خوش آمد گویی تغییر میکند.
مانند حروف ،اعداد یا نشانهها میباشد .رشته به وسیله کلمه کلیدی Stringتعریف میشود .اهمیت این نوع داده ای زمانی
مشخص میشود که شما بخواهید اطالعاتی از قبیل نام ،آدرس ،جنسیت یا ایمیل خودتان را ذخیره کنید .با استفاده از رشتهها
میتوان فورا به کاربر اطالعاتی ارائه و یا در مورد یک خطا در برنامه هشدار داد .از عبارات با قاعده در اعتبارسنجی اطالعات استفاده
میشود .در درسهای آینده در مورد خصوصیات مختلف رشتهها و متدهایی که به وسیله آنها شما میتوانید این خصوصیات را
کالس String
رشتهها در جاوا با کالس Stringسر و کار دارند .برای ایجاد یک رشته چندین راه وجود دارد:
;String myString
به این نکته توجه کنید که رشتهها را باید در داخل دابل کوتیشن )”“( قرار دهید .دابل کوتیشن به کمپایلر نشان میدهد که داده
ای را که شما میخواهید در متغیر ذخیره کنید یک رشته است .برای تعریف و مقدار دهی به یک رشته میتوان به صورت زیر هم
عمل کرد:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 315
همچنین میتوان از کلمه کلیدی newو سازنده Stringبرای تخصیص یک مقدار به رشته استفاده کرد:
یک رشته مجموعه ای از کاراکترها میباشد .کد زیر نحوه جدا سازی کاراکترهای یک رشته را به وسیله حلقه forنشان میدهد.
T
h
i
s
i
s
a
s
t
r
i
n
g
در حقیقت ،نسخه دیگر سازنده Stringیک آرایه از نوع کاراکتر قبول میکند.
در درس آینده نحوه مقایسه و مرتب سازی رشتهها را نشان خواهیم داد.
مقایسه رشتهها
میتوان رشتهها را به روشهای مختلف با هم مقایسه کرد .به عنوان مثال با استفاده از عملگر == میتوان تست کرد که آیا دو
همچنین از متد )( compareToهم برای مقایسه دو رشته استفاده میشود .به کد زیر توجه کنید:
;))System.out.println(str1.compareTo(str2
0
متد )( compareToیک رشته را میگیرد و آن را با رشته مورد نظر ما مقایسه میکند و در صورت مساوی بودن هر دو مقدار صفر
را بر میگرداند.بنابراین برای تشخیص تساوی دو رشته با استفاده از متد )( compareToباید مانند کد زیر تست کنید که آیا مقدار
)if(str1.compareTo(str2) == 0
{
// some code
}
چطور تشخیص بدهیم که یک رشته از رشته دیگر کوچکتر یا بزرگتر است؟ هر کاراکتر در رشته به یونیکد معادل خود تبدیل
میشود .اولین کاراکتر اولین رشته با اولین کاراکتر دومین رشته مقایسه میشود.اگر برابر بودند سپس دومین کارا کترها و به همین
ترتیب بقیه کاراکترها با هم مقایسه میشوند .متد )( compareToدو رشته یکسان را که فقط در بزرگی و کوچکی حروف با هم
متفاوت باشند را دو رشته متفاوت در نظر میگیرد .برای مقایسه دو رشته بدون در نظر گرفتن بزرگی و کوچکی حروف از متد
;))System.out.println(str1.compareToIgnoreCase(str2
0
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 313
همانطور که مشاهده میکنید با وجودیکه رشته اول با حروف بزرگ نوشته شده است ولی متد )( compareToIgnoreCaseباز
هم مقدار صفر را بر میگرداند که نشان دهنده مساوی بودن دو رشته است .یکی دیگر از متدهای مقایسه رشتهها متد )(equals
;))System.out.println(str1.equals(str2
true
متد )( equalsIgnoreCaseهم دو رشته را بدون در نظر گرفتن کوچکی و بزرگی حروف با هم مقایسه و مقدار trueیا false
را بر میگرداند.
چندین راه برای الحاق رشتهها به هم وجود دارد .الحاق به معنای چسباندن چندین رشته به هم و تبدیل آنها به یک رشته است.
در جاوا یکی از راههای ساده الحاق رشتهها استفاده از عملگر +است:
;)System.out.println(result
مشاهده میکنید که استفاده از این عملگر چطور باعث ترکیب دو عملوند رشته ای شد .به این نکته توجه کنید که استفاده از عملگر
+باعث ترکیب یک رشته با یک نوع داده ای دیگر مانند intمیشود که در این حالت نوع intبه صورت خودکار به نوع رشته
راه دیگر برای چسباندن دو رشته استفاده از متد )( concatمیباشد .شما میتوانید تعداد بی نهایت رشته یا شیء به عنوان
آرگومان به این متد ارسال کنید .در زیر نحوه استفاده از این متد نشان داده شده است:
311 کار با تاریخ ،فایل و رشته
Hello World
استفاده از متد )( joinنیز یکی دیگر از روشهای الحاق رشتهها است .از این متد برای ترکیب رشتهها و ذخیره آنها در یک آرایه
;)System.out.println(result
Welcome to my site.
متد )( joinدو آرگومان قبول میکند ،اولین آرگومان ،رشته ای است که در داخل هر یک از رشتههایی که قرار است با هم ترکیب
شوند قرار میگیرد .که در مثال باال یک رشته که در اصل یک فضای خالی است( ” ” ) را بین کلمات قرار میدهیم .دومین آرگومان
خود آرایه رشته ای است .سربارگذاری دیگر این متد به شما اجازه میدهد به جای آرایه رشته ای ،لیست رشتهها را ارسال کنید.
;)System.out.println(result
Welcome to my site.
رشتهها در جاوا تغییر ناپذیر هستند .این بدین معنی است که متغیر رشته ای یکبار مقدار دهی میشود و مقدار آن تغییر نمیکند.
وقتی مقدار یک رشته را در جاوا اصالح میکنید یک نسخه جدید از رشته ایجاد و نسخه قبلی دور انداخته میشود .بنابراین همه
متدهایی که با رشتهها سر و کار دارند یک نسخه از رشته اصالح شده را بر میگردانند و نسخه اصلی دست نخورد باقی میماند.
اگر بخواهید یک رشته را به چند رشته تکه تکه کنید میتوانید از متد )( splitاستفاده نمایید .اجازه دهید نگاهی به سربارگذاری
های مختلف این متد بیندازیم .متد )( Splitآرایه ای از رشتهها را بر میگرداند که هر عنصر از این آرایه شامل یک زیر رشته
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 311
است .اولین سربارگذاری این متد آرایه ای از کاراکترها را قبول میکند و بر اساس آنها تشخیص میدهد که رشته باید در چه جایی
;"String message = "The quick brown fox jumps over the lazy dog.
;)" "(String[] substrings = message.split
The
quick
brown
fox
jumps
over
the
lazy
dog.
در مثال باال از کاراکتر فاصله ( ‘ ‘ ) برای جدا کردن کلمات در رشته باال استفاده کردهایم چون دو کلمه متوالی به وسیله فاصله از هم
جدا میشوند .کلمات در آرایه substringsذخیره میشوند .سپس با استفاده از دستور foreachآنها را در خطوط جداگانه
چاپ میکنیم .میتوان تعداد زیررشتههای برگشتی را به وسیله سربارگذاری دیگر متد )( Splitمحدود کرد.
;"String message = "The quick brown fox jumps over the lazy dog.
;)String[] substrings = message.split(" ", 3
The
quick
brown fox jumps over the lazy dog.
همانطور که در مثال باال مشاهده میکنید دومین آرگومان برای تشخیص تعداد زیر رشتهها به کار میرود .خروجی نشان میدهد
که دو کلمه اول از رشته جدا شدهاند و مابقی رشته در عنصر آخر آرایه ذخیره میشود.
جستجوی رشتهها
311 فایل و رشته،کار با تاریخ
اجازه بدهید که نگاهی به متدهای مختلفی که محل وقوع یک رشته.جستجوی رشتهها به وسیله متدهای جاوا بسیار راحت است
. محل یک رشته خاص را در رشته دیگر نشان میدهندlastIndexOf() وindexOf() متدهای.خاص را پیدا میکنند بیندازیم
: توجه کنیدindexOf() به مثالی در مورد متد. را بر میگردانند-3 اگر رشته مورد نظر پیدا نشود متدهای فوق مقدار
String str = "The quick brown fox jumps over the lazy dog.";
int index = str.indexOf("quick");
System.out.println(str);
System.out.println("quick was found at position " + index);
را بر میگرداند چون اندیس3 در مثال باال متد مقدار. یک رشته را که شما به دنبال آن هستید را دریافت میکندindexOf() متد
طول ادامه مییابد بنابراین کاراکتر-3 به یاد داشته باشید که اندیس یا مکان از صفر شروع شده و تا. است3 عددquick کلمه
System.out.println(str);
System.out.println("Last occurrence of very was found at position " + index);
در کد باال. با این تفاوت که اندیس آخرین محل وقوع رشته را بر میگرداندindexOf() بسیار شبیه متدlastIndexOf() متد
را بر-3 اگر یک رشته خاص در هنگام جستجو پیدا نشود این دو متد مقدار. است35 “ اندیسvery” آخرین محل وقوع کلمه
.میگردانند
System.out.println(str1);
if (str1.indexOf("Whatever") == -1)
{
System.out.println("\"Whatever\" was not found in the string.");
}
.یکی دیگر از سربارگذاری های این دو متد این است که یک آرگومان دومی را قبول میکنند محل شروع جستجو را تعیین میکند
System.out.println(str1);
if (str1.indexOf("This", 5) == -1)
{
System.out.println("\"This\" was not found in the string.");
}
در جمله باال وجود دارد ولی چون ما محل شروع جستجو در رشته را ازthis همانطور که مشاهده میکنید با وجودیکه کلمه
اگر بخواهیم تمام محلهای وقوع یک کلمه را پیدا کنیم میتوان به صورت زیر عمل. کلمه پیدا نمیشود، انتخاب کردهایم1 اندیس
:کنیم
int position = 0;
String str1 = "This is a long long long string...";
do
{
position = str1.indexOf("long", position);
if (position != -1)
System.out.println(position);
position++;
}
while (position > 0);
10
15
20
. هم میتواند چک کند که آیا یک رشته در داخل رشته دیگر وجود دارد یا نهcontains() متد
System.out.println(str1);
if (str1.contains("sample"))
{
System.out.println("\"sample\" exists in the string.");
}
این متد اگر رشته مورد نظر وجود داشته باشد مقدار trueو اگر وجود نداشته باشد مقدار falseرا بر میگرداند .هر دو متد
)( startsWithو )( endsWithبرای یافتن یک رشته در ابتدا و انتهای یک رشته خاص به کار میروند.
;)System.out.println(str1
))"if (str1.startsWith("A
{
;)"System.out.println("The word starts with A.
}
))"if (str1.endsWith("e
{
;)"System.out.println("The word ends with e.
}
Apple
The word starts with A.
The word ends with e.
میتوان ب زرگی و کوچکی حروف یک رشته را تغییر داد .به عنوان مثال یک رشته که متشکل از حروف کوچک است را میتوان به
حروف بزرگ تبدیل کرد .با استفاده از متدهای )( toUpperCaseو )( toLowerCaseمیتوان حروف رشته را بزرگ یا کوچک
کرد.
lowercase.toUpperCase() = ABC
uppercase.toLowerCase() = abc
به این نکته توجه کنید که اگر بخو اهیم یک رشته به عنوان مثال یک جمله که از حروف بزرگ و کوچک تشکیل شده است ،مثال
حرف اول هر کلمه بزرگ و بقیه حروف کوچک نوشته شده باشند را با استفاده از متد )( toUpperCaseتغییر دهیم فقط حروف
کوچک آن تغییر کرده و بزرگ میشوند و حروفی که از قبل بزرگ بودهاند تغییر نمیکنند .این نکته در مورد متد )(toLowerCase
نیز صدق میکند .حال بیایید یک متدی ایجاد کنیم که حرف اول کلمات هر رشته ای که به آن ارسال میشود را به صورت بزرگ و
بقیه را به صورت کوچک تبدیل کند .در این برنامه از متدهای دستکاری رشته که تا به حال یاد گرفتهایم استفاده شده است.
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 313
1 package myfirstprogram;
2
3 import java.util.Scanner;
4
5 class MyFirstProgram
6 {
7 static String ToTitleCase(String str)
8 {
9 String[] words = str.split(" ");
10
11 for(int i = 0; i<words.length; i++)
12 {
13 String firstLetter = words[i].substring(0, 1);
14 String rest = words[i].substring(1);
15 String result = firstLetter.toUpperCase() + rest.toLowerCase();
16 words[i] = result;
17 }
18
19 return String.join(" ", words);
20 }
21
22 public static void main(String[] args)
23 {
24 Scanner input = new Scanner(System.in);
25
26 String str1;
27
28 System.out.print("Enter a string: ");
29 str1 = input.nextLine();
30
31 System.out.println("Converting to Title Case...");
32 str1 = ToTitleCase(str1);
33
34 System.out.println(str1);
35 }
36 }
ابتدا.) که یک رشته را به عنوان آرگومان قبول میکند1-53 ایجاد کردهایم (خطوطToTitleCase() در مثال باال یک متد به نام
بنابراین میتوان هر رشته را به صورت، رشته را به کلمات تشکیل دهندهاش تقسیم بندی میکنیمsplit() با استفاده از متد
استخراج و در یک متغیر برای استفادههای بعدی ذخیره میکنیم (خطsubstring() اولین حرف هر کلمه را با استفاده از متد
حال رشتهها را با هم ترکیب میکنیم البته از متد )( toUpperCaseبرای بزرگ کردن حروف اول و از متد )( toLowerCaseبرای
بزرگ کردن بقیه حروف کلمات استفاده میکنیم .بعد از این کار عناصر آرایه را با کلمات اصالح شده جایگزین میکنیم.
سپس کلمات اصالح شده را با استفاده از متد )(( joinخط )36ترکیب کرده و در بین آنها فضای خالی قرار میدهیم .سپس
برای استخراج قسمتی از یک رشته میتوان از متد )( substringاستفاده کرد .این متد دو آرگومان قبول میکند که یکی اندیس
شروع و دیگری طولی از رشته را که میخواهیم استخراج کنیم را نشان میدهد .به مثال زیر توجه کنید.
استخراج را از اندیس 33شروع کردهایم (آرگومان اول که عدد 33است) .همانطور که مشاهده میکنید کلمه ” “sampleاز اندیس
33شروع شده است (کاراکتر یازدهم) .آرگومان دوم نشان میدهد که ما تا چندمین کاراکتر را میخواهیم استخراج کنیم .ازآنجاییکه
قرار است کلمه sampleرا استخراج کنیم و این کلمه 1حرفی است پس باید آرگومان دوم را 31بنویسیم یعنی قرار است از 33تا
31را استخراج کنم .اگر نخواهید که مکان قرار گرفتن کلمه ” “sampleرا به صورت دستی شمارش کنید میتوانید با استفاده از
یکی دیگر ازسربارگذاریهای متد )( substirngفقط یک آرگومان که برای تعیین کردن اندیس شروع استخراج به کار میرود را
قبول میکند در نتیجه استخراج از این اندیس شروع شده و تا پایان رشته ادامه مییابد.
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 315
با استفاده از متد )( replaceمیتوان یک رشته خاص را با یک رشته دیگر عوض کرد .به عنوان مثال در کد زیر میتوان کلمه
متد )( replaceدو آرگومان قبول میکند .اولین آرگومان رشته ای است که میخواهیم آن را با یک رشته جدید جایگزین کنیم
(رشته قدیم) و دیگری رشته جدید است .متد )( replaceتمام کلمات ” “dogواقع در رشته را پیدا کرده و کلمه ” “catرا
جایگزین آنها میکند .حال اگر بخواهید فقط اولین کلمه dogبه وسیله کلمه catجایگزین شود میتوانید از متد
متد )( replaceAllهم یک سری کاراکتر به عنوان الگو میگیرد و در هر جای رشته که آنها را پیدا کند با رشته یا کاراکتری که
خودمان میخواهیم جایگزین میکند .فرض کنید که در داخل رشته ای عالئمی مانند – ،+و * قرار دارند و میخواهیم آنها را حذف
;)System.out.println(result
!Hello World
311 کار با تاریخ ،فایل و رشته
همانطور که در کد باال مشاهده می کنیداین متد دو آرگومان میگیرد که اولین آرگومان کاراکترهایی هستند که آنها را در داخل
جفت کروشه به صورت رشته قرار دادهایم و دومین آرگومان هم که “” (جفت کوتیشن بدون فاصله) میباشد که برای حذف کردن
خاصی که در جدول زیر آمدهاند ،قالب بندی را انجام میدهد .الگوی کلی قالب بندی رشتهها و اعداد به صورت زیر است:
در الگوی باال اجزایی که در داخل کروشه هستند اختیاری میباشند .در حالت عادی الگو با عالمت %شروع میشود و بعد از آن یکی
;)System.out.printf("%f",34.789456
همانطور که مشاهده میکنید در مثال باال از %fبرای نمایش عدد اعشار استفاده کردهایم .همین مثال ،مثال خوبی است که به شما
نحوه استفاده از اجزایی که در داخل کروشه هستند را نشان دهیم .ابتدا کاربرد flagیا نشانه را می گوییم .نشانههایی که بعد از
کاربرد نشانه
با اضافه کردن فاصله به سمت راست یک عدد یا رشته آن را به سمت چپ میکشد. -
با اضافه کردن فاصله به سمت چپ یک عدد یا رشته آن را به سمت راست میکشد. +
تعدادی صفر که خودمان تعیین کردهایم به سمت راست یا چپ نوشته یا عدد اضافه میکند 0
تعدادی فاصله که خودمان تعیین کردهایم به سمت راست یا چپ نوشته یا عدد اضافه میکند فاصله
به کار بردن نشانههای باال به تنهایی و بدون اینکه تعیین کنیم چه تعداد فاصله یا صفر میخواهیم به ابتدا یا انتهای عدد یا رشته
اضافه کنیم بی معنی میباشد .در این صورت باید از جزء بعدی که widthیا پهنا هست استفاده کنیم [.precision] .هم در
صورتی که متغیر از نوع اعداد اعشاری باشد ،برای تعیین تعداد ارقام اعشار ،و اگر از نوع رشته باشد تعداد کارکترهایی که قرار است
نمایش داده شوند را مشخص میکند .حال به مثال بر میگردیم .فرض کنید که میخواهیم سه رقم از ارقام بعد از ممیز عدد اعشار
مثال باال را نشان داده و قبل از بخش صحیح آن سه عدد صفر قرار دهیم یعنی .00034.789انجام این کار بسیار راحت است:
;)System.out.printf("%09.3f",34.789456
00034.789
همانطور که در کد باال مشاهده میکنید الگو با عالمت %شروع میشود .سپس نشانه را مینویسیم که در اینجا 3است .اما اینکه
چرا عدد 6را نوشتهایم دلیلش این است که 13.106با احتساب ممیز آن برای نمایش نیاز به شش جای خالی دارد و چون قرار
311 کار با تاریخ ،فایل و رشته
است که ما سه صفر هم قبل از عدد 13قرار دهیم پس باید 6جای خالی ایجاد کنیم .و اما [ ] .1هم به معنای سه رقم اعشار است
و fهم که برای نمایش اعداد اعشاری به کار میرود .فرض کنید که میخواهیم سه کاراکتر اول رشته Programmingرا نمایش
;)"System.out.printf("%.3s","Programming
Pro
در زیر هم مثالهایی از نحوه استفاده از متد printfو کاراکترهای خاص آن آمده است:
همانطور که مشاهده میکنید در کد باال استفاده از \tباعث ایجاد فاصله بین رشتهها میشود.
چاپ متغیرها
درباره کد باال یک نکته را یادآور میشویم و آن این است که اگر تعداد کاراکترهای یک رشته از تعدادی که ما برای قالب بندی آن
استفاده کردهایم کمتر باشد تعدادی فاصله در سمت چپ یا راست رشته قرار میگیرد .مثال تعداد کاراکترهای Column 1هشت
عدد میباشد و ما برای قالب بندی و ایجاد فاصله در سمت راست آن عدد -35را به کار بردهایم .با این کار 3فاصله در سمت راست
رشته قرار میگیرد و باعث فاصله آن با رشته بعدی میشود .حال اگر تعداد کارکترهای رشته بیشتر از تعداد باشد که ما تعیین
کردهایم ،کل رشته یا عدد بدون هیچ گونه فاصله ای در سمت چپ یا راست ،نمایش داده میشود .همین نکته در مورد مثالهای
;)System.out.printf("%d",1234
;)System.out.printf("%3d",1234
;)System.out.printf("%6d",1234
;)System.out.printf("%-6d",1234
;)System.out.printf("%06d",1234
;)System.out.printf("%s", str
;)System.out.printf("%10s", str
;)System.out.printf("%15s", str
;)System.out.printf("%-15s", str
;)System.out.printf("%15.5s", str
;)System.out.printf("%-15.5s", str
Programming
Programming
----Programming
Programming----
----------Progr
Progr----------
311 کار با تاریخ ،فایل و رشته
در دو کد آخر خطهای تیره در اصل فاصله هستند که برای روشن شدن موضوع آنها را به صورت خط تیره نمایش دادهایم.برای
روشن شدن کاربرد اعداد منفی و مثبت بعد از عالمت %فرض کنید که شما میخواهید بین دو رشته JAVAو Programmingچهار
فاصله قرار دهید .این کار به دو صورت امکان پذیر است .یا بعد از کلمه JAVAچهار فاصله قرار دهید:
;)"System.out.printf("%-8s%s", "JAVA","Programming
JAVA Programming
که در مثال باال -0بع معنای این است که 0مکان ایجاد شود که چهار تا از آنها توسط کلمه JAVAاشغال میشود و چهار تای
دیگر به خاطر عالمت منفی در سمت راست کلمه JAVAقرار میگیرند.حالت دوم هم این است که در سمت چپ کلمه Programming
;)"System.out.printf("%s%15s", "JAVA","Programming
JAVA Programming
که در این صورت باید عدد 31را بنویسیم .چونکه کلمه Programmingیازده حرفی است ،پس چهار مکان دیگر به خاطر مثبت
بودن عالمت 31در سمت چپ آن قرار میگیرند .روش دیگر برای قالب بندی رشتهها استفاده از متد )( formatاز کالس String
است .این متد شبیه به متد )( printfعمل میکند .به مثال زیر توجه کنید:
;)System.out.println(Str2
;)System.out.println(Str3
;)System.out.println(Str4
نکته ای که فراموش شد و االن یادآور میشویم در مورد اعداد اعشار است .اگر تعدادی که ما برای نمایش رقم اعشار مشخص
کردهایم بیشتر از ارقام اعشار عدد باشد بسته به تعدادی که ما مشخص کردهایم عدد صفر بعد از ارقام اعشار قرار میگیرد .مثال در
مثال باال ] [.12یعنی دوازده رقم اعشار نمایش داده شود و چون تعداد ارقام اعشار عدد در مثال باال 1تا میباشد در نتیجه هفت
کالس StringBuilder
کالس Stringمیتواند با استفاده از عم لگر +دو رشته را به هم متصل کند .اما این عملگر برای الحاق دو رشته مختلف کارا
نیست.چون شی رشته در جاوا تغییر ناپذیر است یعنی وقتی که یک متغیر از نوع رشته را تعریف میکنیم مقدار آن تغییر
نمیکند.هنگامی که یک رشته را به یک رشته موجود میچسبانید مقدار قبلی حذف و یک شیء جدید که شامل دو رشته به هم
Cat
با هر بار انجام این فرایند اشیاء موقتی ایجاد و اشیاء قدیمی از بین میروند و این ایجاد و حذف شدنها هم زمان برند و هم
حافظه را اشغال میکنند .به مثال زیر توجه کنید ،مثال اگر بخواهید همه اعداد 3تا 6666را به هم بچسبانید:
ممکن است با نگاه کردن به کد متوجه هیچ مشکلی نشوید اما اگر از متد )( currentTimeMillisکالس Systemاستفاده کنید
متوجه میشوید که اجرای این برنامه چقدر زمان میبرد .کد باال را به صورت زیر اصالح میکنیم:
19 ;)System.out.println(totalTime
20 }
21 }
هدف از برنامه باال تبدیل 3333عدد به رشته و چسباندن آنها به یکدیگر است .با استفاده از متد )( currentTimeMillisکالس
Systemکه زمان جاری را نشان میدهد یک کرونومتر ایجاد میکنیم که زمان شروع آن قبل از اجرای حلقه ( forخط )33و زمان
پایان آن بعد از اتمام حلقه (خط )31میباشد .به طور میانگین اجرای برنامه باال 1553 msزمان میبرد (البته ممکن است این زمان
در سیستم شما متفاوت باشد) .حال اجازه دهید که با استفاده از کالس StringBuilderاین اعداد را به هم وصل کنیم .این کار
مشاهده میکنید که اجرای برنامه حدود 3 msطول میکشد .همانطور که مشاهده کردید کارایی برنامه به طور چشمگیری بهبود
یافت .کارایی برنامه با افزایش متغیر حلقه بیشتر میشود.کالس StringBuilderبرای کار و اتصال رشتههای زیاد به هم بسیار
قدرتمند است .این کالس دارای متدهای مختلفی است که در زیر به برخی از آنها اشاره شده است.
توضیحات متد
برای کپی یک توالی از کارکترهای یک رشته در یک آرایه کاراکتری به کار میرود. )(getChars
برای جدا کردن یک توالی از کاراکترها از رشته اصلی به کار میرود. )(substring
File System
بیشتر اوقات الزم است که دادههایتان را در یک فایل دائمی ذخیره کنید .همچنین الزم است که به سیستم فایلها یا دایرکتوری
کامپیوتر دسترسی داشته باشید به طوری که بتوانید فایلها را در آنها قرار داده و ذخیره کنید ،مکانی را که میخواهید فایل درآن
ذخیره شود را نشان داده ،فایلی که در یک دایرکتوری ذخیره شده را مشاهده کرده و به طور خالصه جزییاتی در مورد یک دایرکتوری
شما حتی میتوانید چک کنید که اندازه فایل چقدر است و آیا فایل از نوع فقط خواندنی است یا نه؟ اگر چه استفاده از پایگاه داده
امروزه بیشتر ترجیح داده میشود ،اما گاهی اوقات برای برانامه های کوچک استفاده از یک فایل متنی کارا تر است .همچنین برخی
از برنامههای کاربردی هنوز وجود دارند که دادههایشان را در یک فایل متنی ذخیره میکنند و بنابراین الزم است که اطالعات در این
313 کار با تاریخ ،فایل و رشته
فایل نوشته و از آن خوانده شود .جاوا دارای کالسهایی است که شما با استفاده از آنها میتوانید محتویات فایلها را بخوانید،
در داخل آنها بنویسید و صفات فایلها و دایرکتور یها را چک کنید .در درسهای بعدی نحوه نوشتن یک داده باینری و فشرده
پکیج Java IOدارای کالسهای مختلفی است که از آنها برای انجام عملیاتی مانند ایجاد و حذف فایلها ،خواندن از فایل و
نوشتن در آن و همچنین باز و بسته کردن فایلها استفاده میشود ،همچنین از این پکیج در مباحث پیشرفته برای کار در شبکه
نیز استفاده میشود .قبل از توضیح این کالسها ابتدا بهتر است با دو کلمه fileو streamآشنا شوید.
یک Fileمجموعه ای از دادههای ذخیره شده در دیسک با یک نام خاص ،پسوند و یک مسیر میباشد .وقتی فایل را با JAVA
برای خواندن نوشتن باز میکنید ،فایل تبدیل به Streamمیشود Stream .در لغت به معنای جریان است و در مجموع به یک
توالی یا سری از بایتها که بین دو مسیر مبداء و مقصد در حال حرکت هستند گفته میشود .برای کار با کالسهای پکیج Java
;*import java.io.
در جدول زیر لیست کالسهای معمول این پکیج آمده است:
توضیح کالس
از این کالس abstractبرای خواندن کاراکتر از یک جریان بایتی به کار میرود. Reader
از این کالس abstractبرای نوشتن کاراکتر در یک جریان بایتی به کار میرود. Writer
از این کالس abstractبرای خواندن از یک جریان بایتی به کار میرود. InputStream
از این کالس abstractبرای نوشتن در یک جریان بایتی به کار میرود. OutputStream
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 315
برای ایجاد ،حذف ،انتقال و انجام اعمال مختلف بر روی فایلها و پوشهها به کار میرود. File
برای خواندن از فایل و نوشتن در فایل به شیوه دسترسی تصادفی به کار میرود. RandomAccessFile
برای خواندن از یک آرایه که حاوی دادههای یک جریان بایتی است به کار میرود. ByteArrayInputStream
کالسی قدرتمند و کاربردی است که برای نوشتن در انواع مختلف خروجی استفاده میشود. PrintWriter
حال که با کالسهای معمول این پکیج آشنا شدید در درسهای آینده در مورد کار با آنها توضیح میدهیم.
اگرچه با استفاده از جریانهای بایتی میتوان هر نوع عملیات ورودی و خروجی را پیاده سازی کرد ولی استفاده مستقیم آنها برای
کار با دادههای متنی مبتنی بر یونیکد چندان آسان نیست و نیازمند تبدیالت میانی است برای راحتی کار با دادههای متنی در جاوا
از زیر کالسهای Readerبرای خواندن و از زیر کالسهای Writerبرای نوشتن استفاده میشود.
کالسReader
کالس Readerیک کالس انتزاعی ) (abstractاست که مستقیما آن را به کار نمیبریم بلکه از زیر کالسهای آن که کابرد های
متفاوتی دارند استفاده میکنیم .در صورتی که قصد داشته باشید برای یک کاربرد خاص ویژگی جدیدی به کالس Readerاضافه
کنید باید یک زیر کالس از آن ایجاد کنید .در جدول زیر لیست زیر کالسهای مهم این کالس که در آموزشهای بعدی با آنها
توضیح کالس
کالسWriter
برای نوشتن کاراکتر در یک جریان بایتی از زیر کالسهای Writerاستفاده میکنیم .کالس Writerیک کالس انتزاعی
) (abstractاست که مستقیما آن را به کار نمیبریم بلکه از زیر کالسهای آن که کابرد های متفاوتی دارند استفاده میکنیم .در
صورتی که قصد داشته باشید برای یک کاربرد خاص ویژگی جدیدی به کالس Writerاضافه کنید باید یک زیر کالس از آن ایجاد
کنید .در جدول زیر لیست زیر کالسهای مهم این کالس که در آموزشهای بعدی با آنها آشنا میشویم آمده است:
توضیح کالس
کالسی قدرتمند و کاربردی است که برای نوشتن در انواع مختلف خروجی استفاده میشود. PrintWriter
حال که با کالسهای معمول این پکیج آشنا شدید در درسهای آینده در مورد کار با آنها توضیح میدهیم.
برای خواندن از یک جریان بایتی از زیر کالسهای InputStreamاستفاده میشود .کالس InputStreamیک کالس انتزاعی
) (abstractاست که مستقیما آن را به کار نمیبریم بلکه از زیر کالسهای آن که کابرد های متفاوتی دارند استفاده میکنیم .در
صورتی که قصد داشته باشید برای یک کاربرد خاص ویژگی جدیدی به کالس InputStreamاضافه کنید باید یک زیر کالس از آن
ایجاد کنید .در جدول زیر لیست زیر کالسهای مهم این کالس که در آموزشهای بعدی با آنها آشنا میشویم آمده است:
توضیح کالس
برای خواندن از یک آرایه که حاوی دادههای یک جریان بایتی است به کار میرود. ByteArrayInputStream
برای نوشتن یک جریان بایتی از زیر کالسهای InputStreamاستفاده میشود .کالس OutputStreamیک کالس انتزاعی
) (abstractاست که مستقیما آن را به کار نمیبریم بلکه از زیر کالسهای آن که کابرد های متفاوتی دارند استفاده میکنیم .در
صورتی که قصد داشته باشید برای یک کاربرد خاص ویژگی جدیدی به کالس OutputStreamاضافه کنید باید یک زیر کالس از
آن ایجاد کنید .در جدول زیر لیست زیر کالسهای مهم این کالس که در آموزشهای بعدی با آنها آشنا میشویم آمده است:
توضیح کالس
کالس File
در جاوا از کالس Fileبرای دستکاری فایلهای موجود در یک دایرکتوری استفاده میشود .این کالس دارای متدهایی است که به
شما اجازه کپی ،حذف ،بازکردن ،انتقال و ایجاد یک فایل را میدهند .کالس Fileدر پکیج java.ioقرار دارد و باید آن را در
;import java.io.File
کاربرد متد
چک میکند که آیا مسیر داده شده ،یک فایل است یا نه؟ )(isFile
چک میکند که آیا مسیر داده شده ،یک پوشه است یا نه؟ )(isDirectory
چک کردن اینکه آیا یک فایل در یک مسیر خاص وجود دارد یا نه؟ )(exists
ایجاد یک فایل
با استفاده از متد )( createNewFileمیتوان یک فایل جدید ایجاد کرد .این متد یک مقدار بولی را بر میگرداند .اگر فایل ایجاد
شود trueو در غیر اینصورت falseرا بر میگرداند .البته قبل از استفاده از این متد باید یک نمونه از کالس فایل ایجاد شده و
سپس مسیری که قرار است فایل در آنجا ساخته شود به عنوان پارامتر به سازنده کالس فایل ارسال شود .به مثال زیر توجه کنید:
try
{
))(if(f.createNewFile
{
;)"!System.out.println("The File is created
}
}
)catch(IOException e
{
;))(System.out.println(e.getMessage
}
نکته اینجاست که اگر فایلی از قبل به این نام وجود داشته باشد حذف نشده و فایل جدید جایگزین نمیشود .همانطور که در کد
باال مشاهده میکنید باید خطاهای ایجاد و یا عدم ایجاد فایل را مدیریت کنید .روش دیگر برای ایجاد فایل ایجاد IOExeption
;)(f.createNewFile
}
311 کار با تاریخ ،فایل و رشته
با استفاده از متد existsمیتوان تست کرد که آیا مسیری که مورد نظر شماست وجود دارد ،که در صورت پیدا کردن مسیر فایل
))(if (f.exists
{
;)"!System.out.println("The File found
}
حذف یک فایل
;)(f.delete
برای انتقال یک فایل یک از مسیر به مسیر دیگر میتوانید از متد )( renameToاستفاده میشود:
در خط دوم کد باال ما در داخل متد )( renameToیک شیء جدید ایجاد کردهایم و مسیر جدید را که درایو Dاست به آن دادهایم.
برای اینکه نام فایل هم تغییر نکند از متد )( getNameبرای به دست آوردن نام فایل مبدأ استفاده کردهایم .در کل معنی کد باال
این است که فایل اصلی را به درایو Dو با همین نام منتقل کن .برای روشن شدن مطلب به کد زیر توجه کنید:
;)Sourcesample.renameTo(Destsample
در کد باال ما یک فایل مبدأ داریم با نام Sourcesampleو میخواهیم آن را به درایو Dمنتقل کنیم .برای این کار یک شیء جدید
که نشان دهنده مکان جدید است با نام Destsampleایجاد کرده و به عنوان پارامتر به متد )( renameToارسال میکنیم .برای
انتقال و تغیر نام همزمان هم میتوانیم به صورت زیر مسیر و نام جدید را تعریف کنیم:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 310
برای به دست آوردن مسیر و والد یک فایل از متدهای )( getParentو )( getPathبه صورت زیر استفاده میشود:
;))(System.out.println(f.getName
;))(System.out.println(f.getParent
;))(System.out.println(f.getPath
Sample.txt
\C:
C:\Sample.txt
همانطور که در کد باال مشاهده میکنید نام فایل ،مکان و مسیر فایل نشان داده شده است .کالس Fileدارای متدهای بیشتری
برای کار با فایل است که در این درس به همین چند متد اکتفا میکنیم.
;)(f.mkdir
کد باال یک پوشه با نام Folder1در درایو Cایجاد میکند .و برای ایجاد پوشههای تو در تو از متد )( mkdirsمیتوان استفاده
کرد:
;)(f.mkdirs
کد باال یک پوشه با نام Folder1در درایو Cایجاد میکند که در داخل آن یک پوشه دیگر Folder2قرار دارد.
برای به دست آوردن نام پوشهها و فایلهای موجود در یک پوشه از متد )( listFilesاستفاده میشود .یک پوشه به نام Folder
در داخل درایو Cایجاد کرده و دو فایل و یک پوشه در داخل آن قرار دهید .سپس کدهای زیر را بنویسید:
316 کار با تاریخ ،فایل و رشته
;package myfirstprogram
;import java.io.File
در کد باال ابتدا مسیر پوشه ای که در درایو Cایجاد کردهایم را در سازنده کالس Fileنوشتهایم .در خط بعد با استفاده از متد
)( isDirectoryچک میکنیم که آیا مسیر متعلق به یک پوشه است یا نه؟ اگر چنین بود در داخل بدنه دستور ifابتدا یک
آرایه از کالس فایل ایجاد میکنیم ،چون متد )( listFilesیک آرایه از فایلها را بر می کرداند .سپس با استفاده از یک حلقه
همانطور که در مثال قبل دیدیم با استفاده از متد )( listFilesمیتوانیم لیست فایلها و زیر پوشههای یک پوشه خاص را به
دست بیاوریم ولی گاهی نیاز داریم تنها زیر پوشهها را لیست کنیم برای اینکار میتوانیم از FileFilterاستفاده کنیم .به مثال زیر
دقت کنید:
;package myfirstprogram
;*import java.io.
))(if(file.isDirectory
{
;)File[] files = file.listFiles(myFilter
)for(File f : files
{
;))(System.out.println(f.getName
}
}
}
}
مثال باال لیست زیر پوشههای پوشه MyFolderرا چاپ میکند.برای استفاده از FileFilterابتدا یک شیء از آن ایجاد میکنیم،
چون این کالس یک Interfaceاست مجبور به پیاده سازی متد )( acceptآن خواهیم بود ،در داخل متد )( acceptمشخص
میکنیم که چه نوع فایلهایی باید لیست شوند؟ در اینجا فقط فایلهایی که شرط isDirectoryبرای آنها trueباشد (به
عبارتی پوشه باشند و نه یک فایل معمولی) لیست خواهند شد .برای استفاده از myFilterکافی است آن را به عنوان پارامتر به
متد )( listFilesارسال کنیم.در مثال بعد با کاربرد FileFilterبیشتر آشنا خواهید شد .گاهی نیاز داریم تا فایلهای خاصی
را لیست کنیم ،به عنوان مثال در یک برنامه مخصوص ویرایش متن ممکن است الزم داشته باشیم تنها فایلهای با پسوند txt
چاپ شوند ،خوشبختانه در این حالت هم میتوانیم از FileFilterاستفاده کنیم .مثال زیر تمام فایلهای با پسوند txtکه در
;package myfirstprogram
;*import java.io.
))(if(file.isDirectory
{
;)File[] files = file.listFiles(myFilter
)for(File f : files
{
;))(System.out.println(f.getName
}
}
}
}
303 کار با تاریخ ،فایل و رشته
همانطور که مشاهده میکنید این مثال بسیار شبیه مثال قبلی است با این تفاوت که در اینجا به جای استفاده از شرط
isDirectoryاز شرط متفاوت تری به صورت getName().endsWithاستفاده میکند ،متد )( getNameنام فایل را بر
میگرداند و متد )( endsWithمشخص میکند آیا نام فایل با پسوند .txtخاتمه مییابد یا خیر؟ در نتیجه استفاده از myFilter
به عنوان پارامتر ورودی listFilesباعث میشود تنها فایلهایی با پسوند txtچاپ شوند .گاهی نیاز پیدا میکنیم برای لیست
کردن فایلها شرطهای متفا وتی داشته باشیم به عنوان مثال ممکن است بخواهیم تمام فایلهای txtو exeو همچنین تمام
زیر پوشههای یک پوشه خاص را لیست کنیم برای این کار کافی است از عملگر || برای ترکیب شرطها استفاده کنیم .مثال زیر تمام
فایلهای exeو همچنین تمام زیر پوشههای پوشه MyFolderرا لیست میکند:
;package myfirstprogram
;*import java.io.
))(if(file.isDirectory
{
;)File[] files = file.listFiles(myFilter
)for(File f : files
{
;))(System.out.println(f.getName
}
}
}
}
برای به دست آوردن نام درایوهای اصلی سیستم هم از متد )( listRootsاستفاده میکنیم :
;package myfirstprogram
;*import java.io.
{
;)System.out.println(f
}
}
}
همانطور که مشاهده میکنید متد )( listRootsیک آرایه از نوع Fileبر میگرداند که با یک حلقه forمیتوانیم اشیای
داخل آن را مورد بررسی قرار دهیم.دقت کنید که متد )( listRootsیک متد staticاست و برای استفاده از آن نیاز به ساختن
برای لیست فایلها و پوشههای داخل یک پوشه خاص میتوانیم از یکی از متدهای )( listیا )( listFilesاستفاده کنیم،
تفاوت این دو متد در این است که متد )( listتنها آرایه ای از Stringها بر میگرداند که حاوی نام فایلهاست و مناسب
برنامههایی است که تنها به نام فایل نیاز داریم ولی متد )( listFilesآرایه ای از نوع Fileبر میگرداند و این قابلیت را به ما
میدهد که مستقیما با زیر فایلها و زیر پوشههای پوشه مورد نظر به سادگی کار کنیم .
برای تعیین فضای خالی یک درایو میتوانیم از متد )( getFreeSpaceاستفاده کنیم ،این متد تعداد بایتهای آزاد یک درایو را
مشخص میکند ،فراخوانی این متد فقط باید بر روی درایوهای اصلی انجام شود و بر روی سایر فایلها نتیجه ای نخواهد داشت.
برای تعیین حجم یک درایو میتوانیم از متد )( getTotalSpaceاستفاده کنیم ،این متد حجم یک درایو را برحسب بایت در
اختیار ما قرار میدهد ،مشابه متد قبلی این متد نیز باید روی درایوهای اصلی فراخوانی شود .مثال زیر حجم درایو Gرا مشخص
میکند:
کالس InputStreamReader
در آموزشهای قبلی با کالسهای انتزاعی Readerو InputStreamآشنا شدیم ،کالس InputStreamReaderبه عنوان واسط
بین این دو کالس عمل میکند ،این کالس دادهها را به صورت جریان بایتی از ورودی میخواند و بر اساس یک charsetمشخص
آنها را به جریان کاراکتری تبدیل میکند ،مهمترین کاربرد این کالس استفاده از آن در کاربردهای شبکه است بدین صورت که
اطالعات به صورت جریان بایتی از شبکه خوانده میشوند و سپس به جریان متنی تبدیل میشوند .از این کالس میتوان برای
خواندن از فایل ،خواندن از وروردی سیستم (کنسول) و یا خواندن از یک حافظه بافر نیز استفاده کرد .برای استفاده از این کالس
باید از یکی از سازندههای زیر برای ساخت شیء جدید از آن استفاده کنیم:
)InputStreamReader(InputStream in
)InputStreamReader(InputStream in,Charset cs
)InputStreamReader(InputStream in,String charsetName
کاربرد متد
جریان ورودی را بسته و منابع استفاده شده را آزاد میکند )( close
کاراکترها را از جریان ورودی خوانده و در آرایه cbufذخیره میکند و )read(char [] cbuf,int offset,int length
برای خواندن وجود نداشته باشد خروجی این متد مقدار -3خواهد
بود.
. محتوی یک فایل متنی را کاراکتر به کاراکتر خوانده و چاپ میکنیمread() در مثال زیر با استفاده از متد
package myfirstprogram;
import java.io.*;
int c;
while ((c = inputstreamreader.read()) != -1)
{
System.out.print((char)c);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
inputstreamreader.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
مشخص کنیمFile همانطور که در کد باال مشاهده میکنید ابتدا باید فایلی که قصد خواندن از آن داریم را با یک شیء از کالس
فایل مورد نظر را به یک جریان بایتی تبدیل کنیم (شیFileInputStream در مثال باال) سپس با استفاده ازmyFile (شی
301 کار با تاریخ ،فایل و رشته
fileinputstreamدر مثال باال) و در آخرین مرحله از تبدیالت ،جریان بایتی را با استفاده از InputStreamReaderبه جریان
متنی تبدیل میکنیم (شی inputstreamreaderدر مثال باال) .در ادامه با استفاده از متد readکاراکتر به کاراکتر از
inputstreamreaderمیخوانیم و تا زمانی که نتیجه فراخوانی این متد -3نباشد آن را در خروجی چاپ میکنیم .از آنجایی که
ممکن است فایل وجود نداشته باشد یا در هنگام عملیات خواندن با خطای پیش بینی نشده مواجه شویم باید حتما از بلوکtry-
همانطور که در ابتدا دیدیم متد )( readدیگر ی نیز وجود دارد که از یک آرایه بافر برای خواندن از جریان ورودی استفاده میکند،
در بسیاری از کاربردها خواندن کاراکتر به کاراکتر زمان بر بوده و بهتر است با استفاده از یک آرایه بافر عملیات خواندن را تسریع
;package myfirstprogram
;*import java.io.
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
نداریمFileInputStream خواندن از ورودی سیستم مشابه خواندن از فایل است با این تفاوت که در این حالت دیگری نیازی به
مثال زیر متنی را که کاربر در ورودی سیستم تایپ میکند (و در. مستقیما از ورودی سیستم میخوانیمSystem.in و با استفاده از
package myfirstprogram;
import java.io.*;
}
}
}
در مثال زیر از یک آرایه به عنوان جریان ورودی استفاده میکنیم.جریان ورودی میتواند مق ادیر ذخیره شده در یک آرایه نیز باشد
package myfirstprogram;
import java.io.*;
در مثال باال از یک حافظه بافر ( memoryBufferدر کد) به عنوان جریان ورودی استفاده کردیم ،برای ساخت حافظه بافر ابتدا
رشته testرا به آرایه ای از بایتها (متغیر )memoryBufferتبدیل کردیم ،سپس این آرایه از بایتها را با استفاده از
ByteArrayInputStreamبه یک جریان ورودی بایتی (متغیر )bytearrayinputstreamتبدیل کردیم و در نهایت با استفاده از
کالس OutputStreamWriter
در آموزشهای قبلی با کالسهای انتزاعی Writerو OutputStreamآشنا شدیم ،کالس OutputStreamWriterبه عنوان
واسط بین این دو کالس عمل میکند ،با استفاده از این کالس میتوانیم یک جریان کاراکتری را به جریان بایتی تبدیل و ذخیره
کنیم.بیشترین کاربرد این کالس زمانی است که بخواهیم رشتههایی با فرمتهایی همچون UTF-16 ،UTF-8و … را به صورت
بایتی ذخیره کنیم و در عین حال مطمئن باشیم که عمل decodeبه درستی صورت میگیرد .کار با این کالس دشوار است و معموال
از این کالس به عنوان ابزار کمکی در کنار کالسهای پیشرفته تر استفاده میشود .برای استفاده از این کالس باید از یکی از
کاربرد متد
قسمتی از آرایه cbufرا با شروع از اندیس offsetبه تعداد )write(char[] cbuf,int offset,int length
مشابه متد قبلی است با این تفاوت که به جای آرایه ای از کاراکترها از write(String str,int offset,int length)
نوشتن در فایل
package myfirstprogram;
import java.io.*;
try
{
fileoutputstream = new FileOutputStream(myFile);
outputstreamwriter.write(sampleData, 0, sampleData.length());
outputstreamwriter.flush();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
outputstreamwriter.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
RandomAccessFile کالس
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 363
کالس RandomAccessFileهمانطور که از نام آن پیداست کالسی با قابلیت “دسترسی تصادفی” به فایل است که به ما اجازه
میدهد به صورت همزمان هم از فایل بخوانیم و هم در آن بنویسیم ،با استفاده از این کالس با فایل به مثابه یک آرایه بزرگ
برخورد میکنیم ،این فایل دارای ساختاری اندیسی یا اشاره گر گونه است که در هر لحظه به آخرین مکانی که عمل خواندن یا
نوشتن در آن انجام شده است اشاره میکند ،این کالس با متدهای مختلفی که در اختیار ما قرار میدهد کار با انواع دادههای
مختلف اعم از اعداد صحیح ،اعداد ممیز شناور ،رشتهها و … را بسیار آسان میسازد .برای استفاده از این کالس باید از یکی از
پارامتر mod
قبل از ادامه باید با پارامتر modآشنا شویم ،این پارامتر نحوه دسترسی به فایل را مشخص میکند و میتواند یکی از موارد زیر
باشد:
معنی مقدار
مشخص میکند که قصد خواندن و نوشتن داریم و تغییرات فایل یا متا دیتا باید سریعا بر روی فایل اعمال شوند. rws
مشابه مورد قبلی است با این تفاوت تغییر سریع متا دیتا الزامی نیست. rwd
کاربرد متد
جریان ورودی -خروجی را بسته و منابع استفاده شده را آزاد میکند )( close
قسمتی از آرایه bرا با شروع از اندیس offsetبه تعداد lenghtبایت را read(byte[] b,int offset,int
)length
از فایل میخواند.
متدی فوق العاده سریع برای خواندن یک آرایه از بایت است ،بهتر است از این )readFully(byte[] b
متد برای خواندن کل فایل در عملیاتی همچون کپی کردن فایل یا مشابه آن
استفاده کنیم.
یک آرایه از بایتها را با شروع از اندیس offو به اندازه lenدر فایل )write(byte[] b,int off,int len
مینویسد.
خواندن از فایل
در مثال زیر از کالس RandomAccessFileبرای خواندن از فایل استفاده میکنیم ،قبل از اجرای این مثال یک فایل به نام
Test.txtایجاد کرده و یک محتوای دلخواه در داخل آن نوشه و ذخیره کنید .سپس از کد زیر برای خواندن فایل استفاده نمایید
:
;package myfirstprogram
;*import java.io.
try
{
;)"randomaccessfile = new RandomAccessFile(myFile, "r
;String line
)while ((line = randomaccessfile.readLine()) != null
{
;)System.out.println(line
}
}
)catch (IOException e
{
;)(e.printStackTrace
}
}
}
در کد باال پارامتر دوم RandomAccessFileمشخص میکند که تنها قصد خواندن از فایل را داریم ،در ادامه در یک حلقه while
با استفاده از متد )( readLineیک خط از فایل میخوانیم و آن را چاپ میکنیم.زمانی که متد )( readLineمقدار nullبرگرداند
نوشتن در فایل
در مثال زیر از RandomAccessFileبرای نوشتن مقادیر مختلف در فایل استفاده میکنیم.
;package myfirstprogram
;*import java.io.
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 363
try
{
randomaccessfile = new RandomAccessFile(myFile, "rw");
randomaccessfile.writeUTF("A B C\n");
randomaccessfile.writeInt(20);
randomaccessfile.writeFloat(3.14f);
randomaccessfile.writeInt(80);
randomaccessfile.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
است و این بدان معنی است که قصد خواندن و نوشتن در فایل راrw برابر باRandomAccessFile در مثال باال پارامتر دوم
و سپسfloat و سپس یک مقدارint یک رشته در فایل مینویسیم بعد از آن یک مقدارwriteUTF() با استفاده از متد.داریم
باز کنیدnotepad اگر فایلی که در مثال قبلی ذخیره شد را در یک ادیتور متنی ساده مثل. دیگر در فایل مینویسیمint یک مقدار
برای اینکه از صحت کد قبل مطمئن شویم کد دیگری مینویسیم و مقادیر نوشته،مشاهده میکنید که محتوای آن خوانا نیست
package myfirstprogram;
import java.io.*;
try
{
randomaccessfile = new RandomAccessFile(myFile, "rw");
String s = randomaccessfile.readUTF();
System.out.println(s);
int a = randomaccessfile.readInt();
System.out.println(a);
float f = randomaccessfile.readFloat();
System.out.println(f);
361 کار با تاریخ ،فایل و رشته
;)(int b = randomaccessfile.readInt
;)System.out.println(b
;)(randomaccessfile.close
}
)catch (IOException e
{
;)(e.printStackTrace
}
}
}
کد باال مشابه کد قبلی است با این تفاوت که این بار به جای عمل نوشتن از عمل خواندن برای تست استفاده میکنیم.باید دقت
کنید که ترتیب خواندن باید مشابه ترتیب نوشتن باشد.اگر قصد استفاده از RandomAccessFileرا دارید برای ذخیره اعداد در
فایل از ادیتور های متنی مانند notepadاستفاده نکنید زیرا این مقادیر در حقیقت متنهای ASCIIهستند و نه اعداد واقعی
و اگر با RandomAccessFileخوانده شوند مقادیری بی معنی خواهند بود .راه حل صحیح نوشتن اعداد در فایل این است که از
کالس ByteArrayInputStream
کالس ByteArrayInputStreamبه ما اجازه میدهد تا با یک آرایه از بایتها که در RAMقرار دارد به عنوان یک جریان ورودی
عمل کنیم و بتوانیم از کالسهایی که زیر کالس InputStreamهستند در کنار آن بهره ببریم.این کالس بیشتر به عنوان یک واسط
در کنار کالسهای دیگر استفاده میشود.کاربرد اصلی این کالس در شبکه است ،بدین صورت که اطالعات به صورت آرایه ای از
بایتها از طریق شبکه دریافت میشوند و سپس با استفاده از ByteArrayInputStreamبه یک جریان ورودی تبدیل میشوند.
برای استفاده از این کالس باید از یکی از سازندههای زیر برای ساخت شیء جدید از آن استفاده کنیم:
کاربرد متد
جریان ورودی را بسته و منابع استفاده شده را آزاد میکند )( close
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 361
در صورتی که به انتهای جریان ورودی رسیده باشیم خروجی این متد مقدار 3-
خواهد بود.
بایتها را از جریان ورودی خوانده و در آرایه bذخیره میکند و تعداد read(byte[] b,int offset,int
)length
بایتهای خوانده شده را بر میگرداند ،در صورتی که بایتی برای خواندن
خواندن از یک آرایه
در مثال زیر با استفاده از متد )( readمحتوی یک آرایه را بایت به بایت خوانده و چاپ میکنیم.
;package myfirstprogram
;*import java.io.
;ByteArrayInputStream byteinputarraystream
try
{
;)byteinputarraystream = new ByteArrayInputStream(buffer
;int v
)while ((v = byteinputarraystream.read()) != -1
{
;)System.out.print((char)v
}
;)(byteinputarraystream.close
}
} { )catch (IOException e
}
361 کار با تاریخ ،فایل و رشته
}
در مثال فوق آرایه مورد نظر از قبل آماده است در کاربردهای پیشرفته ممکن است این آرایه در زمان اجرا تولید شود (مثال در
کنیم ،در داخل حلقه whileهر بار یک بایت از استریم ورودی میخوانیم در صورتی که مقدار خوانده شده ) (vبرابر با 3-نباشد
آن را به کاراکتر تبدیل و سپس چاپ میکنیم.خروجی کد باال عبارت ” “Helloخواهد بود.
در بسیاری از موارد قبل از استفاده از ByteArrayInputStreamنیاز پیدا میکنیم تا یک رشته متنی را به آرایه ای از بایتها
کالس ByteArrayOutputStream
کالس ByteArrayOutputStreamکالسی است که به ما اجازه میدهد یک استریم خروجی را به آرایه ای از بایتها تبدیل کنیم،
این کالس یک کالس واسط است و به عنوان یک ابزار کمکی در کنار کالسهای پیشرفته تر استفاده میشود ،بیشترین کاربرد این
کالس در شبکه است که به ما اجازه میدهد انواع مختلفی از OutputStreamها را به آرایه ای از بایت تبدیل و در شبکه ارسال
کنیم .برای استفاده از این کالس باید از یکی از سازندههای زیر برای ساخت شیء جدید از آن استفاده کنیم:
)( ByteArrayOutputStream
)ByteArrayOutputStream (int bufferSize
کاربرد متد
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 360
مهمترین متد این کالس است و در انتهای عملیات میتوانیم از آن برای toByteArray()
. خاص استریم را به رشته تبدیل میکندCharset بر اساس یک toString(String charsetName)
مثال
package myfirstprogram;
import java.io.*;
try
{
baytearrayoutputstream.write("Hello Java".getBytes());
baytearrayoutputstream.write(" IO".getBytes());
System.out.println(baytearrayoutputstream.toString());
byte[] result = baytearrayoutputstream.toByteArray();
baytearrayoutputstream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
366 کار با تاریخ ،فایل و رشته
در مثال باال ابتدا یک ByteArrayOutputStreamایجاد میکنیم .سپس چند بار از متد )( writeبرای نوشتن در آن استفاده
میکنیم ،از آنجایی که متد )( writeآرایه ای از بایتها را میپذیرد لذا باید رشتهها را با استفاده از متد )( getBytesبه آرایه
ای از بایتها تبدیل کنیم.با استفاده از متد )( toStringمحتوای کل استریم را به دست میآوریم و سپس آن را چاپ میکنیم و
در انتها کل استریم را به آرایه ای از بایتها ) (resultتبدیل میکنیم (که البته در این مثال از resultاستفاده خاصی نمیکنیم
در این آموزش با کالسهای ObjectInputStreamو ObjectOutputStreamبرای خواندن و نوشتن شیء از فایل آشنا میشویم،
از آنجایی که این دو کالس مکمل یکدیگر هستند با هر دوی آنها در یک آموزش آشنا میشویم .اگر از ObjectOutputStream
برای نوشتن شیء در فایل استفاده کنیم حتما باید از ObjectInputStreamبرای خواندن شیء از آن فایل استفاده کنیم و اگر
قصد استفاده از ObjectInputStreamرا داشته باشیم باید مطمئن شویم که فایل مورد نظر قبال با ObjectOutputStream
ایجاد شده است ،لذا آموزش این دو کالس در دو مبحث جدا ممکن نیست و در این آموزش با هر دو کالس آشنا میشویم.
مهمترین کاربرد این دو کالس ذخیره شی و خواندن شیء از فایل است با این حال این دو کالس متدهای کمکی دیگری نیز دارند
کالس ObjectOutputStream
از این کالس برای ذخیره سازی شی در فایل استفاده میشود .برای استفاده از این کالس باید از سازنده زیر برای ساخت شیء جدید
کاربرد متد
جریان خروجی را بسته و منابع استفاده شده را آزاد میکند )( close
یک قسمت از یک آرایه از بایتها را در جریان خروجی مینویسد. )write(byte[] b,int offset,int length
یک رشته را به آرایه ای از بایتها تبدیل کرده و در جریان خروجی )writeBytes(String str
مینویسد.
مهمترین متد این کالس است و یک شیء جاوایی را در جریان خروجی )writeObject(Object obj
مینویسد.
کالس ObjectInputStream
از این کالس برای خواندن یک شیء از یک جریان ورودی استفاده میشود .برای استفاده از این کالس باید از سازنده زیر برای
کاربرد متد
جریان ورودی را بسته و منابع استفاده شده را آزاد میکند )( close
به تعداد lengthبایت از جریان ورودی میخواند و با شروع از اندیس offsetدر ][read(byte
)b,offset,length
آرایه bمینویسد.
مهمترین متد این کالس است و یک شیء جاوایی را از جریان ورودی میخواند. )(readObjec
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 135
ابتدا یک کالس ساده به نام.در اولین مثال از این بخش یک شیء ساده جاوایی از یک کالس اختصاصی را در فایل مینویسیم
package myfirstprogram;
import java.io.*;
import java.io.Serializable;
@Override
public String toString()
{
return "[" + name + " : " + lastName + " , " + score + "]";
}
}
در کالس باال متد، باشندSerializable کالسهایی که قسمت داریم اشیایی از آن را در فایل ذخیره کنیم باید حتما از نوع
با استفاده از کد زیر یک شیء از این. کردیم تا در آینده چاپ هر شی از آن به سادگی صورت گیردoverride راtoString()
try
{
fileoutputstream = new FileOutputStream(myFile);
objectoutputstream = new ObjectOutputStream(fileoutputstream);
objectoutputstream.writeObject(person);
objectoutputstream.flush();
objectoutputstream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
چون قصد نوشتن اینشی در یک فایل را داریم،)person در کد باال ابتدا یک شیء نمونه از کالس مورد نظر ایجاد میکنیم (شی
ایجاد کنیم (شیFileOutputStream ) و سپس از روی آن یکmyFile ایجاد کرده (شیFile باید یک نمونه از کالس
در انتها نیز متدهای. شی مورد نظر را در فایل مینویسیمwriteObject ) و در نهایت با استفاده از متدobjectoutputstream
را پاکmain() برای اینکار کدهای داخل متد.اآلن آمادهایم تا شی ای که در مرحله قبل در فایل نوشته شده بود را از فایل بخوانیم
try
{
fileinputstream = new FileInputStream(myFile);
objectinputstream = new ObjectInputStream(fileinputstream);
Person objInFile = (Person)objectinputstream.readObject();
System.out.println(objInFile);
objectinputstream.close();
}
catch (IOException | ClassNotFoundException e)
{
e.printStackTrace();
}
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 133
از آنجایی که قصد خواندن از فایل را داریم باید ابتدا یک نمونه از کالس Fileایجاد کنیم ،سپس یک FileInputStreamاز
ایجاد میکنیم (شی ،)objectinputstreamدر نهایت با استفاده از متد )( readObjectیک شیء از جریان ورودی میخوانیم
ولی چون خروجی این متد از نوع کالس Objectاست باید آن را به کالس مورد نظر castکنیم .در انتها شی خوانده شده را
چاپ میکنیم و جریان ورودی را میبندیم .خروجی کد باال به صورت زیر خواهد بود:
با استفاده از متد )( writeOjbectمیتوانیم چندین شی در فایل بنویسیم ولی هنگام خواندن از فایل باید به همان ترتیبی که
اشیا را در فایل نوشتیم آنها را از فایل بخوانیم .برای درک بهتر یک کالس جدید به نام Bookبه صورت زیر ایجاد میکنیم:
;package myfirstprogram
;*import java.io.
;import java.io.Serializable
@Override
)(public String toString
{
;"]" return "[" + name + " : " + lastName + " , " + score +
}
}
this.pages = p;
}
@Override
public String toString()
{
return "( " + this.title + " , " + this.pages + " )";
}
}
: کد نوشتن در فایل را به صورت زیر تغییر میدهیم. است و به توضیح خاصی نیاز نداردPerson کالس فوق مشابه کالس
try
{
fileoutputstream = new FileOutputStream(myFile);
objectoutputstream = new ObjectOutputStream(fileoutputstream);
objectoutputstream.writeObject(firstperson);
objectoutputstream.writeObject(secondperson);
objectoutputstream.writeObject(book);
objectoutputstream.flush();
objectoutputstream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
کد خواندن. در فایل نوشتیمBook و یک شیء از کالسPerson مشابه کد قبلی است با این تفاوت که این بار دوشی از کالس
try
{
File myFile = new File("D:\\Test.obj");
fileinputstream = new FileInputStream(myFile);
objectinputstream = new ObjectInputStream(fileinputstream);
;)System.out.println(firstperson
;)System.out.println(secondperson
;)System.out.println(book
;)(objectinputstream.close
}
)catch (IOException | ClassNotFoundException e
{
;)(e.printStackTrace
}
این کد نیز بسیار مشابه کد خواندن شیء از فایل قبلی است ،تنها نکته مهم این است که اشیا به همان ترتیبی که در فایل نوشته
شدهاند باید از فایل خوانده شوند .خروجی کد باال به صورت زیر خواهد بود:
کالس BufferedReader
همانطور که می دانیم کالسهای Readerبرای خواندن از جریان کاراکتری به کار میروند ،از آنجایی که خواندن کاراکتر به کاراکتر
چندان بهینه نیست باید از تکنیک بافر کردن برای بهینه سازی و افزایش سرعت عمل خواندن استفاده کنیم ،کالس
BufferedReaderبا استفاده از تکنیک بافر کردن عمل خواندن را بهبود میبخشد .از این کالس میتوان برای خواندن از فایل،
خواندن از وروردی سیستم (کنس ول) و یا خواندن از یک حافظه بافر نیز استفاده کرد .برای استفاده از این کالس باید از یکی از
کاربرد متد
131 کار با تاریخ ،فایل و رشته
جریان ورودی را بسته و منابع استفاده شده را آزاد میکند )( close
یک کاراکتر از جریان ورودی خوانده و آن را به صورت یک بر میگرداند ،در صورتی )(read
که به انتهای جریان ورودی رسیده باشیم خروجی این متد مقدار 3-خواهد بود.
کاراکترها را از جریان ورودی خوانده و در آرایه cbufذخیره میکند و تعداد ][ read(char
)cbuf,offset,length
کاراکترهای خوانده شده را بر میگرداند ،در صورتی که کاراکتری برای خواندن وجود
مشخص میکند که قادر به خواندن از جریان ورودی هستیم یا خیر ،خروجی این )( boolean ready
در مثال زیر با استفاده از متد )( readمحتوی یک فایل متنی را کاراکتر به کاراکتر خوانده و چاپ میکنیم ،قبل از ادامه یک فایل
متنی با نام Test.txtدر درایو Dایجاد کرده و یک متن دلخواه در داخل آن نوشته و از کدهای زیر برای خواندن آن استفاده
کنید:
;package myfirstprogram
;*import java.io.
try
{
;)fileinputstream = new FileInputStream(myFile
;)inputstreamreader = new InputStreamReader(fileinputstream
;)bufferreader = new BufferedReader(inputstreamreader
;int c
)while ((c = bufferreader.read()) != -1
{
;)System.out.print((char)c
}
}
)catch (IOException e
{
;)(e.printStackTrace
}
}
}
همانطور که در کد باال مشاهده میکنید ابتدا باید فایلی که قصد خواندن از آن داریم را با یک شیء از کالس Fileمشخص کنیم
(شی myFileدر مثال باال) سپس با استفاده از FileInputStreamفایل مورد نظر را به یک جریان بایتی تبدیل کنیم (شی
inputstreamreaderدر مثال باال) و سپس جریان بایتی را با استفاده از InputStreamReaderبه جریان متنی تبدیل میکنیم
(شی inputstreamreaderدر مثال باال) ،برای بهینه سازی و افزایش سرعت خواندن یک BufferedReaderاز روی
inputstreamreaderایجاد میکنیم .در ادامه با استفاده از متد )( readکاراکتر به کاراکتر از bufferreaderمیخوانیم و تا
زمانی که نتیجه فراخوانی این متد 3-نباشد آن را در خروجی چاپ میکنیم .از آنجایی که ممکن است فایل وجود نداشته باشد یا
در هنگام عملیات خواندن با خطای پیش بینی نشده مواجه شویم باید حتما از بلوک try-catchبرای به دام انداختن خطاها
همانطور که در ابتدا دیدیم متد )( readدیگری نیز وجود دارد که از یک آرایه بافر برای خواندن از جریان ورودی استفاده میکند،
در بسیاری از کاربردها خواندن کاراکتر به کاراکتر زمان بر بوده و بهتر است با استفاده از یک آرایه بافر عملیات خواندن را تسریع
package myfirstprogram;
import java.io.*;
try
{
fileinputstream = new FileInputStream(myFile);
inputstreamreader = new InputStreamReader(fileinputstream);
bufferreader = new BufferedReader(inputstreamreader);
readed = bufferreader.read(cbuf, 0, cbuf.length);
. تعداد کاراکترهای خوانده شده از فایل را مشخص میکندreaded متغیر.خروجی کد باال مشابه مثال قبلی است
. برای خواندن خط به خط استفاده کنیمreadLine() کد زیر مشابه کدهای قبلی است با این تفاوت که این بار از متد
package myfirstprogram;
import java.io.*;
try
{
;)fileinputstream = new FileInputStream(myFile
;)inputstreamreader = new InputStreamReader(fileinputstream
;)bufferreader = new BufferedReader(inputstreamreader
;String line
)while ((line = bufferreader.readLine()) != null
;)System.out.println(line
}
)catch (IOException e
{
;)(e.printStackTrace
}
}
}
در کد باال در داخل یک حلقه whileتا زمانی که خروجی متد )( readLineبرابر با nullنباشد آن را چاپ میکنیم .مهمترین
دلیل استفاده از BufferedReaderاین است که دادههای ورودی را در حافظه بافر میکند و سرعت خواندن را به شدت افزایش
میدهد.
کالس BufferedWriter
همانطور که می دانیم کالسهای Writerبرای نوشتن استریم های متنی به کار میروند ،با استفاده از کالس BufferedWriter
میتوانیم عمل نوشتن را با تکنیک بافر کردن سریعتر سازیم ،این کالس ابتدا دادهها را در یک بافر در حافظه اصلی نگه داری میکند
و پس از هر بار پر شدن بافر آنها را به صورت گروهی و یک جا در جریان خروجی مینویسد که این عمل سرعت نوشتن در جریان
خروجی را به شدت افزایش میدهد .برای استفاده از این کالس باید از یکی از سازندههای زیر برای ساخت شیء جدید از آن
کاربرد متد
133 فایل و رشته،کار با تاریخ
مشابه متد قبلی است با این تفاوت که به جای آرایه ای از کاراکترها از یک write(String str,offset,length)
. استفاده میکندString
نوشتن در فایل
package myfirstprogram;
import java.io.*;
bufferedwriter.write("Hello BufferedWriter");
bufferedwriter.newLine();
bufferedwriter.write("Second Line");
bufferedwriter.newLine();
bufferedwriter.write("Third Line");
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 135
;)(bufferedwriter.flush
;)(bufferedwriter.close
}
)catch (IOException e
{
;)(e.printStackTrace
}
}
}
در مثال باال ابتدا یک شیء از کالس Fileایجاد میکنیم و سپس با استفاده از FileOutputStreamیک جریان خروجی
میکنیم تا بتوانیم به صورت کاراکتری بر روی جریان خروجی بنویسیم (شی ،)outputstreamwriterدر نهایت از روی
outputstreamwriterیک BufferedWriterایجاد میکنیم تا مطمئن شویم عمل نوشتن با سرعت زیادی انجام میشود ،در
مهمترین دلیل استفاده از BufferedWriterاین است که قبل از نوشتن اطالعات بر روی جریان خروجی آنها را در حافظه اصلی
) (RAMبافر میکند و دادهها را به صورت گروهی در جریان خروجی مینویسد که این عمل سرعتن نوشتن را به شدت افزایش
میدهد .
کالس StringReader
می دانیم که کالسهای Readerبرای خواندن کاراکتر از استریم های کاراکتری به کار میروند ولی همیشه منبع استریم فایل،
منبعی در شبکه یا کنسول سیستم نیست گاهی نیاز داریم تا از یک رشته متنی از نوع Stringبه عنوان یک استریم استفاده کنیم،
در چنین شرایطی میتوانیم از کالس StringReaderاستفاده کنیم .برای استفاده از این کالس باید از سازنده زیر برای ساخت
کاربرد متد
131 کار با تاریخ ،فایل و رشته
جریان ورودی را بسته و منابع استفاده شده را آزاد میکند )( close
کاراکترها را از جریان ورودی خوانده و در آرایه cbufذخیره میکند و read(char [] cbuf,int offset,int
)length
تعداد کاراکترهای خوانده شده را بر میگرداند ،در صورتی که کاراکتری
برای خواندن وجود نداشته باشد خروجی این متد مقدار 3-خواهد بود.
مشخص میکند که قادر به خواندن از جریان ورودی هستیم یا خیر، )( ready
در مثال زیر با استفاده از متد )( readمحتوی یک رشته متنی را کاراکتر به کاراکتر خوانده و چاپ میکنیم .
;package myfirstprogram
;*import java.io.
;int c
try
{
)while ((c = sr.read()) != -1
{
;)System.out.print((char)c
}
}
)catch (IOException e
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 133
{
;)(e.printStackTrace
}
}
}
ابتدا از روی رشته متنی dataیک StringReaderجدید ایجاد میکنیم ،سپس در داخل یک حلقه whileبا استفاده از متد
)( readیک کاراکتر خوانده و آن را در متغیر cذخیره میکنیم ،اگر مقدار این متغیر برابر با -3نباشد آن را در خروجی چاپ
میکنیم.
کالس StringWriter
کالس StringWriterیک استریم در حافظه اصلی ) (RAMدر اختیار ما قرار میدهد که میتوانیم بر روی آن بنویسیم و در نهایت
استریم مورد نظر را به رشته متنی تبدیل کنیم ،معموال زمانی از این کالس استفاده میشود که ما از تعداد عملیات نوشتن در زمان
کامپایل آگاه نیستیم .این کالس معموال به عنوان یک ابزار کمکی در کنار کالسهای دیگر استفاده میشود .برای استفاده از این
کالس باید از سازنده زیر برای ساخت شیء جدید از آن استفاده کنیم :
)( StringWriter
کاربرد متد
جریان خروجی را بسته و منابع استفاده شده را آزاد میکند )( close
میکند.
قسمتی از آرایه cbufرا با شروع از اندیس offsetبه )write(char[] cbuf,int offset,int length
مشابه متد قبلی است با این تفاوت که به جای آرایه ای از write(String str,int offset,int length)
مهمترین متد این کالس است و معموال در پایان کار استفاده toString()
.میکند
این است که چندین رشته متنی مختلف را در آن بنویسیم و در نهایت یک رشته متنی واحدStringWriter متداولترین کاربرد
: مثال زیر به شرح این موضوع میپردازد،از روی آنها ایجاد کنیم
package myfirstprogram;
import java.io.*;
stringwriter.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Hello
Java
IO
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 131
را به یک رشتهstringwriter در نهایت، ایجاد میکنیم و چند خط در آن مینویسیمStringWriter در کد باال ابتدا یک
استفادهReader قبال دیدیم که برای خواندن استریم متنی از فایل باید از کالسهای.( تبدیل و چاپ میکنیمresult) متنی
محتوای یک فایل متنی را میخوانیمStringWriter و به کمکFileInputStream کنیم ولی در مثال زیر تنها با استفاده از کالس
. و چاپ میکنیم
package myfirstprogram;
import java.io.*;
try
{
fileinputstream = new FileInputStream(myFile);
int c;
while ((c = fileinputstream.read()) != -1)
{
stringwriter.write(c);
}
fileinputstream.close();
System.out.println(stringwriter.toString());
stringwriter.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
FileInputStream برای خواندن هر نوع جریانی از این فایل به یک، ایجاد میکنیمFile در کد باال ابتدا یک شیء از کالس
fileinputstream کاراکتر به کاراکتر ازwhile در ادامه در داخل یک حلقه،)fileinputstream نیاز خواهیم داشت (شی
در نهایت با، مینویسیمstringwriter آن را درwrite نبود با استفاده از متد-3 میخوانیم و اگر مقدار خوانده شده برابر با
. را به رشته متنی تبدیل میکنیم و سپس آن را چاپ میکنیمstringwriter محتوایtoString() فراخوانی متد
131 کار با تاریخ ،فایل و رشته
کالس PrintWriter
کالس PrintWriterکالسی کمکی است که امکانات زیادی را در اختیار ما قرار میدهد و به ما اجازه میدهد به صورت مستقیم
بر روی فایل یا خروجی کنسول سیستم یا هر جریان خروجی دیگری کار کنیم ،به عالوه این کالس از کالسهای بهینه سازی شده
است و سرعت فوق العاده ای دارد .برای استفاده از این کالس باید از یکی از سازندههای زیر برای ساخت شیء جدید از آن استفاده
کنیم :
)PrintWriter(OutputStream out
)PrintWriter(String fileName
)PrintWriter(Writer out
کاربرد متد
جریان خروجی را بسته و منابع استفاده شده را آزاد میکند )( close
میکند.
.قسمتی از یک رشته متنی را در جریان خروجی مینویسد write(String s,int offset,int length)
خروجی شبکه، این قالب بندی میتواند بر روی فایل خروجی، میتوان برای قالب بندی خروجی استفاده کردPrintWriter از
. برای قالب بندی را نشان میدهدprintf() مثال زیر نحوه استفاده از متد،یا حتی خروجی کنسول سیستم باشد
package myfirstprogram;
import java.io.*;
Hello 7
Hello 77
Hello 777
Hello 7777
Hello 77777
n مشخص میکند که میخواهیم به اندازه%nd ، مشخص میکنیم که قصد داریم یک عدد صحیح را چاپ کنیم%d با استفاده از
. اعداد دیگری را نیز امتحان کنید1 در مثال باال به جای مقدار.کاراکتر فاصله ایجاد کنیم
package myfirstprogram;
import java.io.*;
Hello 5.879
در مثال باال %fمشخص میکند که قصد چاپ کردن یک مقدار ممیز شناور را داریم %.3f ،مشخص میکند که قصد داریم تا سه
رقم بعد از اعشار را چاپ کنیم ،دقت کنید که ارقام گرد میشوند .در مثال زیر از PrintWriterبرای نوشتن در فایل استفاده
میکنیم .
;package myfirstprogram
;*import java.io.
;)"printwriter.println("Hello
;)"printwriter.println("Java
;)"printwriter.println("IO
;)(printwriter.flush
;)(printwriter.close
}
)catch (IOException e
{
;)(e.printStackTrace
}
}
}
در مثال باال چون قصد نوشتن در یک فایل را داریم ابتدا یک شیء از کالس Fileایجاد میکنیم ،سپس از روی آن یک
PrintWriterایجاد میکنیم و در پارامتر دوم مشخص میکنیم که قصد داریم با فرمت UTF-8در فایل بنویسیم ،در ادامه با
به طور گسترده به عنوان یک دیتابیس جای گزین و برای ذخیره اطالعات مربوط به پیکربندی نرم افزارها به کار میرود XML .از لحاظ
153 کار با تاریخ ،فایل و رشته
دستوری شبیه به HTMLبوده و اگر با HTMLآشنایی داشته باشید یادگیری این زبان برایتان راحت تر است .در زیر یک سند XML
><Persons
><Person
><Name>John Smith</Name
><Age>30</Age
><Gender>Male</Gender
></Person
><Person
><Name>Mike Folly</Name
><Age>25</Age
><Gender>Male</Gender
></Person
><Person
><Name>Lisa Carter</Name
><Age>22</Age
><Gender>Female</Gender
></Person
></Persons
سند XMLترکیبی از عناصر XMLمیباشد .یک عنصر XMLشامل یک تگ آغازی ،یک تگ پایانی و داده ای است که در بین این
><open>data</close
میتوان بر اساس داده ای که یک عنصر XMLدر خود نگهداری میکند یک نام برای عنصر انتخاب کرد .به این نکته توجه کنید که
عناصر به حروف بزرگ و کوچک حساساند ،بنابراین دو کلمه personو Personبا هم متفاوتاند XML .فضاهای خالی را نادیده
میگیرد ،بنابراین به جای نوشتن یک فایل در یک خط میتوانید آن را در چند خط بنویسید تا خوانایی آن باالتر رود .بین عناصر
><parent
><child1>data</child1
><child2
><grandchild1>data</grandchild1
></child2
></parent
سند XMLباال دارای اطالعاتی برای سه شخص میباشد .هر سند XMLباید دارای یک عنصر ریشه ) (rootباشد .در مثال اول
این درس ،عنصر ،Personsعنصر ریشه (پدر) و دیگر عناصر داخل آن در حکم فرزندان آن میباشند .جزییات هر شخص در داخل
عنصر Personقرار دارند .عناصر فرزند عنصر Personعبارتاند از Age ،Nameو .Genderصفات ،XMLروشی دیگر برای اضافه
عنصر باال یک خاصیت به نام nameدارد که مقدار آن John Smithمیباشد .مقادیر باید در داخل کوتیشن (‘ ‘) یا دابل کوتیشن
(“ “) قرار بگیرند .در زیر روش اضافه کردن صفات نشان داده شده است.
><Persons
>"<Person name="John Smith
><Age>30</Age
><Gender>Male</Gender
></Person
>"<Person name="Mike Folly
><Age>25</Age
><Gender>Male</Gender
></Person
>"<Person name="Lisa Carter
><Age>22</Age
><Gender>Female</Gender
></Person
></Persons
عنصر Nameهر شخص ) (personرا حذف و صفت معادل آن ) (nameرا برای هر عنصر مینویسیم .اسناد XMLمیتوانند
دارای یک تعریف XMLباشند .تعریف XMLشامل اطالعاتی درباره سند XMLمانند نسخه (همیشه نسخه 3.3پیشنهاد میشود) و
این تعریف در باالترین بخش سند و درست قبل از عنصر اصلی نوشته میشود .برای فایل XMLمیتوان توضیحات نیز نوشت.
برای خواندن و نوشتن فایلهای XMLدر جاوا روشها و کتابخانههای تو کار و خارجی زیادی وجود دارند که با استفاده از آنها
میتوانیم فایلهای XMLرا بخوانیم ،ایجاد کنیم و یا تحت پرس و جو قرار دهیم ،به صورت کلی روشهای تجزیه فایلهای XML
قبل از اینکه با این دو روش آشنا شویم باید با مفهوم تجزیه ) (parsingآشنا شویم.
تجزیه ) (ParsingفایلهایXML
به روشی گفته میشود که در طی آن در داخل یک فایل یا استریم مبتنی بر XMLحرکت میکنیم و به المانها ،ویژگیها و صفتهای
عناصر xmlدسترسی پیدا میکنیم و میتوانیم با آنها به صورت اشیای قابل استفاده در جاوا رفتار کنیم.
تجزیه گر)(Parser
تجزیه گر ) (Parserابزاری است که عمل تجزیه را انجام میدهد ،این ابزار میتواند بر اساس الگوریتمهای استریمی یا الگوریتمهای
مبتنی بر درخت تجزیه پیاده سازی شود ،از تجزیه گرهای مبتنی بر درخت تجزیه میتوان به DOM Parserو از تجزیه گرهای مبتنی
بر استریم میتوان به SAX Parserاشاره کرد.کتابخانههای دیگری همچون StAX ،JDOMو DOM4Jنیز تجزیه گرهای دیگری
هستند که میتوان از آنها نام برد .دو راهکار اصلی تجزیه و تحلیل فایلهای xmlدر جاوا عبارتاند از:
در این روش درخت تجزیه بر اساس Document Object Modelیا انحصارا DOMکه از پیشنهادات W3Cاست ساخته میشود،
درخت تجزیه ساختمان داده ای پیچیده ای است که عناصر فایل xmlرا به صورت درختی مبتنی بر DOMنگه داری میکند.
در این روش یک بار کل محتوای XMLخوانده میشود و سپس Parserآن را به یک درخت (درخت تجزیه) تبدیل میکند ،بعد
از آن میتوانیم با دسترسی به گرههای این درخت فایل XMLمورد نظر را بخوانیم ،در هنگام استفاده از این روش باید به نکات زیر
دقت کنیم:
در این روش یک بار محتوای فایل XMLبه صورت کامل خوانده میشود لذا تنها برای مواردی قابل استفاده است که
محتوای XMLرا به صورت کامل در اختیار داریم (مثال فایل) و برای مواردی که داده به مرور زمان قابل تغییر باشد قابل
در این روش کل فایل یک بار از ابتدا تا انتها خوانده میشود لذا برای مواردی که حجم فایل بزرگ باشد مفید نیست.
در این روش یک درخت تجزیه ساخته شده و این درخت در حافظه اصلی ) (RAMقرار میگیرد که حجم آن ممکن است
زیاد باشد لذا ممکن است مصرف حافظه زیادی داشته باشد.
پس از ساخت درخت تجزیه به دلیل استفاده از ساختار درختی دسترسی به عناصر XMLبا سرعت باالیی صورت میگیرد.
این راهکار یک راهکار استریمی است و معموال سریعتر از راهکار قبلی است ،در این روش درخت تجزیه ساخته نمیشود و در نتیجه
مصرف حافظه کمتری دارد ،این روش برای مواردی که استریم به مرور زمان بزرگتر میشود قابل استفاده است در هنگام استفاده
این روش هم با فایل و هم استریم های قابل تغییر سازگار است.
برای مواردی که حجم فایل بزرگ باشد قابل استفاده است.
در این روش دستری به صورت باال به پایین است و از حالت Random Accessپشتیبانی نمیکند و اگر قصد داشته
باشیم چندین بار به گرههایی خاص دسترسی داشته باشیم مفید نیست.
نکته :به صورت کلی SAX Parserاز DOM Parserسریعتر است و تنها در مواردی که دسترسی محلی زیادی داشته باشیم از
در این آموزش با خواندن فایلهای XMLبا روش مبتنی بر DOMآشنا میشویم .قبل از هر کار یک فایل xmlجدید به نام
این فایل یک فایل xmlساده است که تگ ریشه آن Personsاست .در داخل این تگ یک تگ Personو در داخل این تک
نیز دو تگ Ageو Genderقرار دارند .با استفاده از کد زیر محتوای این فایل را میخوانیم و خروجی مناسب را برای آن ایجاد
میکنیم :
3 import java.io.*;
4 import org.w3c.dom.*;
5 import javax.xml.parsers.*;
6
7 public class MyFirstProgram
8 {
9 static void printNode(Node n)
10 {
11 System.out.println("-----------------------");
12 Element e = (Element)n;
13
14 // Name
15 System.out.println(n.getNodeName() + " Name = " + e.getAttribute("name"));
16 // Age
17 String Age = e.getElementsByTagName("Age").item(0).getTextContent();
18 System.out.println(n.getNodeName() + " Age: " + Age);
19 // Gender
20 String Gender = e.getElementsByTagName("Gender").item(0).getTextContent();
21 System.out.println(n.getNodeName() + " Gender: " + Gender);
22 }
23 public static void main(String[] args) throws Exception
24 {
25 File myXMLFile = new File("D:\\sample.xml");
26 DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
27
28 DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
29
30 Document doc = dBuilder.parse(myXMLFile);
31
32 String rootName = doc.getDocumentElement().getNodeName();
33
34 System.out.println(rootName);
35
36 NodeList list = doc.getElementsByTagName("Person");
37 int listSize = list.getLength();
38 System.out.println(listSize);
39
40 for (int i = 0;i < listSize; i++)
41 {
42 Node nodeI = list.item(i);
43 printNode(nodeI);
44 }
45 }
46 }
Persons
5
-----------------------
Person name: John Smith
Person Age: 30
Person Gender: Male
-----------------------
Person name: Mike Folley
Person Age: 25
Person Gender: Male
-----------------------
Person name: Lisa Carter
Person Age: 22
Person Gender: Female
-----------------------
Person name: Jerry Frost
Person Age: 27
Person Gender: Male
151 کار با تاریخ ،فایل و رشته
-----------------------
Person name: Adam Wong
Person Age: 35
Person Gender: Male
در ادامه با بخش بخش کد باال آشنا میشویم .قبل از هر کار باید ابزارهای مورد نیاز برای کار با ،xmlتجزیه گر مبتنی بر domو
کتابخانه ioرا importکنیم(خطوط .)1-1در داخل تابع mainکه نقطه شروع برنامه است یک شیء از کالس فایل ایجاد میکنیم
و به فایلی که قصد خواندن از آن را داریم اشاره میکنیم(خط .)51در خطوط 51-13یک Documentایجاد میکنیم که همان درخت
تجزیه مورد نظر ماست .دقت کنید که شی myXMLFileپارامتر ورودی متد )( parseاست .در خط 15گره ریشه ) (rootرا به
دست میآوریم .متد )( getDocumentElementبه گره Personدسترسی پیدا میکند ،با استفاده از متد )( getNodeNameنام
آن (یعنی عبارت ” )“Personاستخراج میشود .سپس در خط 11لیست تمام گرههایی که از نوع Personهستند را به دست
میآوریم.
متد )( getElementsByTagNameلیستی از تمام تگها را بر اساس نامی که به آن ارسال میکنیم ب صورت یک لیست به ما
میدهد .کالس NodeListیک لیست برای نگه داری Nodeهاست .با استفاده از متد )( getLengthمیتوانیم اندازه این لیست
را به دست بیاوریم ،خطوط 11-10تعداد تگهای Personرا چاپ میکند .با استفاده از یک حلقه forمیتوانیم به آیتمهای
داخل listدسترسی پیدا میکنیم و آن را در یک شیء از کالس Nodeنگه داری کنیم(خطوط .)33-33خط 35هر آیتم از list
را در یک شیء از نوع Nodeریخته و سپس در خط 31متد )( printNodeرا بر روی آن فراخوانی میکنیم .متد )(printNode
متدی است که خودمان آن را نوشتهایم( ،)6-55در داخل این متد ابتد یک خط به عنوان جدا کننده چاپ میکنیم و سپسشی از
نوع Nodeرا به شی ای از نوع Elementتبدیل میکنیم(خطوط .)33-35می دانیم که تگ Personدر فایل مورد نظر دارای صفتی
به نام nameاست ،با استفاده از متد )( getAttributeمیتوانیم به این صفت دسترسی داشته باشیم .خط 31نام Element
و مقدار nameآن را چاپ میکند .با استفاده از متد )( getElementsByTagNameمیتوانیم تمام تگهای داخلی را بر اساس
نامشان لیست کنیم .با استفاده از متد )( itemمیتوانیم مشخص کنیم که قصد داریم به کدام مورد دسترسی پیدا کنیم (اندیس
صفر اولین گره ،اندیس یک دومین گره و …) .پس از دسترسی به یک گره با استفاده از متد )( getTextContentمیتوانیم
جدید به نامxml قبل از هر کار یک فایل. آشنا میشویمSAX با روش مبتنی برXML در این آموزش با خواندن فایلهای
و در داخل این تکPerson در داخل این تگ یک تگ. استPersons ساده است که تگ ریشه آنxml این فایل یک فایل
اگرچه سریعتر است ولی برای خواندن درست نیاز داریم که یکSAX روش مبتنی بر. قرار دارندGender وAge نیز دو تگ
ایجاد میکنیم و کد زیر را درMyHandler برای این کار یک کالس جدید به نام، برای تعبیر تگها و المانها ایجاد کنیمHandler
1 package myfirstprogram;
2
3 import org.xml.sax.Attributes;
4 import org.xml.sax.SAXException;
5 import org.xml.sax.helpers.DefaultHandler;
6
7 import java.io.File;
8 import javax.xml.parsers.SAXParser;
9 import javax.xml.parsers.SAXParserFactory;
10
11 class MyHandler extends DefaultHandler
12 {
13 boolean Age = false;
14 boolean Gender = false;
15
16 @Override
17 public void startElement(String uri, String localName, String qName, Attributes attr)
156 فایل و رشته،کار با تاریخ
18 throws SAXException
19 {
20 if (qName.equalsIgnoreCase("Person"))
21 {
22 System.out.println("Person Name: " + attr.getValue("name"));
23 }
24 else if (qName.equalsIgnoreCase("Age"))
25 {
26 Age = true;
27 }
28 else if (qName.equalsIgnoreCase("Gender"))
29 {
30 Gender = true;
31 }
32 }
33
34 @Override
35 public void characters(char[] ch, int start, int length) throws SAXException
36 {
37 if (Age)
38 {
39 System.out.println("Person Age: " + new String(ch, start, length));
40 }
41 else if (Gender)
42 {
43 System.out.println("Person Gender: " + new String(ch, start, length));
44 System.out.println("----------------");
45 }
46
47 Age = false;
48 Gender = false;
49 }
50 }
51
52 public class MyFirstProgram
53 {
54 public static void main(String[] args) throws Exception
55 {
56 File myXMLFile = new File("D:/sample.xml");
57
58 SAXParserFactory sFactory = SAXParserFactory.newInstance();
59
60 SAXParser saxParser = sFactory.newSAXParser();
61
62 MyHandler mHandler = new MyHandler();
63
64 saxParser.parse(myXMLFile, mHandler);
65 }
66 }
کالس MyHandlerزیر کالس DefaultHanderاست و برای کار بار آن باید حداقل دو متد )( startElementو
)( charactersرا overrideکنیم .در هنگام تجزیه استریمی از این هندلر استفاده شده و در هر زمان که عمل تجزیه به یک تگ
آغازین میرسد متد )( startElementفراخوانی میشود و ه ر گاه که تجزیه گر وارد قسمتهای متنی داخل یک تگ (مثال Male
در تگ )Genderمیشود متد )( charactersفراخوانی میشود .پس با توجه به موارد فوق متدهای )( startElementو
)( charactersرا به صورتی که در کد باال مشاهده میکنید ،پیاده سازی میکنیم(خطوط .)31-36
در داخل متد )( startElementبا استفاده از پارامتر qNameمیتوانیم نام گره را مشخص کنیم ،اگر نام گره personبود مقدار
صفت idرا چاپ میکنیم ،پارامتر attrدر هر گره صفتهای گره را نگه داری میکند که با فراخوانی متد )( getValueبر روی
آن میتوانیم به یک صفت خاص دسترسی پیدا کنیم ،در خط زیر به صفت idدسترسی پیدا میکنیم و مقدار آن را چاپ میکنیم.
اگر تگی که وارد آن میشویم Personنباشد یکی از دو ifبعدی ممکن است اجرا شوند:
اگر نام تگ Ageباشد مقدار بولی Ageرا برابر trueقرار میدهیم.
اگر نام تگ Genderباشد مقدار بولی Genderرا برابر trueقرار میدهیم.
می دانیم که متد )( characterبعد از متد )( startElementفراخوانی میشود ،زیرا ابتدا یک تگ باز میشود ،متن در داخل
آن قرار میگیرد و سپس تگ بسته میشود مثل > .<Gender>Male</Genderپس هنگامی که وارد متد )( characterمیشویم.
تنها یکی از موارد Ageیا Genderمیتواند برابر با trueباشد .با استفاده از ساختار شرطی خطوط 11-31مورد برابر با true
نکته :در این پارامتر رشته مورد نظر به صورت یک آرایه از کاراکترها قرار دارد برای چاپ متن باید یک شیء جدید از String
ایجاد کنیم و آرایه مورد نظر را به همراه پارامترهای startو lengthبه آن ارسال کنیم .
113 فایل و رشته،کار با تاریخ
می دانیم که با رسیدن به تگ آغازین بعدی.)30 و31 قرار میدهیم (خطوطfalse در پایان تمام متغیرهای بولی را برابر با
مان آماده است میتوانیمHandler حال که. فراخوانی میشود و مجددا موارد فوق تکرار میشودstartElement() مجددا متد
ایجاد میکنیم و فایل وSAXParser یک، در این خطوط.)11-13 را بنویسیم (خطوطxml کد الزم برای خواندن و تجزیه فایل
دشوارHandler دارای ساختار پیچده ای باشد و تگهای تو در توی زیادی داشته باشیم نوشتنxml در صورتی که فایل: نکته
. بهینه تر و کم خطا تر استDom Parser در چنین موارد استفاده از،میشود و احتمال خطا افزایش مییابد
ساده ای به صورت زیر را با کدxml در این آموزش قصد داریم فایل. آشنا میشویمDOM مبتنی برXML در این آموزش با ساخت
: ایجاد کنیمsample.xml با استفاده از کد زیر میتوانیم این ساختار را در فایلی به نام
1 package myfirstprogram;
2
3 import java.io.File;
4 import javax.xml.parsers.*;
5 import javax.xml.transform.*;
6 import javax.xml.transform.dom.DOMSource;
7 import javax.xml.transform.stream.StreamResult;
8 import org.w3c.dom.*;
9
10 public class MyFirstProgram
11 {
12 public static void main(String[] args)
13 throws TransformerException, ParserConfigurationException
14 {
15 File myFile = new File("D:\\sample.xml");
16
17 DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
18 DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
19
20 Document doc = dBuilder.newDocument();
21
22 //Persons Root
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 115
31 سپس در خط.)1-0 میکنیم(خطوطimport ابتدا ابزارهای مورد نیاز را.در ادامه با بخشهای مختلف کد باال آشنا میشویم
با استفاده از متد. خالی ایجاد میکنیمDocument یک31 در خط.فایلی که قصد نوشتن در آن را داریم مشخص میکنیم
ایجادPerson در ادامه گره دیگری به نام.)51-53 خالی است المان جدید همان گره ریشه خواهد بود(خطوطdoc چون،میکنیم
Persons را بر روی شیappendChild() باشد لذا این بار متدPersons گره، باید زیر گرهPerson می دانیم که گره،میکنیم
همانطور که مشاهده میکنید. میرسدGender وAge یعنیPerson حال نوبت به ایجاد زیر گرههای.)51 فراخوانی میکنیم(خط
یک مقدار متنی بین این دو تگ ایجادcreateTextNode() ابتدا با استفاده از متد. شبیه هم هستند33-31 و11-10 خطوط
اگر. آنها را به صورت زیر گره این گره در میآوریم،Person را بر روی شیappendChild() میکنیم و سپس با فراخوانی متد
تنها کاری که. به صورت ابتدای درس ایجاد شده استXML بروید مشاده میکنید که یک فایلD برنامه را اجرا کرده و به درایو
یکdoc از روی، استفاده میکنیمTransformer برای این کار از کالس.باقی مانده است ذخیره ساختار فوق در یک فایل است
111 کار با تاریخ ،فایل و رشته
شیء از کالس DOMSourceایجاد میکنیم و از روی فایلی که قصد نوشتن در آن را داریم نیز شی ای از کالس StreamReslut
ایجاد میکنیم.
اشیای sourceو resultرا به متد transformارسال میکنیم و کار تمام میشود .حال اگر مثال زیر گره Ageدارای خاصیتی
به نام ageو مقدار Youngباشد ،کدهای 11-10را پاک کرده و کدهای زیر را جایگزین نمایید :
همانطور که در کد باال مشاهده میکنید ،با استفاده از متد )( createAttributeخاصیت را ایجاد کرده ،با استفاده از متد
)( setValueیک مقدار به آن اختصاص داده و در نهایت با استفاده از متد )( setAttributeNodeآن را به گره مورد نظر
در این آموزش با ساخت XMLمبتنی بر استریم آشنا میشویم .این روش نسبت به روش مبتنی بر DOMسریع تر و ساده تر است،
به عالوه نوشتن تگها و بستن آنها در کد جاوایی با ساختار xmlمطابقت بیشتر ی دارد .در این آموزش قصد داریم فایل xml
با استفاده از کد زیر میتوانیم این ساختار را در فایلی به نام sample.xmlایجاد کنیم:
5
6 public class MyFirstProgram
7 {
8 public static void main(String[] args) throws Exception
9 {
10 File myFile = new File("D:\\sample.xml");
11 try (FileOutputStream fos = new FileOutputStream(myFile))
12 {
13 XMLOutputFactory xmlOFactory = XMLOutputFactory.newInstance();
14 XMLStreamWriter xmlSWriter = xmlOFactory.createXMLStreamWriter(fos, "UTF-8");
15
16 xmlSWriter.writeStartDocument("UTF-8", "1.0");
17
18 xmlSWriter.writeStartElement("Persons");
19 xmlSWriter.writeStartElement("Person");
20 xmlSWriter.writeAttribute("name", "John Smith");
21
22 xmlSWriter.writeStartElement("Age");
23 xmlSWriter.writeCharacters("30");
24 xmlSWriter.writeEndElement();
25
26 xmlSWriter.writeStartElement("Gender");
27 xmlSWriter.writeCharacters("Male");
28 xmlSWriter.writeEndElement();
29
30 xmlSWriter.writeEndElement();
31 xmlSWriter.writeEndElement();
32
33 xmlSWriter.writeEndDocument();
34
35 xmlSWriter.flush();
36 xmlSWriter.close();
37 }
38 }
39 }
در این روش به ابزارهای زیادی، میکنیمimport ابتدا ابزارهای مورد نیاز را.در ادامه با بخشهای مختلف کد باال آشنا میشویم
برای نوشتن با این روش نیاز. فایلی که قصد نوشتن در آن را داریم مشخص میکنیم33 با استفاده از خط.)1-3 نیاز نداریم(خطوط
33 برای همین در خط، استفاده کنیمFileOutputStream چون قصد ما نوشتن در فایل باید از،به یک استریم خواهیم داشت
ایجاد میکنیم که همانطور که از نام آن پیداستXMLStreamWriter یک33 و31 با استفاده از خطوط. را تعریف کردهایمfos
را مشخصXML ابتدای فایلwriteStartDocument() با استفاده از متد. را بر روی یک استریم خروجی مینویسدXML محتوای
را فراخوانی کنیم تا مطمئن شویم فایل به درستی بستهwriteEndDocument() متناظر با این متد در انتهای کار باید متد،میکنیم
به عنوان مثال خط زیر تگ.)30( استفاده میکنیمwriteStartElement() برای نوشتن یک تگ آغازین از متد.)11 میشود(خط
استفاده میکنیمwriteEndElement() در هر زمان که نیاز به بستن یک تگ داشتیم از متد.< را ایجاد میکندPerson> آغازین
به سادگی میتوانیم به تگ موردwriteAttribute() پس از باز کردن یک تگ با استفاده از متد.و تگ مورد نظر بسته میشود
را باname صفت53 به عنوان مثال در خط. پارامتر اول نام صفت و پارامتر دوم مقدار صفت است،نظر صفت جدید اضافه کنیم
111 کار با تاریخ ،فایل و رشته
به تگ Personاضافه کردهایم .برای نوشتن مقدار متنی داخل یک تگ به سادگی از متد John Smith مقدار
)( writeCharactersاستفاده میکنیم ،به عنوان مثال در خط 51و 51مقادیر 13و Maleرا در بخش متن تگهای Ageو
Genderنوشتهایم .در انتها برای اینکه مطمئن شویم استریم خروجی در فایل نوشته شده است متد )( flushرا فراخوانی میکنیم
XPathپیشنهاد رسمی W3Cبرای پرس و جو و جست و جو در محتوای XMLاست ،در حقیقت XPathاستانداری است که زبانی
را در اختیار ما قرار میدهد که با استفاده از آن میتوانیم المانها و صفتها مختلف یک فایل XMLرا مورد بررسی قرار دهیمXPath .
برای قسمتهای مختلف یک فایل XMLمانند المانها ،صفتها ،متنها ،توضیحات و غیره ساختارهای مناسب را در
با استفاده از Path Expressionاین امکان را به ما میدهد که گره یا گرههایی که دارای شط خاصی هستند را به
کتابخانه استاندار و کاملی را در اختیار ما قرار میدهد که از طریق قادر به کار کردن با انواع داده ای مختلف همچون اعداد،
تاریخ ،رشتهها و غیره خواهیم بود ،به عالوه توابع استانداری برای تغییر و یا مقایسه نیز در اختیار ما قرار میدهد.
XPathاز مهمترین استانداردهای XSLTاست و یادگیری XSLTنیازمند یادگیری XPathنیز میباشد.
Predicateکه از ویژگیهای Path Expressionاست به ما امکان میدهد تا از بین لیست گرهها فقط گرههای
Path Expression
Path Expressionعبارت متنی است که به ما اجازه میدهد گره یا گرههایی را از داخل یک محتوای XMLاستخراج کنیم ،جدول
عملکرد عبارت
به کار بردن نام گره باعث میشود تا تمام گرههای با نام مورد نظر انتخاب شوند. node-name
Predicates
پس از ساخت یک لیست توسط Path Expressionبا استفاده از Predicateمیتوانیم گره یا گرههای خاصی را انتخاب
میکنیم Predicate ،با عبارت ] [...مشخص میشود که به جای … میتوانیم از توابع استاندارد ،اندیس یا عبارات پیچیده تر
برای انتخاب گرههای خاص استفاده کنیم ،در ادامه با مثال با این موضوع آشنا میشویم:
عملکرد عبارت
تمام گرههای studentزیر گره classکه اندیس آنها از 1کمتر است را انتخاب ]/class/student[position()<3
میکند (یعنی دو گره ابتدایی انتخاب میشوند ).در اینجا اندیس از یک شروع
میشود.
استفاده از XPath
خوشبختانه در جاوا با استفاده از کتابخانههای توکار میتوانیم به سادگی از امکانات XPathاستفاده کنیم ،به صورت کلی استفاده
کتابخانههای مورد نیاز را importکنیم که معموال موارد زیر کافی هستند: .3
import ;*org.w3c.dom.
import ;*org.xml.sax.
import ;*javax.xml.parsers.
import ;*javax.xml.xpath.
import ;*java.io.
با استفاده از متد )( evaluateنتیجه مورد نظر را محاسبه کنیم. .1
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 110
sample.xml به نامXML قبل از ادامه یک فایل.در ادامه با استفاده از چند مثال به صورت عملی با موارد فوق آشنا میشویم
: است به صورت زیر عمل میکنیمJohn Smith آن برابریName برای انتخاب گره ای از فایل باال که خاصیت
1 package myfirstprogram;
2
3 import org.w3c.dom.*;
4 import javax.xml.parsers.*;
5 import javax.xml.xpath.*;
6 import java.io.*;
7
8 public class MyFirstProgram
9 {
10 static void printNode(Node n)
11 {
12 System.out.println("------");
13 Element e = (Element)n;
14
15 //Parent Node
16 System.out.println(n.getNodeName() + " Name: " + e.getAttribute(" Name"));
17
18 //Age
19 String Age = e.getElementsByTagName("Age").item(0).getTextContent();
20 System.out.println("Person Age: " + Age);
21
22 //Gender
23 String Gender = e.getElementsByTagName("Gender").item(0).getTextContent();
24 System.out.println("Person Gender: " + Gender);
25 }
26
116 فایل و رشته،کار با تاریخ
1
------
Person Name: John Smith
Person Age: 30
Person Gender: Male
کد باال را به56 کافی است که خط،( باشدFemale) ( در آنها زنGender) که جنسیتPerson برای انتخاب گرههای از نوع
1
------
Person Name: Lisa Carter
Person Age: 22
Person Gender: Female
کد باال را به صورت زیر50 کافی است که خط، سال باشد51 ( آنها بیشتر ازAge) که سنPerson برای انتخاب گرههای از نوع
:تغییر دهیم
3
------
Person Name: John Smith
Person Age: 30
Person Gender: Male
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 133
------
Person Name: Jerry Frost
Person Age: 27
Person Gender: Male
------
Person Name: Adam Wong
Person Age: 35
Person Gender: Male
فصل چهارم
MYSQLچیست؟
بیشتر برنامههای امروزی از روشهای مختلفی برای ذخیره سازی دادهها استفاده میکنند .یک برنامه میتواند دارای انواع مختلفی
از منابع داده مانند فایل textو فایل XMLو همچنین یک databaseباشد .از Databaseها معموال برای ذخیره انواع داده
مانند نام ،آدرس ،سن ،جنس و شغل یک شخص ،آهنگ ،تصویر و بسیاری چیزهای دیگر استفاده میشود .یک دیتابیس مجموعه
ای است از انواع مختلف دادههای ساخت یافته در داخل جداولی که شامل فیلدها و رکوردها میباشند .بیشتر برنامههای امروزی
از دیتابیس برای ذخیره اطالعات استفاده میکنند .دیتابیسهای رابطه ای شامل دادههای هستند که به صورت سازمان یافته با
همدیگر در ارتباط هستند .این نوع دیتا بیس ها شامل یک یا چند جدول به هم پیوسته هستند .جداول شامل سطر و ستون
هستند .در دیتابیسها یک سطر نشان دهنده یک رکورد است .به عنوان مثال در یک دیتابیس که شامل رکوردهای کارمند است،
یک سطر نشان دهنده یک رکورد از یک کارمند است .ستون نشان دهنده فیلدها یا خواص و صفت میباشد .به عنوان مثال یک
کارمند دارای یک فیلد مثال ( FirstNameنام) و یک فیلد ( LastNameنام خانوادگی) و یک فیلد ( Ageسن) است .میتوانید
بین چندین جدول ارتباط برقرار کنید .به عنوان مثال یک جدول کارمند میتواند دارای یک فیلد به نام City_IDباشد.سپس جدول
دیگر به نام Citiesمیتواند شامل فیلدهای City_IDو CityNameباشد .شما میتوانید بین این دو جدول ارتباط برقرار کنید.
MYSQLیکی از استانداردترین راههای برقراری ارتباط با دیتابیس میباشد .این زبان دارای دستوراتی است که شما به وسیله آنها
میتوانید دادههای دیتابیس را بروز کرده ،بازیابی ،اضافه و حذف کنید .همچنین به شما اجازه ایجاد و تغییر دیتابیس و جداول و
ایجاد ارتباط بین جداول مختلف را میدهد Database Management Systems .یا DBMSمانند MYSQLبه شما اجازه دسترسی
سریع به دادههای دیتابیس را میدهد و شامل ابزارهای مختلفی برای پرس و جو ،ایجاد ،حذف و آپدیت دیتابیس میباشد .بیشتر
DBMSها یک محیط گرافیکی جهت انجام امور مختلف برای شما فراهم میآورند .مثالهایی از DBMSعبارتاند از Oracle ،Access
و MYSQL .SQL SERVERتوسط شرکت اوراکل توسعه ،توزیع ،و پشتیبانی میشود.
از آنجاییکه در این سری آموزشی میخواهیم در مورد نحوه ارتباط با بانک اطالعاتی MYSQLدر زبان جاوا و انجام عملیات مختلف
از جمله ثبت و حذف و ویرایش و … بر روی دادههای آن ،بحث کنیم ،پس در درس بعد مباحث مقدماتی این زبان را به شما آموزش
میدهیم .
131 کار با بانک اطالعاتی
مبانی MYSQL
قبل از اینکه اقدام به دسترسی و تغییر دیتابیسها کنید الزم است در مورد مبانی MYSQLاطالعاتی داشته باشید .از این زبان برای
پرس و جو در دیتابیس استفاده میشود.درک MYSQLبسیار ساده و آسان است .از MYSQLتنها برای پرس و جوی داده استفاده
نمیشود ،بلکه تقریبا از آن برای انجام هر کاری مثال ایجاد ،بروزرسانی و حذف دیتابیس و جداول استفاده میشود MYSQL .همانند
سایر زبانهای برنامه نویسی دارای انواعی از دادههاست که به سه نوع متنی ،عددی و تاریخی تقسیم میشوند و لیست آنها در
INT داده عددی معمول که میتواند با نشانه یا بدون نشانه باشد (مثبت یا منفی) .اگر از نوع نشانه دار عددی
باشد محدوده مجاز اعداد بین 5331301130-تا 5331301131میباشد ،اگر بدون نشانه باشد
محدوده مجاز اعداد از 3تا 3563611561میباشد .میتوانید تعداد ارقام اعداد را تا 33عدد مشخص
کنید.
TINYINT عدد صحیح خیلی کوچک که می تواند نشانه دار یا بدون نشانه (مثبت یا منفی) باشد .اگر نشانه عددی
دارد باشد محدوده مجاز اعداد بین 350-تا 351میباشد .اما اگر بدون نشانه باشد محدوده مجاز
اعداد بین 3تا 511میباشد .میتوانید تعداد ارقام را تا 3رقم مشخص کنید.
SMALLINT عدد صحیح کوچک می تواند نشانه دار یا بدون نشانه باشد .اگر نشانه دار باشد محدوده مجاز عددی
اعداد بین 15110-تا 15111میباشد .اگر بدون نشانه باشد محدوده مجاز اعداد بین 3تا 11111
MEDIUMINT عدد صحیح متوسط که می تواند نشانه دار یا بدون نشانه باشد .اگر نشانه دار باشد محدوده مجاز عددی
اعداد بین 0100130-تا 0100131می باشد .اگر بدون نشانه باشد محدوده مجاز اعداد بین 3تا
BIGINT عدد صحیح بزرگ می تواند نشانه دار یا بدون نشانه باشد .اگر نشانه دار باشد محدوده مجاز اعداد عددی
محدوده مجاز اعداد بین 3تا 6551115311013111031میباشد .تعداد ارقام را میتوانید تا 53رقم
مشخص کنید.
FLOAT عدد اعشاری که نمیتواند بدون عالمت باشد .میتوان طول ارقام ) (Mو تعداد اعشار ) (Dرا عددی
تعریف کرد .تعریف طول و تعداد اعشار اجباری نمیباشد و در صورت عدم مقدار پیشفرض 33,5
اشتفاده میشود که 5تعداد ارقام اعشار و 33تعداد کل ارقام میباشد (با احتساب ارقام اعشار).دقت
DOUBLE عدد اعشاری با دقت مضاعف نمیتواند بدون عالمت باشد .میتوان طول ارقام ) (Dو تعداد عددی
اعشار) (Dرا تعریف کرد .تعریف طول و تعداد اعشار اجباری نمیباشد و در صورت عدم تعریف
مقدار پیشفرض 31,3اشتفاده میشود که 3تعداد ارقام اعشار و 31تعداد کل ارقام میباشد (با
احتساب اعداد اعشار) .دقت اعشار میتواند تا 13عدد برای DOUBLEباشد REAL.مترادف برای
DOUBLEاست.
DECIMAL عدد اعشاری با ممیز شناور که نمیتواند بدون عالمت باشد .در اعشار ممیز شناور هر عدد اعشار عددی
معادل یک بایت میباشد .تعریف طول ارقام ) (Mو تعداد اعشار ) (DمیباشدNUMERIC .
DATE تاریخ با فرمت ،YYYY-MM-DDکه محدوده آن بین 33-33-3333تا 13-35-6666میباشد .برای مثال تاریخ
DATETIME ترکیبی از تاریخ و زمان با فرمت YYYY-MM-DD HH:MM:SSمیباشد ،محدوده آن بین 33-33-3333 تاریخ
TIMESTAMP محدوده زمانی بین نیمه شب January 1, 1970و زمانی در 5311میباشد .فرمت آن شبیه تاریخ
فرمت DATETIMEمیباشد بودن خط تیره در میان اعداد .برای مثال 1:13 ،بعد از ظهر در
YEAR سال را با فرمت 5رقم یا 3رقم ذخیره میکند .اگر طول 5تعیین شود YEAR ،میتواند بین 3613تا تاریخ
13( 5316تا )16باشد .اگر طول 3تعیین شود YEARمیتواند بین 3633تا 5311باشد .طول
پیشفرض 3میباشد.
CHAR رشته با طول ثابت که طول آن بین 3تا 511میباشد (مثال )CHAR(5) :مقدار خالی سمت رشته
راست با فضای خالی پر می شود تا زمانی که به حداکثر طول تعیین شده برسد .تعریف طول رشته
VARCHAR رشته با طول منغیر که طول آن میتواند بین 3تا 511باشد ( .مثال .)VARCHAR(25) :تعریف رشته
BLOB / TEXT فیلد با حداکثز مقدار 11111کاراکتر BLOB .مخفف ” “Binary Large Objectمیباشد و رشته
برای ذخیره مقادیر بزرگ داده باینری استفاده میشود ،از قبیل تصویر یا انواع مختلف فایلها.
فیلدهایی که عنوان TEXTذخیره شده اند نیز مقدار بزرگی از داده را ذخیره میکنند .تفاوت آنها در
این میباشد که مرتب سازی و مقایسه در فیلدهای BLOBبین حروف کوچک و بزرگ تفاوت قائل
میشود اما در فیلدهای TEXTتفاوتی قائل نمیشود .برای نوعهای TEXTو BLOBطول تعریف
نمیشود.
TINYBLOB / یک ستون TEXTیا BLOBبا حداکثر مقدار 511کاراکتر .برای نوعهای TINYTEXTو رشته
TINYTEXT
،TINYBLOBطول تعریف نمیشود.
MEDIUMBLOB / یک ستون TEXTیا BLOBبا حداکثر مقدار 31111531کاراکتر .برای نوعهای MEDIUMTEXTو رشته
MEDIUMTEXT
،MEDIUMBLOBطول تعریف نمیشود.
LONGBLOB / یک ستون TEXTیا BLOBبا حداکثر مقدار 3563611561کاراکتر .برای نوعهای LONGTEXTو رشته
LONGTEXT
،LONGBLOBطول تعریف نمیشود.
ENUM یک نوع شمارشی میباشد ،که یک ا صطالح عامیانه برای لیست است .هنگامی که یک فیلد رشته
ENUMتعریف میکنید ،شما لیستی از گزینهها ایجاد میکنید که یک مورد باید انتخاب شود (یا
میتواند NULLباشد) .برای مثال شما میخواهید فیلد دارای مقدار ” “Aیا ” “Bیا ” “Cباشد،
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 131
فیلد ENUMباید به صورت)’ ENUM(‘A’,’B’,’Cتعریف شود و تنها همان مقادیر تعیین شده
SET نوع SETنیز همانند ENUMمیباشد و تنها تفاوت آن در این میباشد که امکان انتخاب چند گزینه رشته
حال اکه با انواع دادهها آشنا شدید ،در ادامه در دستورات پایه ای MYSQLتوضیح میدهیم .
دستورات MYSQL
MYSQLدارای دستوراتی برای کار با بانک اطالعاتی مانند ایجاد بانک ،ایجاد و حذف جداول و کار با دادههای ذخیره شده در بانک
ALTER ALTER TABLE table_name ADD column_name datatype برای اضافه کردن ،حذف کردن
TABLE
یا تغییر ستونها در جدول
or
موجود استفاده میشود .
ALTER TABLE table_name DROP COLUMN column_name
DELETE DELETE FROM table_name WHERE some_column=some_value برای حذف یک رکورد یا همه
رکوردهای جدول به کار میرود .
or
INSERT )INSERT INTO table_name VALUES (value1, value2, value3,…. برای اضافه کردن یک یا چند
INTO
رکورد به جدول به کار میرود .
or
LIKE SELECT column_name(s) FROM table_name WHERE column_name LIKE به همراه دستور WHEREبرای
pattern
پیدا کردن یک الگوی خاص در
یک ستون استفاده میشود .
ORDER BY SELECT column_name(s) FROM table_name ORDER BY column_name برای مرتب کردن نتیجه پرس
][ASC|DESC
و جو بر اساس ستون مشخص
شده به صورت صعودی یا
نزولی به کار میرود .
UPDATE UPDATE table_name SET column1=value, column2=value,… WHERE برای به روز رسانی رکوردهای
some_column=some_value
موجود در یک جدول استفاده
میشود .
WHERE SELECT column_name(s) FROM table_name WHERE column_name برای استخراج رکوردهایی که
operator value
در شرط خاصی صدق میکنند
کاربرد دارد.
MYSQLبه تنهایی زبان پیشرفته و بزرگی است .بیشتر از این در مورد آن توضیح نمیدهیم .برای مشاهده لیست کامل دستورات
http://www.w3schools.com/sql/sql_quickref.asp
حال که با مفاهیم پایه ای آن آشنا شدید ،در درس بعد با کاربرد این دستورات به صورت عملی آشنا میشوید.
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 130
پس الزم است که ابتدا سرور آن را نصب کنیم .در این درس از نسخه MYSQLSERVER 5.5استفاده میکنیم .دو نسخه 13و 15
بیت آن را از لینک زیر دانلود کرده و بسته به نوع ویندوزتان یکی از آنها را نصب کنید:
http://www.dl.w3-farsi.com/Software/Java/MySQL5.5.19.zip
بعد از دانلود فایل باال ،ان را از حالت فشرده خارج کنید .با کلیک بر روی فایل اجرایی یا exeصفحه ای به صورت زیر نمایان
با فشردن دکمه Installمراحل نصب شروع میشود و بعد از زدن چند دکمه Nextمتوالی نصب به پایان میرسد:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 113
113 کار با بانک اطالعاتی
در شکل پایین همانطور که مشاهده میکنید گزینه Launch the MYSQL Instance Configuration Wizardرا تیک زده و
با تیک زدن گزینه Launch the MYSQL Instance Configuration Wizardپنجره ای به صورت زیر باز میشود که با زدن
بعد از زدن دکمه Nextپنجره زیر ظاهر میشود که با انتخاب گزینه اول پیکربندی به صورت استاندارد انجام میشود:
111 کار با بانک اطالعاتی
در مرحله بعد گزینهی اول را انتخاب میکنیم که مقدار حافظه را نسبت به حالتهای دیگر مصرف میکند:
در شکل زیر نوع کاراکتر ) (character setرا مشخص کنیم که ما گزینهی دوم که UTF8را پشتیبانی میکند را انتخاب میکنیم.
یعنی چند زبان از جمله فارسی را پشتیبانی میکند و سپس Nextرا میزنیم:
در این مرحله نامی را اختصاص میدهیم که زمانی که این سرویس Runمیشود با این نام در لیست سرویسهای ویندوز دیده
شود که ما MySQL5.5را در نظر گرفتیم و گزینهی زیر آن را تیک میزنیم تا زمان باال آمدن ویندوز به طور اتوماتیک راه اندازی شود:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 111
در مرحله بعد از آنجاییکه نمیخواهیم هنگام اتصال به سرور پسورد داشته باشیم ،تیک گزینه Modify Security Settingsرا
بر میداریم:
البته این کار اختیاری است و شما ممکن است که دوست داشته باشید هنگام اتصال از شما پسورد درخواست شود ،در نتیجه
میتوانید در دو کادر روبروی این گزینه پسورد دلخواه را وارد کرده و سپس در برنامه استفاده کنید (به صورت زیر):
111 کار با بانک اطالعاتی
برای اطمینان از صحت نصب MYSQLSERVRبه منوی Startویندوز رفته و در بین برنامههای نصب شده به شکل زیر MYSQL
را پیدا و بر روی گزینه MYSQL 5.5 Command Line Clientکلیک کنید:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 110
با کلیک بر روی گزینه فوق صفحه ای به صورت زیر نمایش داده میشود که از شما پسورد میخواهد و چون در مراحل قبل ما هیچ
پسوردی برای اتصال به سرور اختصاص ندادیم با زدن دکمه Enterاز این قسمت رد میشویم:
در مرحله نهایی بعد زدن دکمه ، Enterپنجره زیر نمایان میشود که نشان از نصب کامل MYSQSERVERاست:
116 کار با بانک اطالعاتی
کنسول و کدنویسی در آن در بسیاری از مواقع کسل کننده و زمان بر میباشد .در این درس میخواهیم مراحل نصب نرم افزاری را
به شما آموزش دهیم که شما را از کدنویسی رها میکند .نرم افزار MYSQL Administratorدارای محیط گرافیکی برای کار با
پایگاه داده ،جدول و دادههای آن میباشد .با استفاده از این محیط گرافیکی شما تنها با چند کلیک ساده میتوانید دیتابیس و
جدول ایجاد کرده و آنها را مدیریت کنید .برای دانلود این نرم افزار از طریق لینک زیر اقدام کنید:
http://www.dl.w3-farsi.com/Software/Java/MYSQL%20Administrator.msi
بعد از دانلود بر روی فایل با پسوند msiدوبار کلیک کرده و تمام مراحل زیر را طی کنید:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 113
113 کار با بانک اطالعاتی
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 115
111 کار با بانک اطالعاتی
در صفحه باز شده در داخل کادر Server Hostکلمهی localhostیا 127.0.0.1و در داخل کادر Usernameکلمه rootرا
مینویسیم .در کادر پسورد هم هیچ چیزی نمینویسیم .چون اگر به یاد داشته باشید در هنگام نصب MYSQLپسوردی برای اتصال
به سرور تعریف نکردیم .سپس بر روی دکمه OKکلیک کرده نا وارد محیط برنامه شوید:
111 کار با بانک اطالعاتی
کاربرد منو
از طریق این بخش میتوان سرویس Mysqlرا startو یا stopکنیم. Service Control
در این گزینه میتوانیم کاربرانی با سطح دسترسی مختلف به دیتابیس ایجاد کنیم. User Administration
تعداد ارتباطات که به سرور متصل است را میتوان در اینجا مشاهده کرد. Server Connection
اتفاقاتی که برای سیستم افتاده ،مثال چه زمانی سرویس Startو Stopشده و یا Server Logs
چه دیتابیسی و در چه زمانی ساخته شده و ….را در یک فایل متنی ذخیره میکند.
از طریق چند سرور اطالعات را بر روی دیتابیس ذخیره میکنند. Replication Status
برای پشتیبان گیری از دیتابیس و بازگردانی آن مورد استفاده قرار میگیرند. Backupو Restore
در شکل و جدول باال ما بیشتر با دو گزینه Catalogsو User Administrationبرای ایجاد دیتابیس و جدول و کاربر سرکار
ابتدا روش ایجاد دیتابیس و جدول و کار با دادههای دیتابیس در محیط کنسول را توضیح میدهیم .برای ورود به محیط کدنویسی
به منوی استارت رفته و بر روی گزینه MYSQL 5.5 Command Line Clientکلیک کنید تا پنجره محیط کنسول به صورت زیر
ایجاد دیتابیس
در این بخش میخواهیم یک دیتابیس با نام Universityکه شامل جدول Studentsاست را ایجاد کنیم .برای این کار در پنجره
با فشار دادن دکمه ،Enterاگر همه چیز به خوبی پیش رود و برنامه پیغام خطا ندهد کد زیر نمایش داده میشود:
ایجاد جدول
برای ایجاد جدول studentکه شامل جزییاتی در مورد چندین دانش آموز است ابتدا باید از ایجاد دیتابیس مطمئن شوید برای
معنای دستور باال این است که ما میخواهیم تغییراتی در دیتابیسی به نام Universityبدهیم .همچنین یک پیغام مبنی بر اعمال
تغییرات به شما نشان داده میشود .اجازه دهید که جدول Studentsرا ایجاد کنیم .دستور MYSQLزیر را مینویسیم:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 110
جدول ایجاد شده دارای 1ستون میباشد .ستون اول StudentIDاست ،که آن را به عنوان کلید اصلی و از نوع intتعریف
کردهایم .دیگر ستونهای آن به ترتیب عبارتاند از Age ،Gender ،LastName ،FirstNameو Addressکه نوع آنها مشخص
شده است .با اجرای دستور فوق جدول ایجاد میشود .نکته ای که در کد ب اال وجود دارد و بهتر است که در همین جا به آن اشاره
،primary keyمقداری است که یک سطر یا رکورد را نشان میدهد .این مقدار باید برای هر رکورد ،یکتا باشد و در رکورد
دیگری عین همین مقدار نباید وجود داشته باشد .یکی از روشهای ایجاد کلید اصلی استفاده از یک فیلد شمارشی به عنوان
کلید اصلی است .به هر رکورد یک فیلد شمارشی اختصاص دهید که با اضافه شدن هر رکورد یک مقدار به آن اضافه شود .بدین
معنا که اگر شما یک رکورد به دیتابیس اضافه کردید عدد ،3به ازا دومین رکورد عدد 5و… به فیلد شمارشی اضافه شود .
،AUTO_INCREMENTفیلدی است که به طور خودکار هنگام اضافه شدن یک رکورد جدید ،مقدار میگیرد (معموال یک واحد به
آن اضافه میشود) .به عنوان مثال اگر یک رکورد جدید را اضافه کنیم ،به طور خودکار مقدار 3به آن اختصاص داده میشود ،و
در هر بار اضافه شدن یک رکورد جدید این مقدار نیز یک واحد اضافه میشود .میتوان یک کلید اصلی را به عنوان فیلد شناسه
تعریف کرد.
حال که جدول مان را ایجاد کردهایم اجازه دهید اطالعات مربوط به چند دانش آموز را به آن اضافه کنیم .در زیر اطالعات مربوط به
چند دانش آموز که به جدول اضافه کردهایم نشان داده شده است:
: اضافه کنیمStudents به جدولSQL رکورد داریم اجازه دهید آنها را با استفاده از دستورات01 حال که
استفاده، که به ما اجازه وارد کردن چندین رکورد را به صورت یکجا میدهدINSERT INTO از یک نسخه اصالح شده دستور
جدول،MYSQL بعد از اجرای دستورات. هر رکورد در داخل پرانتز قرار دارد و رکوردها به وسیله کاما از هم جدا شدهاند.میکنیم
یک پیغام نشان داده میشود که نشان دهنده تعداد، اگر همه چیز به درستی انجام شود. رکورد باشد33 باید دارایStudents
نوشتهایم به صورتUniversity همه کدهایی که تا االن برای ایجاد دیتابیس.رکوردهایی است که دستکاری (اضافه) شدهاند
:زیر است
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.19 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
را کهINSERT دستور. عملیات مختلفی بر روی بانک انجام دهیم،حال میخواهیم با توجه به مطالبی که در درس قبل یاد گرفتیم
در ادامه. استفاده کنیمSELECT حال برای نمایش اطالعات میخواهیم از دستور.در باال برای وارد کردن اطالعات انجام دادهایم
: را استخراج کرده و در خروجی نمایش میدهدStudents کد باال تمامی دادههای جدول
اگر بخواهید اطالعات یک یا چند ستون خاص را نمایش دهید کافیست از کد زیر استفاده کنید:
کد باال فقط اطالعات مربوط به ستونهای FirstNameو LastNameرا نمایش میدهد:
+-----------+----------+
| | FirstName | LastName
+-----------+----------+
| Edward | Lyons |
| Jimmie | Vargas |
| Monica | Ward |
| Joann | Jordan |
| Cheryl | | Swanson
| Clara | Webb |
| Zack | Norris |
| Randall | May |
| Jessica | Cole |
| Oscar | | Manning
+-----------+----------+
حال فرض کنید که میخواهیم نام خانوادگی و سن شخصی که اسمش Edwardاست را از جدول استخراج کنیم .برای این کار از
+----------+------+
| | LastName | Age
+----------+------+
| Lyons | | 17
+----------+------+
حال میخواهیم اشخاصی که StudentIDآنها کمتر از 1است را استخراج کرده و به صورت نزولی مرتب کنیم .برای این کار به
mysql> SELECT StudentID, FirstName, LastName FROM Students WHERE StudentID < 5 ORDER BY studentID
;DESC
کد باال 3نفر اول را استخراج کرده و بر اساس ستون StudentIDاز بزرگ به کوچک مرتب میکند .خروجی کد باال به صورت زیر
است:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 115
+-----------+-----------+----------+
| | StudentID | FirstName | LastName
+-----------+-----------+----------+
| 4 | Joann | Jordan |
| 3 | Monica | Ward |
| 2 | Jimmie | Vargas |
| 1 | Edward | Lyons |
+-----------+-----------+----------+
فرض کنید میخواهید تمامی نامهایی که در داخل آنها arوجود دارد را استخراج کنید .در این صورت از عبارت LIKEبه صورت
کد باال تمامی نامهایی که در آنها دو حرف aو rپشت سر هم آمدهاند را استخراجی میکند:
+-----------+
| | FirstName
+-----------+
| Edward |
| Clara |
| Oscar |
+-----------+
اگر بخواهیم مثال سن شخصی به نام Edwardرا از 31به 53تغییر دهیم میتوانیم از دستور UPDATEاستفاده کنیم:
در دستور باال گفتهایم که سن شخصی از جدول Studentsرا که StudentIDآن برابر 3است را به 53تغییر بده .حال اگر با
استفاده از یک دستور SELECTهمه دادهها را نمایش دهیم مشاهده میکنید که سن Edwardبه 53تغییر کرده است .همانطور
که مشاهده میکنید استفاده از دستورات MYSQLبسیار آسان است .شما میتوانید بقیه دستورات را که در درس قبل آموختید را
میخواهیم همان کارها را با استفاده محیط گرافیکی MYSQL Administratorانجام دهیم .برنامه را اجرا کرده و وارد محیط آن
نکته :چون در درس قبل ما دیتابیس universityرا ایجاد کردهایم ،با کلیک بر روی گزینه Catalogsنام آن در داخل لیست
دیتابیسها وجود دارد .بر روی universityراست کلیک کرده و سپس گزینه DROP Schemaو از کادر باز شده کلمه OKرا
ایجاد دیتابیس
برای ایجاد دیتابیس ،بر روی گزینه Catalogsکلیک کرده و سپس در یک قسمت خالی به صورت زیر راست کلیک کرده و گزینه
با کلیک بر روی گزینه Create New Schemaیک کادر نمایان میشود که شما میتوانید نام دیتابیس تان را در داخل آن بنویسید
:
بعد از نوشتن نام دیتابیس (در اینجا )universityو زدن دکمه ،OKدیتابیس ساخته شده با لیست دیتابیسها اظافه میشود
:
111 کار با بانک اطالعاتی
ایجاد جدول
برای ایجاد جدول بر روی نام دیتابیس راست کلیک کرده و گزینه Create New Tableرا بزنید:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 111
بعد از کلیک بر روی گزینه ،Create New Tableصفحه ای به صورت زیر ظاهر میشود .بعد از نوشتن نام جدول در کادر مربوطه
دکمه Enterرا بزنید تا وارد قسمت نامگذاری ستونها یا همان Column Nameدر شکل باال شوید .برای نامگذاری و وارد کردن
سایر مشخصات ستونها کافیست بر روی سلولهای مربوطه دوبار کلیک کنید تا نشانگر ماوس به حالت چشمک زن درآید و شما
بعد از ردن دکمه Apply changesدر شکل باال کادری به صورت زیر نمایش داده میشود که نشان دهنده مشخصات کلی جدول
است ،بر روی دکمه Executeکلیک کنید تا جدول و ستونهای آن در داخل دیتابیس ایجاد شوند:
111 کار با بانک اطالعاتی
حال اگر بر روی دیتابیس مان یعنی universityکلیک کنیم ،مشاهده میکنیم که حاوی یک جدول به نام Studentsاست:
برای وارد کردن دادهها در جدول هم بر روی نام جدول راست کلیک کرده و سپس گزینه Edit Table Dataرا بزنید:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 110
بعد از کلیک بر روی گزینه Edit Table Dataصفحه ای به صورت زیر ظاهر میشود .برای وارد کردن دادهها همانند شکل زیر
ابتدا گزینه Editرا بزنید تا به شما اجازه داده شود که اطالعات را وارد نمایید:
116 کار با بانک اطالعاتی
در شکل باال همانطور که احتماال متوجه شدهاید با دوبار کلیک بر روی هر سلول به شما اجازه داده میشود که اطالعات را وارد کنید
و بعد از اتمام کار یک سلول با زدن دکمه Tabاطالعات سلول بعد را وارد کنید و این کار را تا وارد کردن همه دادهها تکرار کرده و
الته به این نکته توجه کنید که در این محیط میتوان با استفاده از کدنویسی و به صورت زیر هم داده را وارد کرد:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 103
برای این منظور کافیست که مانند شکل باال دستورات را در کادر باال نوشته و دکمه جرقه شکل را بفشارید .حال برای اطمینان از
اینکه کار با دیتابیس در این محیط با محیط کنسول تفاوت ندارد چند دستور از دستورات درس قبل را در این محیط آزمایش کنید
:
103 کار با بانک اطالعاتی
JDBCچیست؟
JDBCیا Java Database Connectivityیک رابط نرم افزاری ) (APIاست ،که به برنامههای جاوا اجازه اتصال و تبادل اطالعات
با بانک اطالعاتی را میدهد .این رابط مجموعه ای از interfaceها و کالسهای نوشته شده توسط زبان جاوا میباشد و با
استفاده از آن میتوان دستورات SQLو PL/SQLرا تقریبا بر روی هر نوع پایگاه داده ای اجرا کرد JDBC .برای اولین بار به عنوان
بخشی از JDK.1.1به برنامه نویسان معرفی شد .البته JDBCورژن مختص خود و مستقل از جاوا را دارد آخرین ورژن موجود از
JDBCورژن 3.3میباشد که در SE7وجود دارد .قبل از شروع کار با JDBCباید متغیرهای زیر را در پنجره Environment
به این نکته توجه کنید که من در سیستم خودم نسخه jdk1.7.0_25را نصب کردهام و ممکن است که شما از نسخه دیگر استفاده
کنید .پس مراقب باشید که نسخه خود را جایگزین کنید .بعد از نصب JDKدو پکیج java.sqlو javax.sqlبه طور خودکار
در دسترس شما قرار میگیرد .وارد کردن یکی از این دو Packageدر برنامه هنگام کار با دیتابیس الزامی است.
در این درس میخواهیم یک مراحل ارتباط با بانک اطالعاتی در جاوا را با استفاده از یک برنامه ساده به شما آموزش دهیم .این
در زیر یک مثال ساده با توجه به مراحل باال ذکر شده است .نگران کدهای زیر نباشید .در درسهای آینده در مورد آنها توضیح
میدهیم:
;package myfirstprogram
result.close(); //Step 6
statement.close();
connection.close();
}
catch (Exception ex)
{
System.out.println(ex.getMessage());
}
}
}
در درسهای آینده شما را به جزییات بیشتر کدهای باال.در کد باال هر مرحله را با ایجاد یک خط فاصله از مراحل دیگر جدا کردهایم
خروجی، اجرا کردهایم، که در درسهای قبل ایجاد کردیمStudents دستورات را بر روی جدول3 و1 چون در مرحله. آشنا میکنیم
چیست؟JDBC Driver
که توسط شرکتهای سازنده پایگاه داده تولید میشوند و از آنها، هستندjar فایلهای با پسوند، یا کانکتورهاJDBC Driver
چون در این سری آموزشی ما میخواهیم ارتباط بین.برای برقراری ارتباط بین برنامههای جاوا و پایگاه داده استفاده میشود
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 103
برنامههایمان با بانک اطالعاتی MYSQLرا برقرار کنیم ،پس باید JDBC Driverمربوط به این پایگاه داده را دانلود کنیم .برای
http://www.dl.w3-farsi.com/Software/Java/mysql-connector-java-5.1.39-bin.jar
بعد از دانلود فایل باال یک پوشه به نام MYSQLConnectorدر درایو Cایجاد کرده و فایل را در داخل آن بگذارید .پس مسیر فایل
C:\MYSQLConnector\mysql-connector-java-5.1.39-bin.jar
همانطور که گفتیم برای ارتباط با بانک ما به این فایل احتیاج داریم .برای استفاده از این فایل باید مسیر آن را به متغیر CLASSPATH
اضافه کنیم .برای این کار قبل و بعد از مسیر فوق دو عالمت ویرگول (;) به صورت زیر اضافه کرده:
;;C:\MYSQLConnector\mysql-connector-java-5.1.39-bin.jar
اگر این کار را انجام ندهید ،مجبور میشوید که در هنگام کامپایل برنامه مسیر این فایل را با استفاده از دستور -cpبه صورت زیر
مشخص کنید:
ProgramNameنام برنامه شما است .حال که فایل JDBC Driverرا دانلود و پیکربندی کردید نوبت به اتصال به دیتابیس میرسد.
قبل از اتصال به دیتابیس باید یک کالس را ثبت یا رجیستر کنیم .منظور از رجیستر کردن بارگذاری کالس در داخل حافظه رم است.
کالسی که میخواهیم بارگذاری کنیم ،کالس Driverمیباشد که در پکیج com.mysql.jdbcو این پکیج هم به نوبه خود در
داخل فایل mysql-connector-java-5.1.39-bin.jarقرار دارد .برای ثبت کالس Driverدو راه وجود دارد:
101 کار با بانک اطالعاتی
try
{
;)(Class.forName("com.mysql.jdbc.Driver").newInstance
//Some Code
}
)catch (ClassNotFoundException ex
{
;))(System.out.println(ex.getMessage
}
try
{
;))(DriverManager.registerDriver(new com.mysql.jdbc.Driver
//Some Code
}
)catch (SQLException ex
{
;))(System.out.println(ex.getMessage
}
همانطور که احتماال از دو کد باال متوجه شدهاید ،استفاده از دو متد )( forNameو )( registerDriverممکن است به ترتیب
باعث ایجاد دو استثنای ClassNotFoundExceptionو SQLExceptionشود .پس بهتر است که آنها را در داخل دستور try
catchبنویسید .به عنوان آخرین نکته یادآور میشویم که در همین حد کافیست که بدانید ،قبل از اتصال به بانک اطالعاتی باید
کالس Driverمربوط به بانک را در حافظه RAMبارگذاری کنید .البته این کالس در پایگاههای داده مختلف دارای نام متفاوتی
است .مثال بارگذاری کالس Driverدر پایگاه داده Oracleبه صورت زیر است:
;)"Class.forName("oracle.jdbc.driver.OracleDriver
حال که با کاربرد JDBC Driverآشنا شدید در درس بعد در مورد نحوه اتصال به بانک اطالعاتی توضیح میدهیم.
ارتباط با بانک
بعد از بارگذاری Driverدر حافظه ،نوبت به ارتباط با بانک اطالعاتی میرسد .برای این کار از متد دیگر کالس DriverManager
به نام )( getConnectionاستفاده میکنیم .این متد دارای سربارگذاری های زیر است:
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 101
getConnection(String url)
این متد یک رشته که در اصل مسیر بانک اطالعاتی و مشخصات اتصال به آن است، همانطور که در کدهای باال مشاهده میکنید
jdbc:RDBMS://hostname:port Number/databaseName
:کد باال نمای کلی رشته و در جدول زیر شکل دقیق تر آن برای اتصال به دیتابیسهای مختلف نشان داده شده است
اجازه،حال که با سربارگذاری های این متد و رشتههای مختلفی که این متد جهت ارتباط با دیتابیسها دریافت میکند آشنا شدید
برای این کار به صورت زیر عمل. متصل شویم،دهید که با استفاده از آن به دیتابیس و جدولی که در درسهای قبل ایجاد کردیم
:میکنیم
Connection connection =
DriverManager.getConnection("jdbc:mysql://localhost:3306/university?user=root&password=");
این مقادیر. و پسورد را خالی قرار دادهایمroot نام کاربری را،1131 مشاهده میکنید که مقدار پورت راurl در تعریف رشته یا
: همانطور که در کد باال مشاهده میکنید. مشخص کردیمMYSQL همان مقادیری هستند که در هنگام نصب سرور
101 کار با بانک اطالعاتی
برای اتصال نهایی به بانک باید یک شیء از Interfaceیا رابط Connectionایجاد کرده و مسیر بانک را از طریق متد
)( getConnectionبه آن معرفی کنیم .کد درس قبل را به صورت زیر کامل تر میکنیم:
try
{
;))(DriverManager.registerDriver(new com.mysql.jdbc.Driver
//some code
;)(connection.close
}
)catch (SQLException ex
{
;))(System.out.println(ex.getMessage
}
تا اینجای کار ارتباط ما با بانک برقرار شد .یک نکته را که بهتر است در همین جا یادآور شویم این است ،بعد از اتصال به بانک و
انج ام عملیات مختلف بر روی آن بهتر است اتصال را قطع کنیم .همانطور که در کد باال مشاهده میکنید این کار را با استفاده از
متد )( closeمربوط به Connectionانجام میدهیم ،که همان مرحله 1یعنی پاک کردن اشیاء بال استفاده و آزاد کردن حافظه
میباشد .حتی اگر شما متد )( closeرا فراخوانی نکنید ،زباله روب یا garbage collectorجاوا اشیاء بی استفاده را پاک
میکند ولی از لحاظ برنامه نویسی بهتر است که خودتان این کار را انجام دهید .برای اطمینان از بسته شدن ارتباط میتوان متد
)( closeرا در بلوک finallyفراخوانی کرد ،چون کدهای این بلوک چه خطایی در برنامه رخ دهد و چه ندهد ،اجرا میشوند:
try
{
//some code
}
)catch (SQLException ex
{
//some code
}
finally
{
;)(connection.close
}
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 100
و خواص مفیدی هستند که شما را قادر میسازند دستورات را به بانک ارسال کرده و نتایج حاصل از آنها را دریافت و پردازش
کنید .در جدول زیر اسم این رابطها و کاربرد آنها ذکر شده است :
کاربرد رابط
برای اجرای دستورات SQLبه صورت پویا یا دینامیک به کار میرود .یا به نوعی میتوان گفت که برای PreparedStatement
اجرای دستوراتی از SQLبه کار میرود که در زمان اجرا پارامتر دریافت میکنند.
در هنگام کار با رویههای ذخیره شده یا stored proceduresبه کار میرود .این رابط هم میتواند CallableStatement
قبل از استفاده از هریک از رابطهای باال باید یک شیء از آنها ایجاد و نتایج حاصل از یک متد از رابط Connectionرا در داخل
آن قرار داد .کدهای زیر نحوه ایجاد شیء از این رابطها و فراخوانی متدهای رابط Connectionمربوط به هریک از آنها نمایش
رابط Statement
همانطور که در باال اشاره شد قبل از استفاده از رابط Statementباید متد )( createStatementاز رابط Connectionرا
فراخوانی کنید:
زمانیکه یک شیء از رابط Statementایجاد کردید میتوانید دستورات SQLرا با استفاده از سه متد زیر اجرا کنید:
اگر مقدار برگشتی از این متد trueباشد یعنی شیء ResultSetمیتواند به دست boolean )(execute
تعداد سطرهایی را که تحت تأثیر دستور SQLقرار گرفتهاند را بر میگرداند .مثال تعداد int )(executeUpdate
از این متد معموال برای اجرای دستور INSERTاستفاده میشود و نتایج را به صورت ResultSet )(executeQuery
یک شیء ResultSetبر میگرداند .اینشی نماینده سطرهای برگشت داده شده ،حاصل
رابطPreparedStatement
رابط PreparedStatementاز رابط Statementارث بری میکند و این توانایی را به شما میدهد که در زمان اجرای برنامه
پارامترهایی را برای تکمیل دستور SQLارسال کنید .قبل از استفاده از رابط Statementباید متد )( prepareStatementاز
try
{
;"? = String SQL = "Update Students SET Age = ? WHERE StudentID
;)PreparedStatement preparedstatement = connection.prepareStatement(SQL
//some code
}
)catch (SQLException e
{
//some code
}
همانطور که در کد باال مشاهده میکنید دستور SQLدارای عالمتهای ? میباشد .این عالمتهای سؤال با مقادیر یا پارامترهایی
که ما ارسال میکنیم جایگزین میشوند .هر کدام از این عالمتها دارای یک اندیس میباشند .مثال اولین عالمت سؤال دارای
اندیس ،3دومین عالمت دارای اندیس 5و … میباشد .ارسال پارامترها با استفاده از متدهایی از رابط PreparedStatement
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 163
که به صورت )( setXXXهستند ،صورت میگیرد ،که XXXنوع داده ای که قرار است توسط متد ارسال شود را نشان میدهد .مثال
برای ارسال یک پارامتر از نوع اعداد صحیح از متد )( setIntاستفاده میشود .در زیر لیست این متدها ذکر شده است:
کاربرد متد
یک مقدار صحیح را جایگزین عالمت ؟ میکند. )setInt(int paramIndex, int value
یک مقدار رشته ای را جایگزین عالمت ؟ میکند. )setString(int paramIndex, String value
یک مقدار floatرا جایگزین عالمت ؟ میکند. )setFloat(int paramIndex, float value
یک مقدار doubleرا جایگزین عالمت ؟ میکند. )setDouble(int paramIndex, double value
همانطور که مشاهده میکنید ،این متدها دو پارامتر دریافت می کنند که اولین پارامتر اندیس عالمت سؤال و دومین پارامتر مقداری
که قرار است به جای عالمت سؤال قرار بگیرد ،میباشد .از آنجاییکه رابط از رابط ارث بری میکند ،در نتیجه میتواند از متدهای آن
یعنی )( execute(), executeQueryو )( executeUpdateبرای اجرای دستورات بر روی بانک هم استفاده کند .کد ابتدای
try
{
;))(DriverManager.registerDriver(new com.mysql.jdbc.Driver
//some code
}
)catch (Exception ex
{
;))(System.out.println(ex.getMessage
}
در مورد رابط CallableStatementدر درسهای آینده به طور کامل توضیح میدهیم.
163 کار با بانک اطالعاتی
دستورات SQLی که دادهها را از دیتابیس میخوانند ،آنها را در یک Interfaceبه نام ResultSetمیریزندResultSet .
در واقع یک سری از مجموعه نتایج است و در آن واحد فقط یک سطر را نمایش میدهد .میتوان آن را به صورت یک جدول به
ResultSetبا اجرای یک Statementیا PreparedStatementیعنی فراخوانی متد )( executeQueryبه روشهای زیر ایجاد
میشود:
یا
ResultSetدارای یک نشانگر ) (cursorاست که به سطر جاری اشاره میکند .متدهای این رابط به سه گروه زیر تقسیم
میشوند:
متدهای دریافت کننده مقادیر :برای مشاهده داده یک ستون از سطر جاری به کار میروند.
متدهای به روز کننده مقادیر :برای به روز کردن داده یک ستون از سطر جاری به کار میروند.
نشانگر بر طبق خاصیتهای ResultSetدر بین سطرها حرکت میکند .این خواص در زمان ایجاد دستور یا همان Statement
یعنی قبل از ایجاد ResultSetتعریف میشوند و تعیین میکنند که مثال ResultSetفقط خواندنی باشد یا قابل بروز رسانی و
… .در زیر نحوه تعریف خصوصیات ResultSetدر متدهای رابط Connectionآمده است:
در کدهای باال RSTypeنوع و RSConcurrencyفقط-خواندنی یا قابل به روزرسانی بودن ResultSetرا مشخص میکند.
انواع ResultSet
انواع ResultSetدر جدول زیر آمده است .اگر هیچ نوعی برای ResultSetتعریف نکنید ،برای آن به طور خودکار نوع
توضیح نوع
نشانگر فقط میتواند رو به جلو در داخل مجموعه نتایج حرکت کند. ResultSet.TYPE_FORWARD_ONLY
نشانگر میتواند به عقب و جلو حرکت کند و مجموعه جواب یاResultSet ResultSet.TYPE_SCROLL_INSENSITIVE
نشانگر میتواند به عقب و جلو حرکت کند و مجموعه جواب یا ResultSet ResultSet.TYPE_SCROLL_SENSITIVE
دومین خاصیتی هم که برای ResultSetمیتوان تعریف کرد ،دارای مقادیر زیر است:
توضیح Concurrency
161 کار با بانک اطالعاتی
با وجود این خاصیت میتوان مجموعه نتایج را بروز کرد. ResultSet.CONCUR_UPDATABLE
با توجه به مطالب باال برای ایجاد یک ResultSetکه بتوان در آن فقط رو به جلو حرکت کرد و دادههای آن فقط-خواندنی و غیر
try
{
= Statement statement
;)connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY
//some code
}
)catch(Exception ex
{
//some code
}
ResultSetدارای متدهایی است که با استفاده از آنها میتوان در میان مجموعه جواب یا همان سطرهای ResultSetحرکت
توضیح متد
یک عدد دریافت میکند که نشان میدهد چه تعداد سطر را نسبت به مکان فعلی نشانگر میتوان رو )(relative
نشانگر را به سطر قبل منتقل میکند و اگر سطر قبلی وجود نداشته باشد مقدار falseرا بر )(previous
میگرداند.
نشانگر را به سطر بعد منتقل میکند و اگر سطر بعدی وجود نداشته باشد مقدار falseرا بر )(next
میگرداند.
یک سطر جدید ایجاد میکند و نشانگر را در ابتدای آن قرار میدهد .البته جای قبلی نشانگر در حافظه )(moveToInsertRow
میماند.
وقتی که یک سطر توسط متد )( moveToInsertRowایجاد و مقداردهی شد ،با فراخوانی این متد )(moveToCurrentRow
رابط ResultSetدارای دوازده متد است که از آنها برای دریافت مقادیر از سطر جاری استفاده میکند .به ازای هر نوع داده ،دو
به عنوان مثال برای دریافت مقدار یک ستون از نوع intباید از متد )( getIntاستفاده کنید.
توضیح متد
نام یک ستون از سطر جاری را دریافت میکند و مقدار آن را بر میگرداند .این متد برای )getInt(String columnName
ستونهایی که مقادیر آنها عددی است کاربرد دارد .مثال ستون سن افراد.
161 کار با بانک اطالعاتی
اندیس یک ستون از سطر جاری را دریافت میکند و مقدار آن را بر میگرداند .اندیس )getInt(int columnIndex
ستونها از 3شروع میشود .این متد برای ستونهایی که مقادیر آنها عددی است کاربرد
همانند متدهای باال رابط ResultSetدارای متدهای دیگری است که برای برگرداندن هشت نوع اصلی دیگر جاوا به کار میروند.
مثال متد )( ،getStringهمانند متد باال اندیس یا نام یک ستون از سطر جاری را میگیرد و مقدار آن را بر میگرداندResultSet .
دارای متدهای مشابه دیگری برای دریافت سایر انواع داده SQLمانند Clob ،TimeStamp ،Time ،Dateو Blobمیباشد.
ResultSetدارای مجموعه ای از متدهاست که از آنها برای آپدیت مقادیر استفاده میکند .به ازای هر نوع داده دو متد برای
مثال برای ستونهایی که دارای نوع رشته ای هستند ،از این متدها به صورت زیر استفاده میشود:
توضیح متد
اندیس ستون مورد نظر ما را دریافت کرده و مقدار داخل آن را با )updateString(int columnIndex, String s
نام ستون مورد نظر ما را دریافت کرده و مقدار داخل آن را با )updateString(String columnName, String s
متدهای دیگری همانند متدهای باال برای به روزرسانی هشت داده اصلی مانند URL ،Object ،Stringو انواع دادههای SQLواقع
در پکیج ،java.sqlوجود دارند .به روز رسانی یک سطر از مجموعه نتایج ،به منزله تغییر ستونهای سطر جاری شیء ResultSet
میباشد .برای اعمال این تغییرات به یک سطر از دیتابیس اصلی باید یکی از متدهای زیر را فراخوانی کنید:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 161
توضیح متد
وقتی یک سطر از دیتابیس را آپدیت میکنیم ،با فراخوانی این متد سطر معادل آن در ResultSet )(updateRow
با Refreshدادههای ،ResultSetهر گونه تغییر در آنها را به دیتابیس اعمال میکند. )(refreshRow
= Statement statement1
;)connection.createStatement(ResultSet.FETCH_FORWARD, ResultSet.CONCUR_READ_ONLY
برای ایجاد ،ResultSetمتد )( executeQueryاز رابط Statementرا فراخوانی میکنیم .در کل کد زیر به منزله ایجاد یک کپی
از جدول Studentمیباشد ،یعنی تمام مقادیر موجود در جدول را در داخل یک شیء ResultSetمیریزیم:
تا اینجای کار ما ResultSetرا ایجاد کردیم .برای پیمایش و نمایش مقادیر هم از دستور whileو متدهای شیء ResultSet
;)(result.beforeFirst
))(while (result.next
{
(System.out.println
)"result.getInt("StudentID + ""\t +
)"result.getString("FirstName + ""\t +
)"result.getString("LastName + ""\t +
)"result.getString("Gender + ""\t +
)"result.getInt("Age + ""\t +
)"result.getString("Address
161 کار با بانک اطالعاتی
;)
}
در کد باال ابتدا نشانگر را با استفاده از متد )( beforeFirstبه قبل از سطر اول منتقل میکنیم .در شرط حلقه هم با استفاده از
متد )( nextتست میکنیم که آیا سطری وجود دارد .اگر وجود داشته باشد وارد بدنه حلقه میشویم .در داخل بدنه حلقه ،چون
که ستونهای StudentIDو Ageاز نوع عددی هست برای دریافت مقادیر آنها از متد )( getIntو برای دریافت مقادیر سایر
ستونها از متد )( getStringاستفاده میکنیم .حال فرض کنید که میخواهیم از یک سطر خاص به بعد را پیمایش کنیم .برای
اینکار ابتدا نشانگر را با استفاده از متد )( absoluteبه سطر مورد نظر میبریم و سپس عملیات پیمایش را انجام میدهیم .به
جای متد )( beforeFirstکد باال متد ( absolute )1را نوشته و کد را اجرا کنید:
;)result.absolute(7
))(while (result.next
{
//some code
}
حال در همین حالت به جای متد )( nextدر قسمت شرط متد )( relativeرا به صورت زیر نوشته و کد را اجرا کنید:
;)result.absolute(7
))while (result.relative(3
{
//some code
}
در کد باال نشانگر در سطر 1قرار دارد .وقتی که ما متد )( relativeرا به صورت باال فراخوانی میکنیم ،عدد 1یعنی نشانگر سه
سطر پرش کند .در نتیجه نشانگر روی سطر 33قرار میگیرد .حال اگر همین عدد را منفی بدهیم ،پرش نشانگر رو به عقب خواهد
بود:
;)result.absolute(7
))while (result.relative(-3
{
//some code
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 160
از متدهایی که با کلمه،ResultSet برای بروز رسانی مقادیر موجود در ستونهای یک سطر از،همانطور که قبال هم اشاره کردیم
تغییرZhila که در سطر سوم قرار دارد را بهMonica فرض کنید که میخواهیم نام. شروع میشوند استفاده میشودupdate
1 package myfirstprogram;
2
3 import java.sql.*;
4
5 public class MyFirstProgram
6 {
7 public static void main(String[] args)
8 {
9 try
10 {
11 DriverManager.registerDriver(new com.mysql.jdbc.Driver());
12
13 String url = "jdbc:mysql://localhost/university?user=root&password=";
14 Connection connection = DriverManager.getConnection(url);
15
16 Statement statement1 = connection.createStatement(
17 ResultSet.TYPE_FORWARD_ONLY,
18 ResultSet.CONCUR_UPDATABLE
19 );
20 ResultSet result = statement1.executeQuery("SELECT * FROM Students");
21
22 if (result.getConcurrency() == ResultSet.CONCUR_UPDATABLE)
23 {
24 result.absolute(3);
25 result.updateString("FirstName", "Zhila");
26 result.updateRow();
27 }
28 else
29 {
30 System.out.println("ResultSet non-updatable.");
31 return;
32 }
33
34 result.beforeFirst();
35
36 while (result.next())
37 {
38 System.out.println(result.getString("FirstName"));
39 }
40
41 result.close();
166 کار با بانک اطالعاتی
42 ;)(statement1.close
43 ;)(connection.close
44 }
45 )catch (Exception ex
46 {
47 ;))(System.out.println(ex.getMessage
48 }
49 }
50 }
Edward
Jimmie
Zhila
Joann
Cheryl
Clara
Zack
Randall
Jessica
Oscar
درباره خطوط 33-53کد باال توضیح نمیدهیم چون قبال درباره آنها صحبت کردهایم .تنها نکته موجود در این خطوط مربوط به خط
30است که در آنجا به برنامه اعالم کردهایم که میخواهیم یک ResultSetایجاد کنیم که بتوانیم مقادیر موجود در آن را به روز
رسانی یا ویرایش کنیم .در خط 55برای اطمینان از قابل ویرایش بودن ResultSetبا استفاده از متد )(getConcurrency
چک میکنیم که آیا ResultSetقابل بروزرسانی است است یا نه؟ اگر بود ،ابتدا با استفاده از متد )( ،absoluteنشانگر را به
سطر 1میبریم و سپس با استفاده از متد )( updateStringمی گوییم که قرار است مقدار ستون FirstNameرا به Zhila
تغییر دهیم .سپس با فراخوانی متد )( updateRowتغییرات نهایی را به بانک اعمال میکنیم .در غیر اینصورت یعنی اگر
ResultSetقابل ویرایش نبود در قسمت ( elseخطوط )50-15پیغام ResultSet non-updatableرا به کاربر نمایش داده
و با استفاده از دستور returnاز اجرای سایر کدها جلوگیری میکنیم .با فرض اینکه ستون مورد نظر ما ویرایش شده است ،برای
نمایش این ستون و مشاهده تغییرات ،ابتدا با استفاده از متد )( ،beforeFirstنشانگر را به ابتدای سطرهای ResultSetآورده
و سپس با استفاده از یک دستور whileکه قبال توضیح داده شد ،مقادیر را نمایش میدهیم (خطوط .)13-16مشاهده میکنید
که مقدار ستون اول از سطر سوم تغییر کرده است .درباره خطوط 33-31در درس آینده توضیح میدهیم .برای اضافه کردن سطر
به ResultSetاز متدهای )( moveToInsertRowو )( insertRowاستفاده میشود .خطوط 53-51کد باال را پاک کرده و
;)(result.moveToInsertRow
;)"result.updateString("FirstName", "John
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 133
;)"result.updateString("LastName", "Scith
;)"result.updateString("Gender", "Male
;)result.updateInt("Age", 25
;)"result.updateString("Address", "Golden Street
;)(result.insertRow
در کد باال ابتدا با استفاده از متد )( moveToInsertRowیک سطر خالی ایجاد و سپس مقادیری را در داخل هر یک از سلولهای
آن قرار میدهیم و در نهایت با فراخوانی متد )( ،insertRowاین سطر را به جدول اصلی اضافه میکنیم .برای حذف یک سطر
خاص هم کافیست که نشانگر را به محل سطر برده و با فراخوانی متد )( deleteRowآن را حذف کنید .مثال کد زیر را به جای
;)result.absolute(3
;)(result.deleteRow
ایجاد کردیم .این اشیا به طور خودکار بعد از مدتی توسط زباله روب یا Garbage Collectorاز حافظه پاک میشوند ولی بهتر
است که خودتان این کار را به صورت دستی و با فراخوانی متد )( closeو به صورت زیر انجام دهید .
;package myfirstprogram
;)(statement.close
;)(result.close
;)(connection.close
}
)catch (Exception ex
{
;))(System.out.println(ex.getMessage
}
133 کار با بانک اطالعاتی
}
}
روش بهتر برای پاک کردن. باعث حذف اشیاء ایجاد شده از رابطهای مذکور و آزاد شدن حافظه میشودclose() فراخوانی متد
در هر، چه برنامه با خطا مواجه شود و چه نشود، چون کدهای این بلوک. میباشدfinally اشیاء فراخوانی همین متد در بلوک
package myfirstprogram;
import java.sql.*;
try
{
//some code
}
catch (Exception ex)
{
System.out.println(ex.getMessage());
}
finally
{
statement.close();
result.close();
connection.close();
}
}
}
تا این اشیاء در بلوک، شیئ ایجاد کردtry catch باید از رابطها در خارج از دستور،همانطور که در کد باال مشاهده میکنید
چون که، را بنویسیمthrows SQLException هم باید عبارتmain() همچنین در جلوی متد. در دسترس باشندfinally
: کد باال را به صورت زیر هم میتوان نوشت. ممکن است باعث ایجاد استثناء شودclose() استفاده از متد
package myfirstprogram;
try
{
//some code
}
)catch (Exception ex
{
;))(System.out.println(ex.getMessage
}
finally
{
try
{
;)(statement.close
;)(result.close
;)(connection.close
}
)catch (SQLException ex
{
;))(System.out.println(ex.getMessage
}
}
}
}
و در محیط بصری NetBeansتوضیح میدهیم .در درسهای قبلی یک دیتابیس به نام Universityو یک جدول با نام
Studentsدر داخل آن ایجاد کردیم .این جدول دارای یک ستون به نام StudentIDمیباشد .در این مثال تمرکز اصلی بر روی
این فیلد است ،چون که برای هر دانش جو دارای یک مقدار منحصر به فرد است و میتوان بر اساس آن عملیات ثبت ،حذف ،درج
و ویرایش اطالعات را انجام داد .برنامه NetBeansرا باز کرده و به صورت زیر یک پروژه جدید به ایجاد میکنیم :
131 کار با بانک اطالعاتی
روی دکمه finishکلیک کرده تا وارد پروژه شوید .در صفحه باز شده به صورت زیر یک Frameجدید به برنامه اضافه کنید:
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 133
بعد از زدن بر روی گزینه JFrame Formصفحه ای به صورت زیر باز میشود که شما میتوانید با استفاده از آن یک نام برای
Frameانتخاب کنید ،که ما در این مثال نام آن را MainFrameمیگذاریم و بر روی دکمه Finishکلیک میکنیم :
چون در این مثال میخواهیم از بانک MYSQLاستفاده کنیم پس باید Connectorاین بانک راه به برنامه اضافه کنیم .برای این
منظور به صورت زیر بر روی Librariesکلیک راست کرده و Connectorرا به برنامه اضافه میکنیم:
131 کار با بانک اطالعاتی
بعد از اتمام مراحل فوق ،شکل نهایی پروژه به صورت زیر میشود:
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 131
قرارFrame بر رویJButton وJlable ،JtextBox چند کنترل، فعال استMainFrame.java حال در حالی که سربرگ
:دهید
1 textBoxStudentId
: کلیک کرده تا وارد محیط کدنویسی شویدSource بعد از تنظیم خواص کنترلها بر روی دکمه
1 package crudinnetbeans;
2
3 import java.sql.*;
4 import javax.swing.*;
5
6 public class MainFrame extends javax.swing.JFrame
7 {
w3-farsi.comتخصصی ترین سایت آموزش جاوا در ایران 130
به یک نکته خیلی مهم توجه کنید و آن این است که ،در کد باال برخی از خطوط مانند خطوط 1 ،3و 31از قبل توسط NetBeans
تولید شدهاند و شما باید بقیه خطوط را بنویسید .در خطوط 1و 3کد باال از آنجاییکه ما با کنترلهای Swingو بانک اطالعاتی سر
و کار داریم ،این دو پکیج را وارد برنامه کردهایم .برای جلوگیری از تکرار کدنویسی ،کالسها یا متغیرهایی را که در طول برنامه با
آنها زیاد سر و کار داریم ،در خطوط 0-31تعریف کردهایم .درباره متغیرهای خطوط 35و 31در ادامه توضیح میدهیم .در این مثال
دوست داریم که هنگامی که برنامه اجرا میشود ارتباط با بانک برقرار شود .برای اینکه به محض اجرای برنامه ارتباط با بانک برقرار
شود ،در بدنه سازنده فرم خطوط 50-31را مینویسیم .درباره این کدها در درسهای قبل توضیح دادهایم.
انتخاب اطالعات
برای انتخاب یا نمایش اطالعات از دکمه Showاستفاده میکنیم .هدف از ایجاد این دکمه این است که کاربر با وارد کردن یک
IDدر جعبه متن StudentIDو زدن این دکمه ،اطالعات مربوط به یک دانشجو را نمایش دهد .بر روی دکمه Showدو بار کلیک
6
7 ;)statement = connection.prepareStatement(SQL
8 ;)))(statement.setInt(1, Integer.parseInt(textBoxStudentID.getText
9
10 ;)(result = statement.executeQuery
11
12 ))(if(result.next
13 {
14 ;))"textBoxFirstName.setText(result.getString("FirstName
15 ;))"textBoxLastName.setText(result.getString("LastName
16 ;))"textBoxGender.setText(result.getString("Gender
17 ;))"textBoxAge.setText(result.getString("Age
18 ;))"textBoxAddress.setText(result.getString("Address
19 }
20 else
21 {
22 ;)"!JOptionPane.showMessageDialog(null,"StudentID not found
23 }
24 }
25 )catch (NumberFormatException | SQLException ex
26 {
27 ;)"JOptionPane.showMessageDialog(null, "Please Enter an number or check your connection
28 }
29 }
در خط 1ابتدا کد SQLمورد نظرمان را مینویسیم .در این خط می گوییم که دانشجویی انتخاب شود که StudentIDآن برابر
عددی باشد که در خط 0و از طریق جعبه متن وارد شده است .نکته ای که در خط 0وجود دارد استفاده از متد
)( Integer.parseIntبرای تبدیل مقدار وارد شده از جعبه متن به عدد صحیح است .چون جعبه متن فقط رشته دریافت
میکند پس باید آن را با استفاده از این متد به عدد تبدیل کنیم .استفاده از این متد باعث بروز استثناء میشود چون ممکن است
که کابربر اشتباها به جای عدد ،حرف تایپ کند .پس در خط 51و در قسمت catchاین استثناء
) (NumberFormatExceptionرا اداره میکنیم .در خط 33دستور SQLرا اجرا میکنیم و نتایج را در شیء ایجاد شد از
ResultSetمیریزیم .اگر عدد وارد شده توسط کاربر با IDیکی از دانشجوها برابر باشد .در این صورت ResultSetدارای یک
رکورد هست .پس شرط خط 35درست بود و وارد بدنه ifمیشویم .در آنجا مشخص میکنیم که مثال ستون نام
) (FirstNameاین رکورد در جعبه متن textBoxFirstNameنمایش داده شود و … .و اگر عدد وارد شده توسط کاربر در بین
IDدانشجوها نباشد پیغام StudentID not foundنمایش داده میشود .حال اگر کال یک مقدار غیر عددی توسط کاربر وارد
شود و یا در ارتباط با بانک اختاللی به وجود آید قسمت catchاجرا میشود .به عنوان مثال عدد 3را وراد کرده و دکمه Showرا
ثبت اطالعات
است که کار آن اضافه کردن یا ثبت دانشجو است (مثال ثبت نامbuttonAddNew کار بعدی که میکنیم اضافه کردن کد
در کد باال ابتدا دو متد ،یکی برای پاک کردن محتویات جعبههای متن ))( ClearFieldsو دیگری برای به دست آوردن ID
آخرین رکورد ثبت شده در بانک ))( (GetNextStudentIDتعریف میکنیم .در بدنه متد )( ClearFieldsیعنی خطوط 1-1
مشاهده میکنید که برای پاک کردن یک جعبه متن کافیست ،یک رشته خالی را با استفاده از متد )( setTextبه جعبه متن
اختصاص دهیم .در بدنه متد )( GetNextStudentIDهم ابتدا یک دستور SQLمینویسیم که آخرین IDوارد شده در جدول را
به ما برگرداند (خط MYSQL .)35دارای یک تابع به نام )( MAXاست که بزرگترین مقدار یک ستون عددی را بر میگرداند .در خط
35نام ستون StudentIDرا به این تابع میدهیم .در خطوط 31-31دستور SQLرا جرا و نتیجه را در شیء ResultSetمیریزیم.
در خط 36هم چک میکنیم که آیا این شیء دارای رکوردی هست ،اگر رکوردی داشت در داخل بدنه ifمقدار ستون StudentID
آن را در داخل یک متغیر به نام nextIDمیریزیم .این متغیر در اصل بزرگترین یا آخرین IDموجود در بانک را در خود ذخیره
میکند .ولی چون ما میخواهیم رکورد جدیدی اضافه کنیم پس باید IDرکورد جدید 3واحد بیشتر از آخرین IDموجود در بانک
باشد .پس در خط 55یک واحد به این متغیر اضافه میکنیم .حال نوبت به کدهای موجود در بدنه کنترل کننده رویداد
ActionPerformedمیرسد .همانطور که در ابتدای درس مشاهده کردید ما یک فیلد با نام insertReadyبا مقدارfalse
تعریف کردیم .با استفاده از این فیلد نحوه اجرای دستورات موجود در کنترل کننده رویداد ActionPerformedرا کنترل میکنیم.
ابتدا در خط 13مقدار موجود در شرط را با گذاشتن عالمت ! در کنار نام insertReadyبه trueتغییر میدهیم .این کار باعث
میشود که وقتی برای اولین بار بر روی دکمه Add Newکلیک شد ،کدهای خطوط 11-30اجرا شوند .در خط 11ابتدا متن روی
دکمه را به ( Enrollثبت نام) تغییر میدهیم .در خط 11محتویات تمام جعبههای متن را با فراخوانی متد )(ClearFields
پاک میکنیم .در خط 10یک واحد بیشتر از آخرین IDموجود در بانک را با فراخونی متد )( GetNextStudentIDدر جعبه
متن textBoxStudentIDقرار میدهیم .سپس دکمهها و جعبههای متنی که برای کاربر کاربردی دارند را غیر فعال میکنیم .شکل
Trueکردن فیلد insertReadyدر خط 30باعث میشود که وقتی برای بار دوم بر روی دکمه Add Newکلیک کنیم مقدار
موجود در شرط خط 13برابر falseشده و خطوط موجود در خطوط 15-01اجرا شوند .اینکه در درسهای قبل گفتیم که با
استفاده از PrepareStatementمیتوان دستوراتی را اجرا کرد که در زمان اجرای برنامه تکمیل میشوند ،را میتوان در خطوط
15-15به طور کامل درک کرد .در خط 15ابتدا یک دستور وارد کردن اطالعات ) (INSERTمینویسیم و به جای مقادیر عالمت
سؤال میگذاریم .این عالمت سؤالها به ترتیب توسط مقادیر که توسط کاربر وارد جعبههای متن میشوند پر میشوند .مثال
مقدار وارد شده در جعبه متن textBoxFirstNameدر اولین عالمت سؤال ،مقدار وارد شده در جعبه متن دوم در دومین عالمت
سؤال و الی آخر قرار میگیرد .در خط 13دستور را با فراخوانی متد )( executeUpdateاجرا میکنیم .این متد در صورتیکه
سطری به بانک اضافه شود مقدار 3را بر میگرداند .در نتیجه در خط 11چک میکنیم که آیا مقدار برگشتی از متد بزرگتر از 3
است یا نه؟ اگر بزرگتر بود به این معناست که سطری به بانک اضافه شده است و این اضافه شدن را با نشان دادن یک پیغام به
تخصصی ترین سایت آموزش جاوا در ایرانw3-farsi.com 133
. اجرا شودif میکنیم که دفعه بعد قسمتfalse راinsertReady بعد از اتمام کارها
ویرایش اطالعات
21 try
22 {
23 buttonEdit.setText("Edit");
24 statement = connection.prepareStatement(Query);
25
26 statement.setString(1, textBoxFirstName.getText());
27 statement.setString(2, textBoxLastName.getText());
28 statement.setString(3, textBoxGender.getText());
29 statement.setInt(4, Integer.parseInt(textBoxAge.getText().trim()));
30 statement.setString(5, textBoxAddress.getText());
31 statement.setInt(6, Integer.parseInt(textBoxStudentID.getText().trim()));
32
33 int affectedRows = statement.executeUpdate();
34
35 if(affectedRows>0)
36 JOptionPane.showMessageDialog(null, "Student details successfully updated.");
37 else
38 JOptionPane.showMessageDialog(null, "Update failed.");
39 }
40 catch (NumberFormatException | SQLException ex)
41 {
42 JOptionPane.showMessageDialog(null, "Exception happend!");
43 }
44
45 textBoxStudentID.setEnabled(true);
46 textBoxFirstName.setEnabled(false);
47 textBoxLastName.setEnabled(false);
48 textBoxGender.setEnabled(false);
49 textBoxAge.setEnabled(false);
50 textBoxAddress.setEnabled(false);
51 buttonShow.setEnabled(true);
52 buttonAddNew.setEnabled(true);
53 buttonDelete.setEnabled(true);
54 updateReady = false;
55 }
56 }
رکوردی از بانک استID یک عدد که همانtextBoxStudentID کار با این دکمه به این صورت است که ابتدا کاربر در جعبه متن
سپس در داخل جعبههای متن مقادیر مورد نظر را وارد کرده و در نهایت با زدن دکمه.که قرار است ویرایش شود را وارد میکند
ها فعال میشوند و تمامtextbox کلیک میکنیم همهEdit وقتی برای اولین بار بر روی دکمه.تغییرات را به بانک ارسال میکند
با کمی توجه به کدهای باال متوجه میشوید که کدنویسی این دکمه بسیار شبیه به. غیر فعال میشوندEdit دکمهها به جز دکمه
حذف اطالعات
بر روی این دکمه دو. این کار را برای ما انجام میدهدDelete دکمه.و در نهایت کد مربوط به پاک کردن دانشجو را مینویسی
یک دستور نوشتهایم که در آن گفتهایم سطری1 در خط. است1 و1 تنها توضیح مربوط به خطوط.توضیح کد باال هم تکراری است
. وارد شده استtextBoxStudentID آن برابر عددی باشد که توسط کاربر در جعبه متنStudentID از جدول حذف شود که
سطر مذکورDelete در نتیجه بعد از زدن دکمه. جایگزین میشود1 با مقدار گرفته شده از کاربر در خط1 یعنی عالمت سؤال خط
:حذف میشود