مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

کاملترین آموزش جاوا (Java) گام به گام (مقدماتی تا پیشرفته)

زبان جاوا (Java) یکی از زبان های پرطرفدار در میان برنامه نویس هاست و خیلی ها به دنبال آموزش مناسب برای جاوا هستند. در این مطلب قصد دارم که زبان جاوا که طبق بسیاری از آمار و ارقام موجود محبوب ترین زبان دنیا است را به علاقمندان این زبان آموزش بدم. امیدوارم که برای دوستان مفید باشد. جاوا یک زبان سطح بالا است که در سال 1995 توسط شرکت Sun Microsystems به عنوان بخش مرکزی پلتفرم جاوای این شرکت (java 1.0) تولید شد.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
سرفصل های این مطلب
  1. معرفی ، خصوصیات و شروع به کار
    1. ویژگی های زبان برنامه نویسی جاوا چیست؟
    2. زبان برنامه نویسی جاوا چه خصوصیاتی دارد؟
    3. از کجا کار کردن با زبان برنامه نویسی جاوا را شروع کنیم؟
  2. شی گرایی قسمت یک
    1. مشخص کننده های جاوا یا Java Identifiers چه هستند؟
    2. تغییر دهنده های جاوا یا Java Modifiers چه هستند؟
    3. چند نوع متغیر در جاوا وجود دارد؟
  3. شی گرایی قسمت دو
    1. چه کلمات کلیدی در جاوا وجود دارد؟
    2. آرایه در جاوا چیست؟
    3. Enum چیست؟
    4. معرفی 8 مفهوم در برنامه نویسی شی گرا در جاوا
    5. وراثت چیست؟
    6. اینترفیس Interface در جاوا چیست؟
    7. بررسی مفهوم شی | Object در جاوا
  4. شی گرایی قسمت سه
    1. کلاس ها در جاوا
    2. Constructor چیست؟
    3. آموزش ساخت شیء در جاوا
    4. دسترسی به متدها و متغیرهای عضو
    5. قوانین تعریف فایل های سورس
    6. معرفی پکیج های جاوا
    7. کاربرد عبارات import
  5. انواع داده
    1. معرفی انواع داده های اصلی در جاوا
    2. معرفی نوع داده byte
    3. معرفی نوع داده short
    4. معرفی نوع داده int
    5. معرفی نوع داده long
    6. معرفی نوع داده float
    7. معرفی نوع داده double
    8. معرفی نوع داده boolean
    9. معرفی نوع داده char
    10. معرفی نوع داده انواع داده ارجاعی
    11. بررسی مفهوم لیترال ها در جاوا
  6. انواع متغیر
    1. متغیر محلی چیست؟
    2. بررسی مفهوم فیلدها در جاوا
    3. بررسی مفهوم متغیرهای کلاس استاتیک در جاوا
  7. Modifier ها
    1. Modifier های دسترسی چه هستند؟
    2. بررسی قوانین دسترسی در وراثت
    3. Modifier های غیر دسترسی چه هستند؟
  8. عملگرها قسمت یکچ
    1. معرفی انواع عملگرهای محاسباتی در جاوا
    2. معرفی انواع عملگرهای رابطه ای در جاوا
  9. عملگرها قسمت دو
    1. معرفی انواع عملگرهای بیتی در جاوا
    2. معرفی عملگرهای منطقی در جاوا
    3. معرفی انواع عملگرهای انتسابی در جاوا
    4. معرفی عملگرهای متفرقه در جاوا
    5. بررسی تقدم عملگرها در جاوا
  10. حلقه های تکرار
    1. آموزش استفاده از حلقه while
    2. آموزش استفاده از حلقه for
    3. آموزش استفاده از حلقه do…while
    4. بررسی عبارات کنترل کننده حلقه ها
    5. آموزش استفاده از دستور break
    6. آموزش استفاده از دستور continue
    7. آموزش استفاده از شکل پیشرفته حلقه for
  11. عبارات شرطی
    1. آموزش استفاده از عبارات شرطی if
    2. آموزش استفاده از شرط if-else
    3. آموزش استفاده از شرط if… else if … else
    4. آموزش استفاده از دستورات if تو در تو
    5. آموزش استفاده از شرط switch
  12. کلاس Wrapper اعداد
    1. آموزش استفاده از متدهای کلاس Number
  13. کلاس Wrapper اعداد
    1. بررسی مفهوم parseint در جاوا
    2.  معرفی کاربرد متد abs در جاوا
    3.  معرفی کاربرد متد ceil در جاوا
    4.  معرفی کاربرد متد rint در جاوا
    5.  معرفی کاربرد متد round در جاوا
    6.  معرفی کاربرد متد های min, max در جاوا
    7.  معرفی کاربرد متد exp در جاوا
    8.  معرفی کاربرد متد log در جاوا
    9.  معرفی کاربرد متد pow در جاوا
    10.  معرفی کاربرد متد sqrt در جاوا
    11.  معرفی کاربرد متدهای sin, cos, tan در جاوا
    12.  معرفی کاربرد متدهای asin, acos, atan در جاوا
    13.  معرفی کاربرد متد random در جاوا
  14. کلاس Wrapper کاراکترها
    1. بررس کاربرد کاراکترهای مخصوص در جاوا
    2. معرفی متدهای موجود در کلاس Character
  15. کلاس String و کار با رشته قسمت یک
    1. آموزش به دست آوردن طول رشته در جاوا
    2. آموزش الحاق دو رشته به یکدیگر
    3. آموزش فرمت دادن به رشته
    4. معرفی متدهای کلاس String
    5.  معرفی کاربرد متد compareTo
    6.  معرفی کاربرد متد compareToIgnoreCase
    7.  معرفی کاربرد متد contentEquals
  16. کلاس String و کار با رشته قسمت دو
    1.  معرفی کاربرد متد copyValueOf
    2.  معرفی کاربرد متد endsWith
    3.  معرفی کاربرد متد equals
    4.  معرفی کاربرد متد getBytes
    5.  معرفی کاربرد متد getChars
    6.  معرفی کاربرد متد hashCode
    7.  معرفی کاربرد متد indexOf
  17. کلاس String و کار با رشته قسمت سه
    1.  معرفی کاربرد متد lastIndexOf
    2.  معرفی کاربرد متد length
    3.  معرفی کاربرد متد matches
    4.  معرفی کاربرد متد regionMatches
    5.  معرفی کاربرد متد replace
    6.  معرفی کاربرد متد replaceAll
  18. کلاس String و کار با رشته قسمت چهار
    1.  معرفی کاربرد متد Split
    2.  معرفی کاربرد متد startsWith
    3.  معرفی کاربرد متد subsequence
    4.  معرفی کاربرد متد substring
    5.  معرفی کاربرد متد toCharArray
    6.  معرفی کاربرد متد toLowerCase, toUpperCase
    7.  معرفی کاربرد متد trim
    8.  معرفی کاربرد متد valueOf
  19. آموزش جاوا (Java) قسمت 19 : StringBuilder و StringBuffer 
    1.  معرفی کاربرد StringBuffer append(String s)
    2.  معرفی کاربرد متد public StringBuffer reverse()
    3.  معرفی کاربرد StringBuffer delete(int start, int end)
    4.  معرفی کاربرد متد insert
    5.  معرفی کاربرد متد replace
  20. استفاده از آرایه ها
    1. معرفی آرایه و کاربردش در جاوا
    2. آموزش ساخت آرایه
    3. آموزش پردازش آرایه ها
    4. آموزش استفاده از حلقه foreach
    5. آموزش ارسال آرایه به متدها
    6. آموزش بازگرداندن آرایه به عنوان مقدار بازگشتی متد
    7. آموزش استفاده از کلاس Array
  21. آموزش کار با تاریخ
    1. معرفی متدهای موجود در کلاس Date
    2. آموزش پیدا کردن و نمایش تاریخ کنونی
    3. آموزش مقایسه دو تاریخ با هم
    4. آموزش قالب بندی تاریخ در جاوا
    5. آموزش قالب بندی داده ها با printf
    6. آموزش تبدیل رشته به تاریخ
    7. آموزش متوقف کردن برنامه برای مدتی
    8. آموزش محاسبه زمان صرف شده
  22. عبارات منظم (Regular Expression)
    1. معرفی کلاس Pttern
    2. معرفی کلاس Matcher
    3. معرفی کلاس PatternSyntaxException
    4. بررسی مفهوم پردازش گروه ها
    5. معرفی متدهای مربوط به کلاس Matcher
    6. متدهای اندیسی چه هستند؟
    7. متدهای جستجو چه هستند؟
    8. بررسی متدهای جایگزینی
    9. بررسی کاربرد متدهای کلاس PatternSyntaxException
  23. تعریف و استفاده از متدها قسمت یک
    1. آموزش ساخت متد در جاوا
    2. آموزش فراخوانی متدها در جاوا
    3. آموزش ارسال پارامتر با مقدار
    4. آموزش overload کردن متدها
  24. تعریف و استفاده از متدها قسمت دو
    1. آموزش استفاده از آرگومان های خط فرمان
    2. بررسی مفهوم Constructor ها
    3. آموزش استفاده از کلمه کلیدی this
    4. بررسی مفهوم آرگومان های متغیر ( Variable Arguments )
    5.  معرفی کاربرد متد finalize
  25. کار با استریم ها و فایل ها
    1. بررسی مفهوم Stream استریم ها
    2. آموزش استفاده از استریم های بایتی Byte Streams
    3. آموزش استفاده از استریم های کاراکتری Character Streams
    4. آموزش استفاده از استریم های استاندارد Standard Stream
  26. آموزش کار با فایل ها در جاوا
    1. آموزش استفاده از FileInputStream
    2. آموزش استفاده از FileOutpuStream
  27. کار با دایرکتوری ها
    1. بررسی کاربرد دایرکتوری ها در جاوا
    2. آموزش ساخت دایرکتوری
    3. آموزش لیست کردن دایرکتوری ها
  28. کلاس ByteArrayInputStream
    1. آموزش استفاده از ByteArrayInputStream
  29. معرفی کلاس File و متدها
    1. آموزش استفاده از Constructor های کلاس File
  30. معرفی و شرح Exception ها قسمت 1
    1. آموزش بررسی Exception های چک شده
    2. آموزش بررسی  Exception های چک نشده
    3. بررسی مفهوم خطاها Errors
    4. بررسی مفهوم سلسله مراتب exception ها
  31. معرفی و شرح Exception ها قسمت 2
    1.  معرفی کاربرد متدهای exception ها
    2. آموزش مدیریت exception ها (به دام انداختن)
    3. آموزش استفاده از چندین بلوک catch
    4. آموزش مدیریت همزمان بیش از یک exception
    5. آموزش کلمات کلیدی throw, throws
  32. معرفی و شرح Exception ها قسمت 3
    1. بررسی مفهوم بلوک finally
    2.  معرفی کاربرد بلوک try پیشرفته
    3. بررسی Exception های تعریف شده توسط کاربر
  33. استفاده از انوع کلاس های داخلی
    1.  معرفی کاربرد کلاس های تو در تو
    2.  معرفی کاربرد کلاس های داخلی غیر استاتیک
    3.  معرفی کاربرد کلاس های داخلی Inner Class
    4. آموزش دادن دسترسی به اعضای private
    5.  معرفی کاربرد کلاس های داخلی درون متدها
    6.  معرفی کاربرد کلاس های داخلی بینام
    7. آموزش استفاده از کلاس داخلی بی نام به عنوان پارامتر ورودی
    8.  معرفی کاربرد کلاس های داخلی استاتیک
  34. وراثت کلاس ها و انواع آن
    1. آموزش استفاده از کلمه کلیدی extends
    2. آموزش استفاده از کلمه کلیدی super
    3.  بررسی تفاوت قایل شدن بین اعضا
    4. آموزش فراخوانی constructor کلاس والد از داخل کلاس فرزند
    5.  معرفی کاربرد رابطه Is-A
    6.  معرفی کاربرد رابطه Has-A
    7. معرفی انواع ارث بری در جاوا
  35. Override کردن متد ها
    1. بررسی قوانین override کردن متدها در جاوا
    2. آموزش استفاده از کلمه کلیدی super
  36. چند ریختی (Polymorphism)
    1.  معرفی کاربرد متدهای virtual
  37. Enum و ویژگی های آن
  38. معرفی Abstract
    1.  معرفی کاربرد کلاس های Abstract
    2.  معرفی کاربرد وراثت از کلاس های Abstract
    3.  معرفی کاربرد متدهای Abstract
  39. استفاده از کپسول بندی (Encapsulation)
    1. بررسی مزایای کپسول بندی در جاوا
  40. استفاده از اینترفیس ها
    1. آموزش تعریف اینترفیس در جاوا
    2. آموزش پیاده سازی اینترفیس ها
    3. آموزش ارث بری اینترفیس ها
    4. آموزش ارث بری از چند اینترفیس
    5.  معرفی کاربرد اینترفیس های تگ
  41. آموزش جاوا (Java) قسمت 40 : پکیج(Package) و نحوه استفاده
    1. آموزش ساخت پکیج ها در جاوا
    2. آموزش استفاده از کلمه کلیدی import
  42. معرفی داده ساختارها Enumeration
    1.  معرفی کاربرد Enumeration
  43. داده ساختار BitSet
    1.  معرفی کاربرد BitSet
    2. آموزش استفاده از متدهای کلاس BitSet
  44. داده ساختار Vector
    1. آموزش استفاده از متدهای کلاس Vector
  45. داده ساختار Stack (پشته)
  46. داده ساختار Dictionary
  47. داده ساختار Hashtable
  48. داده ساختار Properites
  49. معرفی و آموزش جنریک (Generic)
    1.  معرفی کاربرد متدهای جنریک
    2. آموزش محدود کردن پارامترهای نوع
    3.  معرفی کاربرد کلاس های جنریک
  50. برنامه نویسی سوکت و شبکه قسمت 1
    1.  معرفی کاربرد برنامه نویسی سوکت در جاوا
    2.  معرفی کاربرد متدهای کلاس ServerSocket
    3.  معرفی کاربرد متد های معمول کلاس ServerSocket
  51. برنامه نویسی سوکت و شبکه قسمت 2
    1.  معرفی کاربرد کلاس Socket
    2.  معرفی کاربرد متدهای موجود در کلاس Socket
  52. استفاده از Lambda Expression
    1.  معرفی کاربرد نحوه نوشتاری syntax
  53. آموزش جاوا (Java) قسمت 52 : Thread و Multi-Threading
    1.  معرفی کاربرد دوره حیات یک thread
    2.  معرفی کاربرد اولویت بین ترد ها
  54. Runnable در Thread و Multi-Threading 
  55. کلاس Thread و متدها

توجه کنید که در آموزش و یادگیری زبان برنامه نویسی جاوا ، صرفا مطالعه کردن کتاب و متن به شما کمک زیادی نخواهد کرد ، این مجموعه مطالب به عنوان کاملترین آموزش متنی جاوا به زبان فارسی برای شما تهیه و تدوین شده است اما اگر می خواهید جاوا را بصورت صفر تا صد و بدون مشکل یاد بگیرید می توانید به جامعترین و کاملترین دوره آموزش جاوا که توسط نویسنده همین دوره آموزش جاوا تهیه و تدوین شده است در لینک زیر مراجعه کنید و خیال خود را بابت یادگیری و پشتیبانی استاد دوره جاوا نیز راحت کنید : 


آموزش جاوا | آموزش Java | دوره آموزش Java

معرفی ، خصوصیات و شروع به کار

این زبان بر روی پلتفرم های گوناگونی مثل ویندوز و Mac os و نسخه های مختلف Unixو Linux اجرا می شود. آخرین نسخه از ویرایش استاندارد جاوا (Standard Edition) نسخه 8 آن است. با پیشرفت جاوا و مشهوریت گسترده آن پیکربندی های متفاوتی از آن ارائه شده است که بتواند برای پلتفرم های مختلف مناسب باشد مانند J2EE برای برنامه های تجاری و J2ME برای دستگاه های موبایل قدیمی.

ویژگی های زبان برنامه نویسی جاوا چیست؟

  • شی گرایی: در جاوا همه چیز یک شی است و از کلاس Object است. جاوا به خاطر مدل شی گرایی به راحتی قابل گسترش است.
  • به پلتفرم خاصی وابسته نیست برخلاف بسیاری از زبان های برنامه نویسی مثل c و c++ ، وقتی که جاوا کامپایل شد برای یک پلتفرم خاص کامپایل نشده است بلکه بایت کد تولید شده برای هر پلتفرمی قابل استفاده است. بایت کد همان اجزای کامپایل شده ی جاوا است. کدهای جاوا توسط ماشین مجازی جاوا (JVM) کامپایل می شوند.
  • سادگی: جاوا به گونه ای طراحی شده است که به راحتی قابل یادگیری باشد. اگر شما اصول شی گرایی را درک کنید به راحتی می توانید در جاوا پیشرفت کنید و آن را یاد بگیرید.
  • امنیت: با استفاده از ویژگی های امنیتی جاوا شما می توانید برنامه های بدون ویروس و بدون جاسوس بسازید. تکنیک های احراز هویت در جاوا بر اساس رمزنگاری Public Key است.
  • خنثی بودن در مورد معماری پردازنده کامپایلر جاوا object file هایی تولید می کنند که وابستگی به معماری پردازنده خاصی ندارد بنابراین با استفاده از سیستم runtime جاوا، فایل های کامپایل شده برروی بسیاری از پردازنده ها قابل اجرا هستند.
  • قابل حمل به علت خنث بودن در مودر معماری پردازنده و نداشتن هیچ وابستگی پیاده سازی جاوا قابل حمل است. کامپایلر جاوا با زبان ANSI C نوشته شده است و همه قابلیت های حمل در آن لحاظ شده است.
  • قابل اعتماد بودن جاوا تلاش کرده است که وضعیت هایی را که ممکن است تولید خطا کند را حذف کند و تشخیص خطا را در حالت اجرا و کامپایل به بهترین شکل انجام دهد.
  • Multithread با ویژگی multithread جاوا می توانید برنامه هایی تولید کنید که می توانند اعمال مختلفی را همزمان انجام دهند. این ویژگی به برنامه نویسان این امکان را می دهد که برنامه های فعال و محاوره ای و چند وظیفه ای تولید کنند.
  • مفسری بایت کد های جاوا در زمان اجرا به زبان ماشین ترجمه می شوند و اجرا می شوند و هیچ جایی ذخیره نمی گردند. به همین منظور گفته می شود که زبان جاوا مفسری است.
  • کارایی بالا High performance چون جاوا از کامپایلرهای Just-In-Time استفاده می کند دارای کارایی بالایی می باشد.
  • توزیع شدگی جاوا به گونه ای طراحی شده است که در محیط های توزیع شده اینترنت بهترین کارایی را داشته باشد.
  • پویا (Dynamic) بودن زبان جاوا بسیار پویاتر از زبان های C++ و C است. چون این زبان طراحی شده است تا با محیط های گوناگون خود را وفق دهد.

زبان برنامه نویسی جاوا چه خصوصیاتی دارد؟

نکات با اهمیتی که در مورد زبان جاوا باید بدانید عبارتند از:

    1. حساسیت جاوا به بزرگ و کوچک بودن نوشته ها (Case Sensitivity) حساسیت جاوا به بزرگی و کوچکی حروف به این شکل است که جاوا بین کلمه Hello و hello تفاوت قایل می شود و این دو را یکی نمی داند.
    2. حرف اول نام کلاس ها در جاوا باید با حروف بزرگ نوشته شوند مانند List یا Array
    3. به علت این که فاصله بین نامها مجاز نیست برای مشخص کردن نام کلاس ها و اشیا و متد ها اگر از چند کلمه تشکیل شده است باید حرف اول هرکلمه به صورت حروف بزرگ نوشته شود. این کار به خوانایی کد بسیار کمک می کند. به عنوان مثال ItProFirstClass.
    4. نام متدها با حروف کوچک شروع می شوند و برخلاف کلاس ها نباید حرف اول متد حرف بزرگ باشد. اگر نام متد از چند کلمه تشکیل شده باشد باید غیر از کلمه اول برای بقیه کلمه ها حرف اولشان بزرگ باشد.
    5. فایل های برنامه که کلاس ما در آن قرار دارند باید دقیقا با کلاس داخل فایل همنام باشند. پسوند فایل های برنامه جاوا .java است.
    6. همه برنامه های جاوا برای اجرا از یک متد به نام main شروع می شوند که این متد به شکل زیر تعریف می شود.
public static void main(String args[])

از کجا کار کردن با زبان برنامه نویسی جاوا را شروع کنیم؟

برای این که شروع به برنامه نویسی به زبان جاوا نمایید، باید قبل از آن بسته نرم افزاری JDK را روی سیستم خود نصب کرده باشید. این بسته برای اجرا و کامپایل برنامه های جاوا لازم است زیرا که ماشین مجازی جاوا و کتابخانه های جاوا در آن قرار داده شده است.

اگر شما کاربر ویندوز باشید با نصب بسته jdk کار نصب این بسته تمام می شود و جاوا بر روی سیستم شما اجرا خواهد شد. ولی برای نصب jdk در لینوکس به آموزش نصب jdk در این سایت مراجعه کنید. پس از این که این بسته نرم افزار نصب شد باید محیط برنامه نویسی جاوا را نصب کنیم.

برای برنامه نویسی جاوا می توانید از یک محیط متنی ساده مانند notepad هم استفاده کنید. ولی محیط های بسیار خوبی برای جاوا وجود دارد که کار برنامه نویسی را بسیار آسان می نماید. IDE یا محیط های معروف برنامه نویسی جاوا عبارتند از:

  1. eclipse
  2. netbeans Ide
  3. Intellij Idea

آموزش جاوا | آموزش Java | دوره آموزش Java

از محیط های معرفی شده نرم افزار های eclipse و netbeans رایگان بوده و می توانید به راحتی از اینترنت دانلود نصب و استفاده کنید. ولی نرم افزار intellij Idea که محصول شرکت jetbrains است یک نرم افزار تجاری است که برای استفاده بیش از یک ماه از آن باید لایسنس آن را خریداری نمایید. ولی قابلیت های بسیاری باعث می شود که این نرم افزار کار را آسان تر کند

شی گرایی قسمت یک

در این مطلب قصد داریم که به ادامه معرفی جاوا بپردازیم و اصول برنامه نویسی در جاوا را شرح دهیم. هر برنامه جاوا می تواند از اشیاء و کلاس های مختلفی تشکیل شده باشد که این اشیا می توانند با فراخوانی متدهای یکدیگر با یکدیگر ارتباط داشته باشند. ابتدا به بررسی مفاهیم کلاس و متد می پردازیم.

  • شیء(Obejct) اشیا ویژگی ها و رفتار های مربوط به خود را دارند. به طور مثال یک سگ ویژگی هایی دارد مانند رنگ و نژاد و اعمالی مانند خوابیدن و خوردن هم رفتارهای آن سگ می باشد. یک شی یک نمونه از یک کلاس است.
  • کلاس (Class) یک کلاس را می توان یک الگو دانست. الگویی که ویژگی ها و رفتار های هر شی که از آن کلاس ساخته شده است را شرح می دهد.
  • متد(Method) یک متد در اصل یک رفتار است . یک کلاس می تواند چندین متد داشته باشد. متدها جایی هستند که منطق برنامه پیاده سازی می شود و داده ها دستکاری می شوند. و همه کارها اجرا می شوند.
  • متغیرهای عضو یا فیلدها(Field) هر شی مجموعه متغیر هایی دارد که ویژگی های شی در فیلدهای آن شی نگهداری می شوند.

مشخص کننده های جاوا یا Java Identifiers چه هستند؟

همه اعضای برنامه نویسی جاوا از جمله فیلد ها و متغیر ها و متدها و کلاس ها و اشیا باید نام داشته باشند. نام هایی که برای این موارد به کار میرود Identifier نام دارد. در جاوا اصولی برای Identifier ها وجود دارد که که این اصول عبارتند از:

  1. همه Identifier ها باید با یک حرف a-z یا A-Z یا علامت $ و یا علامت _ (زیرخط یا underline) شروع شده باشد و نمی توانیم Identifier را با عدد شروع کنیم.
  2. بعد از اولین کاراکتر می توان هر ترکیبی از حروف و اعداد را برای نام Identifier به کار برد. به طور مثال کلمه a2b برای نام گذاری مناسب است ولی 9r باعث ایجاد خطا خواهد شد.
  3. برخی کلمات در جاوا به عنوان کلمات کلیدی تعریف شده اند. از آنها برای نام گذاری Identifier ها نمی توان استفاده کرد. مانند while یا for
  4. جاوا همانگونه که در مطلب قبل گفتیم به بزرگی و کوچکی حروف حساس است و این قانون در مورد Identifier ها هم صدق می کند.
  5. مواردی که در جاوا مجاز هستند: age, $salary, value, 1value می باشند.
  6. موارد روبرو و مشابه آن در جاوا مجاز نیستند:123 abc, -salay

تغییر دهنده های جاوا یا Java Modifiers چه هستند؟

مانند بسیاری از زبان های برنامه نویسی می توان ویژگی هایی برای کلاس ها و متدها و ... مشخص کرد. این کار با استفاده از Modifier ها انجام می شود. در زبان جاوا دو نوع Modifier وجود دارد.

  • Modifier های دسترسی مثل default, public, protected,private
  • Modifier های غیردسترسی مانند: final, abstract, strctfp

در بخش های آینده به توضیح Modifier ها خواهیم پرداخت.

چند نوع متغیر در جاوا وجود دارد؟

متغیر های موجود در جاوا سه نوع می باشد که در ادامه آمده است

  1. متغیر های محلی (local)
  2. متغیرهای کلاس (متغیر های استاتیک )
  3. متغیرهای عضو(فیلدها یا همان متغیرهای کلاس که استاتیک نیستند).

تا این قسمت از مطالب به بررسی مطالب تئوری در مورد جاوا پرداختیم. حال از این بخش به بعد مباحث کمی عملی می شود ولی در خلال آموزش های عملی به مباحث تئوری در زمینه جاوا نیز خواهیم پرداخت. به شکل معمول برای شروع برنامه نویسی در هر زبانی یک برنامه ساده می سازیم.

برای این کار همان طور که در مطلب قبل گفته شد باید بسته jdk بر روی سیستم شما نصب شده باشد. و همانطور که گفته شد در این مطالب نوشتن برنامه جاوا با استفاده از برنامه Intellij Idea می پردازیم. که برای ادامه کاربران باید این برنامه ها را روی سیستم خود نصب کرده باشد.

ولی اگر به جای intellij Idea از برنامه دیگری مانند eclipse نیز استفاده کنید مشکلی پیش نخواهد آمد ولی برای یکپارچگی بیشتر بهتر است از این نرم افزار استفاده نمایید. حال شروع به ساخت اولین برنامه می نماییم. برای این کار از منوی File گزینه New و از آنجا گزینه Project را انتخاب کنید تا صفحه زیر انتخاب شود.

با سلام به همه دوستان و همراهان Itpro. در این مطلب قصد داریم که به ادامه معرفی جاوا بپردازیم و اصول برنامه نویسی در جاوا را شرح دهیم. هر برنامه جاوا می تواند از اشیاء و کلاس های مختلفی تشکیل شده باشد که این اشیا می توانند با فراخوانی متدهای یکدیگر با یکدیگر ارتباط داشته باشند. ابتدا به بررسی مفاهیم کلاس و متد می پردازیم.
* شیء(Obejct) اشیا ویژگی ها و رفتار های مربوط به خود را دارند. به طور مثال یک سگ ویژگی هایی دارد مانند رنگ و نژاد و اعمالی مانند خوابیدن و خوردن هم رفتارهای آن سگ  می باشد. یک شی یک نمونه از یک کلاس است.
* کلاس (Class) یک کلاس را می توان یک الگو دانست. الگویی که ویژگی ها و رفتار های هر شی که از آن کلاس ساخته شده است را شرح می دهد.
* متد(Method) یک متد در اصل یک رفتار است . یک کلاس می تواند چندین متد داشته باشد. متدها جایی هستند که منطق برنامه پیاده سازی می شود و داده ها دستکاری می شوند. و همه کارها اجرا می شوند.
* متغیرهای عضو یا فیلدها(Field) هر شی مجموعه متغیر هایی دارد که ویژگی های شی در فیلدهای آن شی نگهداری می شوند.

!!مشخص کننده های جاوا (Java Identifiers)
همه اعضای برنامه نویسی جاوا از جمله فیلد ها و متغیر ها و متدها و کلاس ها و اشیا باید نام داشته باشند. نام هایی که برای این موارد به کار میرود Identifier نام دارد. در جاوا اصولی برای Identifier ها وجود دارد که که این اصول عبارتند از:
# همه Identifier ها باید با یک حرف a-z یا A-Z یا علامت $ و یا علامت _ (زیرخط یا underline) شروع شده باشد و نمی توانیم Identifier را با عدد شروع کنیم.
# بعد از اولین کاراکتر می توان هر ترکیبی از حروف و اعداد را برای نام Identifier  به کار برد. به طور مثال کلمه a2b برای نام گذاری مناسب است ولی 9r باعث ایجاد خطا خواهد شد.
# برخی کلمات در جاوا به عنوان کلمات کلیدی تعریف شده اند. از آنها برای نام گذاری Identifier ها نمی توان استفاده کرد. مانند while یا for
# جاوا همانگونه که در مطلب قبل گفتیم به بزرگی و کوچکی حروف حساس است و این قانون در مورد Identifier ها هم صدق می کند.
# مواردی که در جاوا مجاز هستند: age, $salary, _value, __1_value می باشند.
# موارد روبرو و مشابه آن در جاوا مجاز نیستند:123 abc, -salay

!!Modifier های جاوا
مانند بسیاری از زبان های برنامه نویسی می توان ویژگی هایی برای کلاس ها و متدها و ... مشخص کرد. این کار با استفاده از Modifier ها انجام می شود. در زبان جاوا دو نوع Modifier وجود دارد.
* Modifierهای دسترسی مثل default, public, protected,private
* Modifierهای غیردسترسی مانند: final, abstract, strctfp
در بخش های آینده به توضیح Modifier ها خواهیم پرداخت.

!!متغیرهای جاوا
متغیر های موجود در جاوا سه نوع می باشد که در ادامه آمده است
# متغیر های محلی (local)
# متغیرهای کلاس (متغیر های استاتیک )
# متغیرهای عضو(فیلدها یا همان متغیرهای کلاس که استاتیک نیستند).

!!شروع برنامه نوسی در جاوا
تا این قسمت از مطالب به بررسی مطالب تئوری در مورد جاوا پرداختیم. حال از این بخش به بعد مباحث کمی عملی می شود ولی در خلال آموزش های عملی به مباحث تئوری در زمینه جاوا نیز خواهیم پرداخت. به شکل معمول برای شروع برنامه نویسی در هر زبانی یک برنامه ساده می سازیم. برای این کار همان طور که در مطلب قبل گفته شد باید بسته jdk بر روی سیستم شما نصب شده باشد. و همانطور که گفته شد در این مطالب نوشتن برنامه جاوا با استفاده از برنامه Intellij Idea می پردازیم. که برای ادامه کاربران باید این برنامه ها را روی سیستم خود نصب کرده باشد. ولی اگر به جای intellij Idea از برنامه دیگری مانند eclipse نیز استفاده کنید مشکلی پیش نخواهد آمد ولی برای یکپارچگی بیشتر بهتر است از این نرم افزار استفاده نمایید. حال شروع به ساخت اولین برنامه می نماییم. برای این کار از منوی File گزینه New و از آنجا گزینه Project را انتخاب کنید تا صفحه زیر انتخاب شود. 
||http://tosinso.com/files/get/0516e3dd-bc66-4508-94fe-5136684ac632||
در این صفحه همه انواع پروژه هایی که می توان ساخت آمده است. ولی برای شروع کار ما از لیست سمت چپ گزینه Java و از لیست سمت راست گزینه JavaEE  را انتخاب کرده و دکمه next را می زنیم. در قسمت بعد قالب هایی برای پروژه آورده شده است. که می توان یکی از قالب ها را برای ساخته شدن پروژه انتخاب کرد. این قالب ها شکل ساده ای دارند و بیش از چند خط کد ساده ندارند. چون می خواهیم کد را خودمان بنویسیم و کارها را خودمان انجام دهیم قالبی را انتخاب نمی کنیم و بر روی گزینه next کلیک می کنیم.  در صفحه بعد نام پروژه و محل ذخیره سازی فایل های پروژه از شما پرسیده خواهد شد. برای مثال نام پروژه را firstProject می گذاریم و بر روی دکمه Finish کلیک می کنیم.  با این کار پروژه برای ما ساخته می شوند و  محیط intellij Idea آماده برنامه نویسی خواهد شد. تصویر زیر محیط intellij بعد از ساخت پروژه firstProject را نمایش می دهد.
||http://tosinso.com/files/get/4c7e2d03-57ae-4fb7-a588-9b469541f5bd||
حال اگر از قسمت سمت در پنل project برروی نام پروژه که firstProject نام دارد کلیک کنیم محتویات آن را خواهیم دید. که یک پوشه به نام .idea دارد که برای مدیریت پروژه توسط intellij Idea ساخته می شود. پوشه دوم src نام دارد که فایل های اصلی برنامه در داخل آنها قرار می دهیم. بخش External Libraries محل نگهداری کتابخانه هایی است که در داخل برنامه از آنها استفاده می کنیم ولی خودمان آنها را نساخته ایم و از جای دیگری است. به طور مثال فایل های خود جاوا که از قبل تعریف شده است در این قسمت نمایش داده می شود. برای شروع کار باید اولین کلاس را داخل برنامه خود بسازیم. برای این کار بر روی پوشه src کلیک راست می کنیم و از منوی ظاهر شده گزینه ی New و سپس Java Class را انتخاب می کنیم. پس از این کار نام کلاس از شما پرسیده می شود. برای نام گذاری کلاس قواعد گفته شده در این مطلب و مطلب قبل باید رعایت شود. نام کلاس را FirstClass می گذاریم. با زدن دکمه ok کلاس ساخته شده و وارد محیط کدنویسی خواهیم شد. که به شکل زیر است.
||http://tosinso.com/files/get/d48bb85a-7e92-4cef-a37b-683f42b6191c||
همانطور که در شکل دیده می شود کد زیر برای شروع کار توسط برنامه تولید شده است.
<java>
Public class FirstClass{
}

<java>
این کد به این شکل است که ابتدا یک Modifier آمده است که در اینجا public است و سپس کلمه کلیدی class آمده است و سپس نامی که ما برای کلاس تغیین کردیم یعنی FirstClass آمده است. علامت {}  نشان دهنده ابتدا و انتهای کلاس می باشد. کلمات کلیدی کلماتی هستند که زبان جاوا از آنها استفاده می کند و برای آنها معنی و مفهوم خاصی قایل است. حال ما باید در داخل بدنه کلاس شروع به نوشتن کد خود بکنیم. اولین برنامه ای که می خواهیم بنویسیم این است که برنامه یک مقدار را هنگام اجرا به ما نشان دهد. برای این کار باید نقطه شروع اجرای برنامه را تعیین کنیم. همه ی برنامه های جاوا برای نقطه شروع از یک متد به نام main استفاده می کنند. پس ما هم برای این که بتوانیم برنامه خود را اجرا کنیم باید یک متد main در داخل کلاس خود ایجاد کنیم. برای این کار کد زیر را در داخل کلاس بنویسید. تاکید می کنم که برای یادگیری برنامه نویسی کدها را تایپ کنید و از کپی کردن آنها خودداری کنید.
<java>
 public static void main(String[] args){
          }

<java>
حال به شرح کد بالا می پردازیم. شکل بالا نحوه تعریف یک متد را نشان میدهد. برای تعریف یک متد ابتدا از Modifier مربوطه استفاده می کنیم.(در این تابع از public استفاده شده است.) سپس کلمه static آورده شده است که در مطالب بعدی به معرفی آن خواهیم پرداخت سپس کلمه کلیدی void  آورده شده است که یک نوع داده است و بعد از آن نام تابع آورده شده است. بعد از نام تابع یک پرانتز باز شده است و داخل آن یک آرایه با نام arg از نوع String آورده شده است. پس از آن {} برای نمایش بدنه تابع آورده شده است. دقت داشته باشید که همه بخش های گفته شده به تفصیل بعدا مورد بحث قرار خواهند گرفت. پس از آن که تابع main تعریف شد باید به نوشتن دستورات مورد نیاز در داخل آن بپردازیم. کاری که می خواهیم انجام دهیم این است که در هنگام اجرای برنامه متنی را نمایش دهیم. برای این کار باید کد زیر را داخل بدنه تابع می نویسیم:
<java>
  System.out.println(hello Itpro);
<java>
کار ما تا این قسمت تمام شد. کد کلی ما به شکل زیر خواهد بود.
<java>
public class FirstClass {
    public static void main(String[] args){
        System.out.println(hello Itpro);
    }
}

<java>
برای این که متنی را نمایش دهیم از تابع System.out.println استفاده می کنیم. دقت داشته باشید که بزرگی و کوچکی حروف باید رعایت شود. متنی که داخل دو علامت  قرار دارد متنی است که در خروجی نمایش داده می شود.در این قسمت می توانیم هر متنی بنویسیم ولی دقت کنید که باید بین دو علامت  قرار بگیرد. حال با زدن کلید f9 یا کلیک بر روی دکمه اجرا در نوار ابزار برنامه شروع به اجرا می شود. تصویر دکمه اجرا در زیر آورده شده است.
||http://tosinso.com/files/get/38ae0f57-ccd9-4e76-b43a-8fc42ecc9378||
دکمه اجرا همان دکمه مثلث سبز می باشد.
اگر برنامه را درست نوشته باشید برنامه پس از اجرا شدن خروجی را در پایین صفحه نمایش خواهد داد. که شکل آن به شکل زیر خواهد بود
||http://tosinso.com/files/get/87f4bc22-de15-462d-8465-8d480b6062e3||
همانطور که در تصویر نشان داده می شود برنامه خروجی را نمایش می دهد.
این اولین برنام جاوا بود. در مطالب بعدی به بررسی عمیق تر مفاهیم و دستورات جاوا خواهیم پرداخت. *Itpro باشید*

نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

در این صفحه همه انواع پروژه هایی که می توان ساخت آمده است. ولی برای شروع کار ما از لیست سمت چپ گزینه Java و از لیست سمت راست گزینه JavaEE را انتخاب کرده و دکمه next را می زنیم. در قسمت بعد قالب هایی برای پروژه آورده شده است.

که می توان یکی از قالب ها را برای ساخته شدن پروژه انتخاب کرد. این قالب ها شکل ساده ای دارند و بیش از چند خط کد ساده ندارند. چون می خواهیم کد را خودمان بنویسیم و کارها را خودمان انجام دهیم قالبی را انتخاب نمی کنیم و بر روی گزینه next کلیک می کنیم.

در صفحه بعد نام پروژه و محل ذخیره سازی فایل های پروژه از شما پرسیده خواهد شد. برای مثال نام پروژه را firstProject می گذاریم و بر روی دکمه Finish کلیک می کنیم. با این کار پروژه برای ما ساخته می شوند و محیط intellij Idea آماده برنامه نویسی خواهد شد. تصویر زیر محیط intellij بعد از ساخت پروژه firstProject را نمایش می دهد.

با سلام به همه دوستان و همراهان Itpro. در این مطلب قصد داریم که به ادامه معرفی جاوا بپردازیم و اصول برنامه نویسی در جاوا را شرح دهیم. هر برنامه جاوا می تواند از اشیاء و کلاس های مختلفی تشکیل شده باشد که این اشیا می توانند با فراخوانی متدهای یکدیگر با یکدیگر ارتباط داشته باشند. ابتدا به بررسی مفاهیم کلاس و متد می پردازیم.
* شیء(Obejct) اشیا ویژگی ها و رفتار های مربوط به خود را دارند. به طور مثال یک سگ ویژگی هایی دارد مانند رنگ و نژاد و اعمالی مانند خوابیدن و خوردن هم رفتارهای آن سگ  می باشد. یک شی یک نمونه از یک کلاس است.
* کلاس (Class) یک کلاس را می توان یک الگو دانست. الگویی که ویژگی ها و رفتار های هر شی که از آن کلاس ساخته شده است را شرح می دهد.
* متد(Method) یک متد در اصل یک رفتار است . یک کلاس می تواند چندین متد داشته باشد. متدها جایی هستند که منطق برنامه پیاده سازی می شود و داده ها دستکاری می شوند. و همه کارها اجرا می شوند.
* متغیرهای عضو یا فیلدها(Field) هر شی مجموعه متغیر هایی دارد که ویژگی های شی در فیلدهای آن شی نگهداری می شوند.

!!مشخص کننده های جاوا (Java Identifiers)
همه اعضای برنامه نویسی جاوا از جمله فیلد ها و متغیر ها و متدها و کلاس ها و اشیا باید نام داشته باشند. نام هایی که برای این موارد به کار میرود Identifier نام دارد. در جاوا اصولی برای Identifier ها وجود دارد که که این اصول عبارتند از:
# همه Identifier ها باید با یک حرف a-z یا A-Z یا علامت $ و یا علامت _ (زیرخط یا underline) شروع شده باشد و نمی توانیم Identifier را با عدد شروع کنیم.
# بعد از اولین کاراکتر می توان هر ترکیبی از حروف و اعداد را برای نام Identifier  به کار برد. به طور مثال کلمه a2b برای نام گذاری مناسب است ولی 9r باعث ایجاد خطا خواهد شد.
# برخی کلمات در جاوا به عنوان کلمات کلیدی تعریف شده اند. از آنها برای نام گذاری Identifier ها نمی توان استفاده کرد. مانند while یا for
# جاوا همانگونه که در مطلب قبل گفتیم به بزرگی و کوچکی حروف حساس است و این قانون در مورد Identifier ها هم صدق می کند.
# مواردی که در جاوا مجاز هستند: age, $salary, _value, __1_value می باشند.
# موارد روبرو و مشابه آن در جاوا مجاز نیستند:123 abc, -salay

!!Modifier های جاوا
مانند بسیاری از زبان های برنامه نویسی می توان ویژگی هایی برای کلاس ها و متدها و ... مشخص کرد. این کار با استفاده از Modifier ها انجام می شود. در زبان جاوا دو نوع Modifier وجود دارد.
* Modifierهای دسترسی مثل default, public, protected,private
* Modifierهای غیردسترسی مانند: final, abstract, strctfp
در بخش های آینده به توضیح Modifier ها خواهیم پرداخت.

!!متغیرهای جاوا
متغیر های موجود در جاوا سه نوع می باشد که در ادامه آمده است
# متغیر های محلی (local)
# متغیرهای کلاس (متغیر های استاتیک )
# متغیرهای عضو(فیلدها یا همان متغیرهای کلاس که استاتیک نیستند).

!!شروع برنامه نوسی در جاوا
تا این قسمت از مطالب به بررسی مطالب تئوری در مورد جاوا پرداختیم. حال از این بخش به بعد مباحث کمی عملی می شود ولی در خلال آموزش های عملی به مباحث تئوری در زمینه جاوا نیز خواهیم پرداخت. به شکل معمول برای شروع برنامه نویسی در هر زبانی یک برنامه ساده می سازیم. برای این کار همان طور که در مطلب قبل گفته شد باید بسته jdk بر روی سیستم شما نصب شده باشد. و همانطور که گفته شد در این مطالب نوشتن برنامه جاوا با استفاده از برنامه Intellij Idea می پردازیم. که برای ادامه کاربران باید این برنامه ها را روی سیستم خود نصب کرده باشد. ولی اگر به جای intellij Idea از برنامه دیگری مانند eclipse نیز استفاده کنید مشکلی پیش نخواهد آمد ولی برای یکپارچگی بیشتر بهتر است از این نرم افزار استفاده نمایید. حال شروع به ساخت اولین برنامه می نماییم. برای این کار از منوی File گزینه New و از آنجا گزینه Project را انتخاب کنید تا صفحه زیر انتخاب شود. 
||http://tosinso.com/files/get/0516e3dd-bc66-4508-94fe-5136684ac632||
در این صفحه همه انواع پروژه هایی که می توان ساخت آمده است. ولی برای شروع کار ما از لیست سمت چپ گزینه Java و از لیست سمت راست گزینه JavaEE  را انتخاب کرده و دکمه next را می زنیم. در قسمت بعد قالب هایی برای پروژه آورده شده است. که می توان یکی از قالب ها را برای ساخته شدن پروژه انتخاب کرد. این قالب ها شکل ساده ای دارند و بیش از چند خط کد ساده ندارند. چون می خواهیم کد را خودمان بنویسیم و کارها را خودمان انجام دهیم قالبی را انتخاب نمی کنیم و بر روی گزینه next کلیک می کنیم.  در صفحه بعد نام پروژه و محل ذخیره سازی فایل های پروژه از شما پرسیده خواهد شد. برای مثال نام پروژه را firstProject می گذاریم و بر روی دکمه Finish کلیک می کنیم.  با این کار پروژه برای ما ساخته می شوند و  محیط intellij Idea آماده برنامه نویسی خواهد شد. تصویر زیر محیط intellij بعد از ساخت پروژه firstProject را نمایش می دهد.
||http://tosinso.com/files/get/4c7e2d03-57ae-4fb7-a588-9b469541f5bd||
حال اگر از قسمت سمت در پنل project برروی نام پروژه که firstProject نام دارد کلیک کنیم محتویات آن را خواهیم دید. که یک پوشه به نام .idea دارد که برای مدیریت پروژه توسط intellij Idea ساخته می شود. پوشه دوم src نام دارد که فایل های اصلی برنامه در داخل آنها قرار می دهیم. بخش External Libraries محل نگهداری کتابخانه هایی است که در داخل برنامه از آنها استفاده می کنیم ولی خودمان آنها را نساخته ایم و از جای دیگری است. به طور مثال فایل های خود جاوا که از قبل تعریف شده است در این قسمت نمایش داده می شود. برای شروع کار باید اولین کلاس را داخل برنامه خود بسازیم. برای این کار بر روی پوشه src کلیک راست می کنیم و از منوی ظاهر شده گزینه ی New و سپس Java Class را انتخاب می کنیم. پس از این کار نام کلاس از شما پرسیده می شود. برای نام گذاری کلاس قواعد گفته شده در این مطلب و مطلب قبل باید رعایت شود. نام کلاس را FirstClass می گذاریم. با زدن دکمه ok کلاس ساخته شده و وارد محیط کدنویسی خواهیم شد. که به شکل زیر است.
||http://tosinso.com/files/get/d48bb85a-7e92-4cef-a37b-683f42b6191c||
همانطور که در شکل دیده می شود کد زیر برای شروع کار توسط برنامه تولید شده است.
<java>
Public class FirstClass{
}

<java>
این کد به این شکل است که ابتدا یک Modifier آمده است که در اینجا public است و سپس کلمه کلیدی class آمده است و سپس نامی که ما برای کلاس تغیین کردیم یعنی FirstClass آمده است. علامت {}  نشان دهنده ابتدا و انتهای کلاس می باشد. کلمات کلیدی کلماتی هستند که زبان جاوا از آنها استفاده می کند و برای آنها معنی و مفهوم خاصی قایل است. حال ما باید در داخل بدنه کلاس شروع به نوشتن کد خود بکنیم. اولین برنامه ای که می خواهیم بنویسیم این است که برنامه یک مقدار را هنگام اجرا به ما نشان دهد. برای این کار باید نقطه شروع اجرای برنامه را تعیین کنیم. همه ی برنامه های جاوا برای نقطه شروع از یک متد به نام main استفاده می کنند. پس ما هم برای این که بتوانیم برنامه خود را اجرا کنیم باید یک متد main در داخل کلاس خود ایجاد کنیم. برای این کار کد زیر را در داخل کلاس بنویسید. تاکید می کنم که برای یادگیری برنامه نویسی کدها را تایپ کنید و از کپی کردن آنها خودداری کنید.
<java>
 public static void main(String[] args){
          }

<java>
حال به شرح کد بالا می پردازیم. شکل بالا نحوه تعریف یک متد را نشان میدهد. برای تعریف یک متد ابتدا از Modifier مربوطه استفاده می کنیم.(در این تابع از public استفاده شده است.) سپس کلمه static آورده شده است که در مطالب بعدی به معرفی آن خواهیم پرداخت سپس کلمه کلیدی void  آورده شده است که یک نوع داده است و بعد از آن نام تابع آورده شده است. بعد از نام تابع یک پرانتز باز شده است و داخل آن یک آرایه با نام arg از نوع String آورده شده است. پس از آن {} برای نمایش بدنه تابع آورده شده است. دقت داشته باشید که همه بخش های گفته شده به تفصیل بعدا مورد بحث قرار خواهند گرفت. پس از آن که تابع main تعریف شد باید به نوشتن دستورات مورد نیاز در داخل آن بپردازیم. کاری که می خواهیم انجام دهیم این است که در هنگام اجرای برنامه متنی را نمایش دهیم. برای این کار باید کد زیر را داخل بدنه تابع می نویسیم:
<java>
  System.out.println(hello Itpro);
<java>
کار ما تا این قسمت تمام شد. کد کلی ما به شکل زیر خواهد بود.
<java>
public class FirstClass {
    public static void main(String[] args){
        System.out.println(hello Itpro);
    }
}

<java>
برای این که متنی را نمایش دهیم از تابع System.out.println استفاده می کنیم. دقت داشته باشید که بزرگی و کوچکی حروف باید رعایت شود. متنی که داخل دو علامت  قرار دارد متنی است که در خروجی نمایش داده می شود.در این قسمت می توانیم هر متنی بنویسیم ولی دقت کنید که باید بین دو علامت  قرار بگیرد. حال با زدن کلید f9 یا کلیک بر روی دکمه اجرا در نوار ابزار برنامه شروع به اجرا می شود. تصویر دکمه اجرا در زیر آورده شده است.
||http://tosinso.com/files/get/38ae0f57-ccd9-4e76-b43a-8fc42ecc9378||
دکمه اجرا همان دکمه مثلث سبز می باشد.
اگر برنامه را درست نوشته باشید برنامه پس از اجرا شدن خروجی را در پایین صفحه نمایش خواهد داد. که شکل آن به شکل زیر خواهد بود
||http://tosinso.com/files/get/87f4bc22-de15-462d-8465-8d480b6062e3||
همانطور که در تصویر نشان داده می شود برنامه خروجی را نمایش می دهد.
این اولین برنام جاوا بود. در مطالب بعدی به بررسی عمیق تر مفاهیم و دستورات جاوا خواهیم پرداخت. *Itpro باشید*

نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

حال اگر از قسمت سمت در پنل project برروی نام پروژه که firstProject نام دارد کلیک کنیم محتویات آن را خواهیم دید. که یک پوشه به نام .idea دارد که برای مدیریت پروژه توسط intellij Idea ساخته می شود. پوشه دوم src نام دارد که فایل های اصلی برنامه در داخل آنها قرار می دهیم.

بخش External Libraries محل نگهداری کتابخانه هایی است که در داخل برنامه از آنها استفاده می کنیم ولی خودمان آنها را نساخته ایم و از جای دیگری است. به طور مثال فایل های خود جاوا که از قبل تعریف شده است در این قسمت نمایش داده می شود. برای شروع کار باید اولین کلاس را داخل برنامه خود بسازیم.

برای این کار بر روی پوشه src کلیک راست می کنیم و از منوی ظاهر شده گزینه ی New و سپس Java Class را انتخاب می کنیم. پس از این کار نام کلاس از شما پرسیده می شود. برای نام گذاری کلاس قواعد گفته شده در این مطلب و مطلب قبل باید رعایت شود. نام کلاس را FirstClass می گذاریم. با زدن دکمه ok کلاس ساخته شده و وارد محیط کدنویسی خواهیم شد. که به شکل زیر است.

با سلام به همه دوستان و همراهان Itpro. در این مطلب قصد داریم که به ادامه معرفی جاوا بپردازیم و اصول برنامه نویسی در جاوا را شرح دهیم. هر برنامه جاوا می تواند از اشیاء و کلاس های مختلفی تشکیل شده باشد که این اشیا می توانند با فراخوانی متدهای یکدیگر با یکدیگر ارتباط داشته باشند. ابتدا به بررسی مفاهیم کلاس و متد می پردازیم.
* شیء(Obejct) اشیا ویژگی ها و رفتار های مربوط به خود را دارند. به طور مثال یک سگ ویژگی هایی دارد مانند رنگ و نژاد و اعمالی مانند خوابیدن و خوردن هم رفتارهای آن سگ  می باشد. یک شی یک نمونه از یک کلاس است.
* کلاس (Class) یک کلاس را می توان یک الگو دانست. الگویی که ویژگی ها و رفتار های هر شی که از آن کلاس ساخته شده است را شرح می دهد.
* متد(Method) یک متد در اصل یک رفتار است . یک کلاس می تواند چندین متد داشته باشد. متدها جایی هستند که منطق برنامه پیاده سازی می شود و داده ها دستکاری می شوند. و همه کارها اجرا می شوند.
* متغیرهای عضو یا فیلدها(Field) هر شی مجموعه متغیر هایی دارد که ویژگی های شی در فیلدهای آن شی نگهداری می شوند.

!!مشخص کننده های جاوا (Java Identifiers)
همه اعضای برنامه نویسی جاوا از جمله فیلد ها و متغیر ها و متدها و کلاس ها و اشیا باید نام داشته باشند. نام هایی که برای این موارد به کار میرود Identifier نام دارد. در جاوا اصولی برای Identifier ها وجود دارد که که این اصول عبارتند از:
# همه Identifier ها باید با یک حرف a-z یا A-Z یا علامت $ و یا علامت _ (زیرخط یا underline) شروع شده باشد و نمی توانیم Identifier را با عدد شروع کنیم.
# بعد از اولین کاراکتر می توان هر ترکیبی از حروف و اعداد را برای نام Identifier  به کار برد. به طور مثال کلمه a2b برای نام گذاری مناسب است ولی 9r باعث ایجاد خطا خواهد شد.
# برخی کلمات در جاوا به عنوان کلمات کلیدی تعریف شده اند. از آنها برای نام گذاری Identifier ها نمی توان استفاده کرد. مانند while یا for
# جاوا همانگونه که در مطلب قبل گفتیم به بزرگی و کوچکی حروف حساس است و این قانون در مورد Identifier ها هم صدق می کند.
# مواردی که در جاوا مجاز هستند: age, $salary, _value, __1_value می باشند.
# موارد روبرو و مشابه آن در جاوا مجاز نیستند:123 abc, -salay

!!Modifier های جاوا
مانند بسیاری از زبان های برنامه نویسی می توان ویژگی هایی برای کلاس ها و متدها و ... مشخص کرد. این کار با استفاده از Modifier ها انجام می شود. در زبان جاوا دو نوع Modifier وجود دارد.
* Modifierهای دسترسی مثل default, public, protected,private
* Modifierهای غیردسترسی مانند: final, abstract, strctfp
در بخش های آینده به توضیح Modifier ها خواهیم پرداخت.

!!متغیرهای جاوا
متغیر های موجود در جاوا سه نوع می باشد که در ادامه آمده است
# متغیر های محلی (local)
# متغیرهای کلاس (متغیر های استاتیک )
# متغیرهای عضو(فیلدها یا همان متغیرهای کلاس که استاتیک نیستند).

!!شروع برنامه نوسی در جاوا
تا این قسمت از مطالب به بررسی مطالب تئوری در مورد جاوا پرداختیم. حال از این بخش به بعد مباحث کمی عملی می شود ولی در خلال آموزش های عملی به مباحث تئوری در زمینه جاوا نیز خواهیم پرداخت. به شکل معمول برای شروع برنامه نویسی در هر زبانی یک برنامه ساده می سازیم. برای این کار همان طور که در مطلب قبل گفته شد باید بسته jdk بر روی سیستم شما نصب شده باشد. و همانطور که گفته شد در این مطالب نوشتن برنامه جاوا با استفاده از برنامه Intellij Idea می پردازیم. که برای ادامه کاربران باید این برنامه ها را روی سیستم خود نصب کرده باشد. ولی اگر به جای intellij Idea از برنامه دیگری مانند eclipse نیز استفاده کنید مشکلی پیش نخواهد آمد ولی برای یکپارچگی بیشتر بهتر است از این نرم افزار استفاده نمایید. حال شروع به ساخت اولین برنامه می نماییم. برای این کار از منوی File گزینه New و از آنجا گزینه Project را انتخاب کنید تا صفحه زیر انتخاب شود. 
||http://tosinso.com/files/get/0516e3dd-bc66-4508-94fe-5136684ac632||
در این صفحه همه انواع پروژه هایی که می توان ساخت آمده است. ولی برای شروع کار ما از لیست سمت چپ گزینه Java و از لیست سمت راست گزینه JavaEE  را انتخاب کرده و دکمه next را می زنیم. در قسمت بعد قالب هایی برای پروژه آورده شده است. که می توان یکی از قالب ها را برای ساخته شدن پروژه انتخاب کرد. این قالب ها شکل ساده ای دارند و بیش از چند خط کد ساده ندارند. چون می خواهیم کد را خودمان بنویسیم و کارها را خودمان انجام دهیم قالبی را انتخاب نمی کنیم و بر روی گزینه next کلیک می کنیم.  در صفحه بعد نام پروژه و محل ذخیره سازی فایل های پروژه از شما پرسیده خواهد شد. برای مثال نام پروژه را firstProject می گذاریم و بر روی دکمه Finish کلیک می کنیم.  با این کار پروژه برای ما ساخته می شوند و  محیط intellij Idea آماده برنامه نویسی خواهد شد. تصویر زیر محیط intellij بعد از ساخت پروژه firstProject را نمایش می دهد.
||http://tosinso.com/files/get/4c7e2d03-57ae-4fb7-a588-9b469541f5bd||
حال اگر از قسمت سمت در پنل project برروی نام پروژه که firstProject نام دارد کلیک کنیم محتویات آن را خواهیم دید. که یک پوشه به نام .idea دارد که برای مدیریت پروژه توسط intellij Idea ساخته می شود. پوشه دوم src نام دارد که فایل های اصلی برنامه در داخل آنها قرار می دهیم. بخش External Libraries محل نگهداری کتابخانه هایی است که در داخل برنامه از آنها استفاده می کنیم ولی خودمان آنها را نساخته ایم و از جای دیگری است. به طور مثال فایل های خود جاوا که از قبل تعریف شده است در این قسمت نمایش داده می شود. برای شروع کار باید اولین کلاس را داخل برنامه خود بسازیم. برای این کار بر روی پوشه src کلیک راست می کنیم و از منوی ظاهر شده گزینه ی New و سپس Java Class را انتخاب می کنیم. پس از این کار نام کلاس از شما پرسیده می شود. برای نام گذاری کلاس قواعد گفته شده در این مطلب و مطلب قبل باید رعایت شود. نام کلاس را FirstClass می گذاریم. با زدن دکمه ok کلاس ساخته شده و وارد محیط کدنویسی خواهیم شد. که به شکل زیر است.
||http://tosinso.com/files/get/d48bb85a-7e92-4cef-a37b-683f42b6191c||
همانطور که در شکل دیده می شود کد زیر برای شروع کار توسط برنامه تولید شده است.
<java>
Public class FirstClass{
}

<java>
این کد به این شکل است که ابتدا یک Modifier آمده است که در اینجا public است و سپس کلمه کلیدی class آمده است و سپس نامی که ما برای کلاس تغیین کردیم یعنی FirstClass آمده است. علامت {}  نشان دهنده ابتدا و انتهای کلاس می باشد. کلمات کلیدی کلماتی هستند که زبان جاوا از آنها استفاده می کند و برای آنها معنی و مفهوم خاصی قایل است. حال ما باید در داخل بدنه کلاس شروع به نوشتن کد خود بکنیم. اولین برنامه ای که می خواهیم بنویسیم این است که برنامه یک مقدار را هنگام اجرا به ما نشان دهد. برای این کار باید نقطه شروع اجرای برنامه را تعیین کنیم. همه ی برنامه های جاوا برای نقطه شروع از یک متد به نام main استفاده می کنند. پس ما هم برای این که بتوانیم برنامه خود را اجرا کنیم باید یک متد main در داخل کلاس خود ایجاد کنیم. برای این کار کد زیر را در داخل کلاس بنویسید. تاکید می کنم که برای یادگیری برنامه نویسی کدها را تایپ کنید و از کپی کردن آنها خودداری کنید.
<java>
 public static void main(String[] args){
          }

<java>
حال به شرح کد بالا می پردازیم. شکل بالا نحوه تعریف یک متد را نشان میدهد. برای تعریف یک متد ابتدا از Modifier مربوطه استفاده می کنیم.(در این تابع از public استفاده شده است.) سپس کلمه static آورده شده است که در مطالب بعدی به معرفی آن خواهیم پرداخت سپس کلمه کلیدی void  آورده شده است که یک نوع داده است و بعد از آن نام تابع آورده شده است. بعد از نام تابع یک پرانتز باز شده است و داخل آن یک آرایه با نام arg از نوع String آورده شده است. پس از آن {} برای نمایش بدنه تابع آورده شده است. دقت داشته باشید که همه بخش های گفته شده به تفصیل بعدا مورد بحث قرار خواهند گرفت. پس از آن که تابع main تعریف شد باید به نوشتن دستورات مورد نیاز در داخل آن بپردازیم. کاری که می خواهیم انجام دهیم این است که در هنگام اجرای برنامه متنی را نمایش دهیم. برای این کار باید کد زیر را داخل بدنه تابع می نویسیم:
<java>
  System.out.println(hello Itpro);
<java>
کار ما تا این قسمت تمام شد. کد کلی ما به شکل زیر خواهد بود.
<java>
public class FirstClass {
    public static void main(String[] args){
        System.out.println(hello Itpro);
    }
}

<java>
برای این که متنی را نمایش دهیم از تابع System.out.println استفاده می کنیم. دقت داشته باشید که بزرگی و کوچکی حروف باید رعایت شود. متنی که داخل دو علامت  قرار دارد متنی است که در خروجی نمایش داده می شود.در این قسمت می توانیم هر متنی بنویسیم ولی دقت کنید که باید بین دو علامت  قرار بگیرد. حال با زدن کلید f9 یا کلیک بر روی دکمه اجرا در نوار ابزار برنامه شروع به اجرا می شود. تصویر دکمه اجرا در زیر آورده شده است.
||http://tosinso.com/files/get/38ae0f57-ccd9-4e76-b43a-8fc42ecc9378||
دکمه اجرا همان دکمه مثلث سبز می باشد.
اگر برنامه را درست نوشته باشید برنامه پس از اجرا شدن خروجی را در پایین صفحه نمایش خواهد داد. که شکل آن به شکل زیر خواهد بود
||http://tosinso.com/files/get/87f4bc22-de15-462d-8465-8d480b6062e3||
همانطور که در تصویر نشان داده می شود برنامه خروجی را نمایش می دهد.
این اولین برنام جاوا بود. در مطالب بعدی به بررسی عمیق تر مفاهیم و دستورات جاوا خواهیم پرداخت. *Itpro باشید*

نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

همانطور که در شکل دیده می شود کد زیر برای شروع کار توسط برنامه تولید شده است.

Public class FirstClass{
}

این کد به این شکل است که ابتدا یک Modifier آمده است که در اینجا public است و سپس کلمه کلیدی class آمده است و سپس نامی که ما برای کلاس تغیین کردیم یعنی FirstClass آمده است. علامت {} نشان دهنده ابتدا و انتهای کلاس می باشد.

کلمات کلیدی کلماتی هستند که زبان جاوا از آنها استفاده می کند و برای آنها معنی و مفهوم خاصی قایل است. حال ما باید در داخل بدنه کلاس شروع به نوشتن کد خود بکنیم. اولین برنامه ای که می خواهیم بنویسیم این است که برنامه یک مقدار را هنگام اجرا به ما نشان دهد.

برای این کار باید نقطه شروع اجرای برنامه را تعیین کنیم. همه ی برنامه های جاوا برای نقطه شروع از یک متد به نام main استفاده می کنند. پس ما هم برای این که بتوانیم برنامه خود را اجرا کنیم باید یک متد main در داخل کلاس خود ایجاد کنیم. برای این کار کد زیر را در داخل کلاس بنویسید. تاکید می کنم که برای یادگیری برنامه نویسی کدها را تایپ کنید و از کپی کردن آنها خودداری کنید.

 public static void main(String[] args){
          }

حال به شرح کد بالا می پردازیم. شکل بالا نحوه تعریف یک متد را نشان میدهد. برای تعریف یک متد ابتدا از Modifier مربوطه استفاده می کنیم.(در این تابع از public استفاده شده است.) سپس کلمه static آورده شده است که در مطالب بعدی به معرفی آن خواهیم پرداخت سپس کلمه کلیدی void آورده شده است که یک نوع داده است و بعد از آن نام تابع آورده شده است.

بعد از نام تابع یک پرانتز باز شده است و داخل آن یک آرایه با نام arg از نوع String آورده شده است. پس از آن {} برای نمایش بدنه تابع آورده شده است. دقت داشته باشید که همه بخش های گفته شده به تفصیل بعدا مورد بحث قرار خواهند گرفت.

پس از آن که تابع main تعریف شد باید به نوشتن دستورات مورد نیاز در داخل آن بپردازیم. کاری که می خواهیم انجام دهیم این است که در هنگام اجرای برنامه متنی را نمایش دهیم. برای این کار باید کد زیر را داخل بدنه تابع می نویسیم:

  System.out.println("hello Itpro");

کار ما تا این قسمت تمام شد. کد کلی ما به شکل زیر خواهد بود.

public class FirstClass {
    public static void main(String[] args){
        System.out.println("hello Itpro");
    }
}

برای این که متنی را نمایش دهیم از تابع System.out.println استفاده می کنیم. دقت داشته باشید که بزرگی و کوچکی حروف باید رعایت شود. متنی که داخل دو علامت " قرار دارد متنی است که در خروجی نمایش داده می شود.در این قسمت می توانیم هر متنی بنویسیم ولی دقت کنید که باید بین دو علامت " قرار بگیرد. حال با زدن کلید f9 یا کلیک بر روی دکمه اجرا در نوار ابزار برنامه شروع به اجرا می شود. تصویر دکمه اجرا در زیر آورده شده است.

با سلام به همه دوستان و همراهان Itpro. در این مطلب قصد داریم که به ادامه معرفی جاوا بپردازیم و اصول برنامه نویسی در جاوا را شرح دهیم. هر برنامه جاوا می تواند از اشیاء و کلاس های مختلفی تشکیل شده باشد که این اشیا می توانند با فراخوانی متدهای یکدیگر با یکدیگر ارتباط داشته باشند. ابتدا به بررسی مفاهیم کلاس و متد می پردازیم.
* شیء(Obejct) اشیا ویژگی ها و رفتار های مربوط به خود را دارند. به طور مثال یک سگ ویژگی هایی دارد مانند رنگ و نژاد و اعمالی مانند خوابیدن و خوردن هم رفتارهای آن سگ  می باشد. یک شی یک نمونه از یک کلاس است.
* کلاس (Class) یک کلاس را می توان یک الگو دانست. الگویی که ویژگی ها و رفتار های هر شی که از آن کلاس ساخته شده است را شرح می دهد.
* متد(Method) یک متد در اصل یک رفتار است . یک کلاس می تواند چندین متد داشته باشد. متدها جایی هستند که منطق برنامه پیاده سازی می شود و داده ها دستکاری می شوند. و همه کارها اجرا می شوند.
* متغیرهای عضو یا فیلدها(Field) هر شی مجموعه متغیر هایی دارد که ویژگی های شی در فیلدهای آن شی نگهداری می شوند.

!!مشخص کننده های جاوا (Java Identifiers)
همه اعضای برنامه نویسی جاوا از جمله فیلد ها و متغیر ها و متدها و کلاس ها و اشیا باید نام داشته باشند. نام هایی که برای این موارد به کار میرود Identifier نام دارد. در جاوا اصولی برای Identifier ها وجود دارد که که این اصول عبارتند از:
# همه Identifier ها باید با یک حرف a-z یا A-Z یا علامت $ و یا علامت _ (زیرخط یا underline) شروع شده باشد و نمی توانیم Identifier را با عدد شروع کنیم.
# بعد از اولین کاراکتر می توان هر ترکیبی از حروف و اعداد را برای نام Identifier  به کار برد. به طور مثال کلمه a2b برای نام گذاری مناسب است ولی 9r باعث ایجاد خطا خواهد شد.
# برخی کلمات در جاوا به عنوان کلمات کلیدی تعریف شده اند. از آنها برای نام گذاری Identifier ها نمی توان استفاده کرد. مانند while یا for
# جاوا همانگونه که در مطلب قبل گفتیم به بزرگی و کوچکی حروف حساس است و این قانون در مورد Identifier ها هم صدق می کند.
# مواردی که در جاوا مجاز هستند: age, $salary, _value, __1_value می باشند.
# موارد روبرو و مشابه آن در جاوا مجاز نیستند:123 abc, -salay

!!Modifier های جاوا
مانند بسیاری از زبان های برنامه نویسی می توان ویژگی هایی برای کلاس ها و متدها و ... مشخص کرد. این کار با استفاده از Modifier ها انجام می شود. در زبان جاوا دو نوع Modifier وجود دارد.
* Modifierهای دسترسی مثل default, public, protected,private
* Modifierهای غیردسترسی مانند: final, abstract, strctfp
در بخش های آینده به توضیح Modifier ها خواهیم پرداخت.

!!متغیرهای جاوا
متغیر های موجود در جاوا سه نوع می باشد که در ادامه آمده است
# متغیر های محلی (local)
# متغیرهای کلاس (متغیر های استاتیک )
# متغیرهای عضو(فیلدها یا همان متغیرهای کلاس که استاتیک نیستند).

!!شروع برنامه نوسی در جاوا
تا این قسمت از مطالب به بررسی مطالب تئوری در مورد جاوا پرداختیم. حال از این بخش به بعد مباحث کمی عملی می شود ولی در خلال آموزش های عملی به مباحث تئوری در زمینه جاوا نیز خواهیم پرداخت. به شکل معمول برای شروع برنامه نویسی در هر زبانی یک برنامه ساده می سازیم. برای این کار همان طور که در مطلب قبل گفته شد باید بسته jdk بر روی سیستم شما نصب شده باشد. و همانطور که گفته شد در این مطالب نوشتن برنامه جاوا با استفاده از برنامه Intellij Idea می پردازیم. که برای ادامه کاربران باید این برنامه ها را روی سیستم خود نصب کرده باشد. ولی اگر به جای intellij Idea از برنامه دیگری مانند eclipse نیز استفاده کنید مشکلی پیش نخواهد آمد ولی برای یکپارچگی بیشتر بهتر است از این نرم افزار استفاده نمایید. حال شروع به ساخت اولین برنامه می نماییم. برای این کار از منوی File گزینه New و از آنجا گزینه Project را انتخاب کنید تا صفحه زیر انتخاب شود. 
||http://tosinso.com/files/get/0516e3dd-bc66-4508-94fe-5136684ac632||
در این صفحه همه انواع پروژه هایی که می توان ساخت آمده است. ولی برای شروع کار ما از لیست سمت چپ گزینه Java و از لیست سمت راست گزینه JavaEE  را انتخاب کرده و دکمه next را می زنیم. در قسمت بعد قالب هایی برای پروژه آورده شده است. که می توان یکی از قالب ها را برای ساخته شدن پروژه انتخاب کرد. این قالب ها شکل ساده ای دارند و بیش از چند خط کد ساده ندارند. چون می خواهیم کد را خودمان بنویسیم و کارها را خودمان انجام دهیم قالبی را انتخاب نمی کنیم و بر روی گزینه next کلیک می کنیم.  در صفحه بعد نام پروژه و محل ذخیره سازی فایل های پروژه از شما پرسیده خواهد شد. برای مثال نام پروژه را firstProject می گذاریم و بر روی دکمه Finish کلیک می کنیم.  با این کار پروژه برای ما ساخته می شوند و  محیط intellij Idea آماده برنامه نویسی خواهد شد. تصویر زیر محیط intellij بعد از ساخت پروژه firstProject را نمایش می دهد.
||http://tosinso.com/files/get/4c7e2d03-57ae-4fb7-a588-9b469541f5bd||
حال اگر از قسمت سمت در پنل project برروی نام پروژه که firstProject نام دارد کلیک کنیم محتویات آن را خواهیم دید. که یک پوشه به نام .idea دارد که برای مدیریت پروژه توسط intellij Idea ساخته می شود. پوشه دوم src نام دارد که فایل های اصلی برنامه در داخل آنها قرار می دهیم. بخش External Libraries محل نگهداری کتابخانه هایی است که در داخل برنامه از آنها استفاده می کنیم ولی خودمان آنها را نساخته ایم و از جای دیگری است. به طور مثال فایل های خود جاوا که از قبل تعریف شده است در این قسمت نمایش داده می شود. برای شروع کار باید اولین کلاس را داخل برنامه خود بسازیم. برای این کار بر روی پوشه src کلیک راست می کنیم و از منوی ظاهر شده گزینه ی New و سپس Java Class را انتخاب می کنیم. پس از این کار نام کلاس از شما پرسیده می شود. برای نام گذاری کلاس قواعد گفته شده در این مطلب و مطلب قبل باید رعایت شود. نام کلاس را FirstClass می گذاریم. با زدن دکمه ok کلاس ساخته شده و وارد محیط کدنویسی خواهیم شد. که به شکل زیر است.
||http://tosinso.com/files/get/d48bb85a-7e92-4cef-a37b-683f42b6191c||
همانطور که در شکل دیده می شود کد زیر برای شروع کار توسط برنامه تولید شده است.
<java>
Public class FirstClass{
}

<java>
این کد به این شکل است که ابتدا یک Modifier آمده است که در اینجا public است و سپس کلمه کلیدی class آمده است و سپس نامی که ما برای کلاس تغیین کردیم یعنی FirstClass آمده است. علامت {}  نشان دهنده ابتدا و انتهای کلاس می باشد. کلمات کلیدی کلماتی هستند که زبان جاوا از آنها استفاده می کند و برای آنها معنی و مفهوم خاصی قایل است. حال ما باید در داخل بدنه کلاس شروع به نوشتن کد خود بکنیم. اولین برنامه ای که می خواهیم بنویسیم این است که برنامه یک مقدار را هنگام اجرا به ما نشان دهد. برای این کار باید نقطه شروع اجرای برنامه را تعیین کنیم. همه ی برنامه های جاوا برای نقطه شروع از یک متد به نام main استفاده می کنند. پس ما هم برای این که بتوانیم برنامه خود را اجرا کنیم باید یک متد main در داخل کلاس خود ایجاد کنیم. برای این کار کد زیر را در داخل کلاس بنویسید. تاکید می کنم که برای یادگیری برنامه نویسی کدها را تایپ کنید و از کپی کردن آنها خودداری کنید.
<java>
 public static void main(String[] args){
          }

<java>
حال به شرح کد بالا می پردازیم. شکل بالا نحوه تعریف یک متد را نشان میدهد. برای تعریف یک متد ابتدا از Modifier مربوطه استفاده می کنیم.(در این تابع از public استفاده شده است.) سپس کلمه static آورده شده است که در مطالب بعدی به معرفی آن خواهیم پرداخت سپس کلمه کلیدی void  آورده شده است که یک نوع داده است و بعد از آن نام تابع آورده شده است. بعد از نام تابع یک پرانتز باز شده است و داخل آن یک آرایه با نام arg از نوع String آورده شده است. پس از آن {} برای نمایش بدنه تابع آورده شده است. دقت داشته باشید که همه بخش های گفته شده به تفصیل بعدا مورد بحث قرار خواهند گرفت. پس از آن که تابع main تعریف شد باید به نوشتن دستورات مورد نیاز در داخل آن بپردازیم. کاری که می خواهیم انجام دهیم این است که در هنگام اجرای برنامه متنی را نمایش دهیم. برای این کار باید کد زیر را داخل بدنه تابع می نویسیم:
<java>
  System.out.println(hello Itpro);
<java>
کار ما تا این قسمت تمام شد. کد کلی ما به شکل زیر خواهد بود.
<java>
public class FirstClass {
    public static void main(String[] args){
        System.out.println(hello Itpro);
    }
}

<java>
برای این که متنی را نمایش دهیم از تابع System.out.println استفاده می کنیم. دقت داشته باشید که بزرگی و کوچکی حروف باید رعایت شود. متنی که داخل دو علامت  قرار دارد متنی است که در خروجی نمایش داده می شود.در این قسمت می توانیم هر متنی بنویسیم ولی دقت کنید که باید بین دو علامت  قرار بگیرد. حال با زدن کلید f9 یا کلیک بر روی دکمه اجرا در نوار ابزار برنامه شروع به اجرا می شود. تصویر دکمه اجرا در زیر آورده شده است.
||http://tosinso.com/files/get/38ae0f57-ccd9-4e76-b43a-8fc42ecc9378||
دکمه اجرا همان دکمه مثلث سبز می باشد.
اگر برنامه را درست نوشته باشید برنامه پس از اجرا شدن خروجی را در پایین صفحه نمایش خواهد داد. که شکل آن به شکل زیر خواهد بود
||http://tosinso.com/files/get/87f4bc22-de15-462d-8465-8d480b6062e3||
همانطور که در تصویر نشان داده می شود برنامه خروجی را نمایش می دهد.
این اولین برنام جاوا بود. در مطالب بعدی به بررسی عمیق تر مفاهیم و دستورات جاوا خواهیم پرداخت. *Itpro باشید*

نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

دکمه اجرا همان دکمه مثلث سبز می باشد.اگر برنامه را درست نوشته باشید برنامه پس از اجرا شدن خروجی را در پایین صفحه نمایش خواهد داد. که شکل آن به شکل زیر خواهد بود

با سلام به همه دوستان و همراهان Itpro. در این مطلب قصد داریم که به ادامه معرفی جاوا بپردازیم و اصول برنامه نویسی در جاوا را شرح دهیم. هر برنامه جاوا می تواند از اشیاء و کلاس های مختلفی تشکیل شده باشد که این اشیا می توانند با فراخوانی متدهای یکدیگر با یکدیگر ارتباط داشته باشند. ابتدا به بررسی مفاهیم کلاس و متد می پردازیم.
* شیء(Obejct) اشیا ویژگی ها و رفتار های مربوط به خود را دارند. به طور مثال یک سگ ویژگی هایی دارد مانند رنگ و نژاد و اعمالی مانند خوابیدن و خوردن هم رفتارهای آن سگ  می باشد. یک شی یک نمونه از یک کلاس است.
* کلاس (Class) یک کلاس را می توان یک الگو دانست. الگویی که ویژگی ها و رفتار های هر شی که از آن کلاس ساخته شده است را شرح می دهد.
* متد(Method) یک متد در اصل یک رفتار است . یک کلاس می تواند چندین متد داشته باشد. متدها جایی هستند که منطق برنامه پیاده سازی می شود و داده ها دستکاری می شوند. و همه کارها اجرا می شوند.
* متغیرهای عضو یا فیلدها(Field) هر شی مجموعه متغیر هایی دارد که ویژگی های شی در فیلدهای آن شی نگهداری می شوند.

!!مشخص کننده های جاوا (Java Identifiers)
همه اعضای برنامه نویسی جاوا از جمله فیلد ها و متغیر ها و متدها و کلاس ها و اشیا باید نام داشته باشند. نام هایی که برای این موارد به کار میرود Identifier نام دارد. در جاوا اصولی برای Identifier ها وجود دارد که که این اصول عبارتند از:
# همه Identifier ها باید با یک حرف a-z یا A-Z یا علامت $ و یا علامت _ (زیرخط یا underline) شروع شده باشد و نمی توانیم Identifier را با عدد شروع کنیم.
# بعد از اولین کاراکتر می توان هر ترکیبی از حروف و اعداد را برای نام Identifier  به کار برد. به طور مثال کلمه a2b برای نام گذاری مناسب است ولی 9r باعث ایجاد خطا خواهد شد.
# برخی کلمات در جاوا به عنوان کلمات کلیدی تعریف شده اند. از آنها برای نام گذاری Identifier ها نمی توان استفاده کرد. مانند while یا for
# جاوا همانگونه که در مطلب قبل گفتیم به بزرگی و کوچکی حروف حساس است و این قانون در مورد Identifier ها هم صدق می کند.
# مواردی که در جاوا مجاز هستند: age, $salary, _value, __1_value می باشند.
# موارد روبرو و مشابه آن در جاوا مجاز نیستند:123 abc, -salay

!!Modifier های جاوا
مانند بسیاری از زبان های برنامه نویسی می توان ویژگی هایی برای کلاس ها و متدها و ... مشخص کرد. این کار با استفاده از Modifier ها انجام می شود. در زبان جاوا دو نوع Modifier وجود دارد.
* Modifierهای دسترسی مثل default, public, protected,private
* Modifierهای غیردسترسی مانند: final, abstract, strctfp
در بخش های آینده به توضیح Modifier ها خواهیم پرداخت.

!!متغیرهای جاوا
متغیر های موجود در جاوا سه نوع می باشد که در ادامه آمده است
# متغیر های محلی (local)
# متغیرهای کلاس (متغیر های استاتیک )
# متغیرهای عضو(فیلدها یا همان متغیرهای کلاس که استاتیک نیستند).

!!شروع برنامه نوسی در جاوا
تا این قسمت از مطالب به بررسی مطالب تئوری در مورد جاوا پرداختیم. حال از این بخش به بعد مباحث کمی عملی می شود ولی در خلال آموزش های عملی به مباحث تئوری در زمینه جاوا نیز خواهیم پرداخت. به شکل معمول برای شروع برنامه نویسی در هر زبانی یک برنامه ساده می سازیم. برای این کار همان طور که در مطلب قبل گفته شد باید بسته jdk بر روی سیستم شما نصب شده باشد. و همانطور که گفته شد در این مطالب نوشتن برنامه جاوا با استفاده از برنامه Intellij Idea می پردازیم. که برای ادامه کاربران باید این برنامه ها را روی سیستم خود نصب کرده باشد. ولی اگر به جای intellij Idea از برنامه دیگری مانند eclipse نیز استفاده کنید مشکلی پیش نخواهد آمد ولی برای یکپارچگی بیشتر بهتر است از این نرم افزار استفاده نمایید. حال شروع به ساخت اولین برنامه می نماییم. برای این کار از منوی File گزینه New و از آنجا گزینه Project را انتخاب کنید تا صفحه زیر انتخاب شود. 
||http://tosinso.com/files/get/0516e3dd-bc66-4508-94fe-5136684ac632||
در این صفحه همه انواع پروژه هایی که می توان ساخت آمده است. ولی برای شروع کار ما از لیست سمت چپ گزینه Java و از لیست سمت راست گزینه JavaEE  را انتخاب کرده و دکمه next را می زنیم. در قسمت بعد قالب هایی برای پروژه آورده شده است. که می توان یکی از قالب ها را برای ساخته شدن پروژه انتخاب کرد. این قالب ها شکل ساده ای دارند و بیش از چند خط کد ساده ندارند. چون می خواهیم کد را خودمان بنویسیم و کارها را خودمان انجام دهیم قالبی را انتخاب نمی کنیم و بر روی گزینه next کلیک می کنیم.  در صفحه بعد نام پروژه و محل ذخیره سازی فایل های پروژه از شما پرسیده خواهد شد. برای مثال نام پروژه را firstProject می گذاریم و بر روی دکمه Finish کلیک می کنیم.  با این کار پروژه برای ما ساخته می شوند و  محیط intellij Idea آماده برنامه نویسی خواهد شد. تصویر زیر محیط intellij بعد از ساخت پروژه firstProject را نمایش می دهد.
||http://tosinso.com/files/get/4c7e2d03-57ae-4fb7-a588-9b469541f5bd||
حال اگر از قسمت سمت در پنل project برروی نام پروژه که firstProject نام دارد کلیک کنیم محتویات آن را خواهیم دید. که یک پوشه به نام .idea دارد که برای مدیریت پروژه توسط intellij Idea ساخته می شود. پوشه دوم src نام دارد که فایل های اصلی برنامه در داخل آنها قرار می دهیم. بخش External Libraries محل نگهداری کتابخانه هایی است که در داخل برنامه از آنها استفاده می کنیم ولی خودمان آنها را نساخته ایم و از جای دیگری است. به طور مثال فایل های خود جاوا که از قبل تعریف شده است در این قسمت نمایش داده می شود. برای شروع کار باید اولین کلاس را داخل برنامه خود بسازیم. برای این کار بر روی پوشه src کلیک راست می کنیم و از منوی ظاهر شده گزینه ی New و سپس Java Class را انتخاب می کنیم. پس از این کار نام کلاس از شما پرسیده می شود. برای نام گذاری کلاس قواعد گفته شده در این مطلب و مطلب قبل باید رعایت شود. نام کلاس را FirstClass می گذاریم. با زدن دکمه ok کلاس ساخته شده و وارد محیط کدنویسی خواهیم شد. که به شکل زیر است.
||http://tosinso.com/files/get/d48bb85a-7e92-4cef-a37b-683f42b6191c||
همانطور که در شکل دیده می شود کد زیر برای شروع کار توسط برنامه تولید شده است.
<java>
Public class FirstClass{
}

<java>
این کد به این شکل است که ابتدا یک Modifier آمده است که در اینجا public است و سپس کلمه کلیدی class آمده است و سپس نامی که ما برای کلاس تغیین کردیم یعنی FirstClass آمده است. علامت {}  نشان دهنده ابتدا و انتهای کلاس می باشد. کلمات کلیدی کلماتی هستند که زبان جاوا از آنها استفاده می کند و برای آنها معنی و مفهوم خاصی قایل است. حال ما باید در داخل بدنه کلاس شروع به نوشتن کد خود بکنیم. اولین برنامه ای که می خواهیم بنویسیم این است که برنامه یک مقدار را هنگام اجرا به ما نشان دهد. برای این کار باید نقطه شروع اجرای برنامه را تعیین کنیم. همه ی برنامه های جاوا برای نقطه شروع از یک متد به نام main استفاده می کنند. پس ما هم برای این که بتوانیم برنامه خود را اجرا کنیم باید یک متد main در داخل کلاس خود ایجاد کنیم. برای این کار کد زیر را در داخل کلاس بنویسید. تاکید می کنم که برای یادگیری برنامه نویسی کدها را تایپ کنید و از کپی کردن آنها خودداری کنید.
<java>
 public static void main(String[] args){
          }

<java>
حال به شرح کد بالا می پردازیم. شکل بالا نحوه تعریف یک متد را نشان میدهد. برای تعریف یک متد ابتدا از Modifier مربوطه استفاده می کنیم.(در این تابع از public استفاده شده است.) سپس کلمه static آورده شده است که در مطالب بعدی به معرفی آن خواهیم پرداخت سپس کلمه کلیدی void  آورده شده است که یک نوع داده است و بعد از آن نام تابع آورده شده است. بعد از نام تابع یک پرانتز باز شده است و داخل آن یک آرایه با نام arg از نوع String آورده شده است. پس از آن {} برای نمایش بدنه تابع آورده شده است. دقت داشته باشید که همه بخش های گفته شده به تفصیل بعدا مورد بحث قرار خواهند گرفت. پس از آن که تابع main تعریف شد باید به نوشتن دستورات مورد نیاز در داخل آن بپردازیم. کاری که می خواهیم انجام دهیم این است که در هنگام اجرای برنامه متنی را نمایش دهیم. برای این کار باید کد زیر را داخل بدنه تابع می نویسیم:
<java>
  System.out.println(hello Itpro);
<java>
کار ما تا این قسمت تمام شد. کد کلی ما به شکل زیر خواهد بود.
<java>
public class FirstClass {
    public static void main(String[] args){
        System.out.println(hello Itpro);
    }
}

<java>
برای این که متنی را نمایش دهیم از تابع System.out.println استفاده می کنیم. دقت داشته باشید که بزرگی و کوچکی حروف باید رعایت شود. متنی که داخل دو علامت  قرار دارد متنی است که در خروجی نمایش داده می شود.در این قسمت می توانیم هر متنی بنویسیم ولی دقت کنید که باید بین دو علامت  قرار بگیرد. حال با زدن کلید f9 یا کلیک بر روی دکمه اجرا در نوار ابزار برنامه شروع به اجرا می شود. تصویر دکمه اجرا در زیر آورده شده است.
||http://tosinso.com/files/get/38ae0f57-ccd9-4e76-b43a-8fc42ecc9378||
دکمه اجرا همان دکمه مثلث سبز می باشد.
اگر برنامه را درست نوشته باشید برنامه پس از اجرا شدن خروجی را در پایین صفحه نمایش خواهد داد. که شکل آن به شکل زیر خواهد بود
||http://tosinso.com/files/get/87f4bc22-de15-462d-8465-8d480b6062e3||
همانطور که در تصویر نشان داده می شود برنامه خروجی را نمایش می دهد.
این اولین برنام جاوا بود. در مطالب بعدی به بررسی عمیق تر مفاهیم و دستورات جاوا خواهیم پرداخت. *Itpro باشید*

نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

همانطور که در تصویر نشان داده می شود برنامه خروجی را نمایش می دهد.این اولین برنام جاوا بود. در مطالب بعدی به بررسی عمیق تر مفاهیم و دستورات جاوا خواهیم پرداخت

شی گرایی قسمت دو

در ادامه مباحث جاوا به ادامه مفاهیم در مورد جاوا خواهیم پرداخت.

چه کلمات کلیدی در جاوا وجود دارد؟

تصویر زیر لیستی از کلمات رزرو شده در جاوا را نشان می دهد. این کلمات رزرو شده برای استفاده به عنوان متغیر و یا سایر Identifier ها مورد استفاده قرار گیرد.

با سلام به همه دوستان و همراهان Itpro.ir.در ادامه مباحث جاوا به ادامه مفاهیم در مورد جاوا خواهیم پرداخت.

!! کلمات کلیدی در جاوا
تصویر زیر لیستی از کلمات رزرو شده در جاوا را نشان می دهد. این کلمات رزرو شده برای استفاده به عنوان متغیر و یا سایر Identifier ها مورد استفاده قرار گیرد.
||http://tosinso.com/files/get/afb821fb-6587-4a02-b926-625989554569||

!!توضیحات در جاوا
در زبان جاوا امکانی وجود دارد که در داخل کد جملاتی برای توضیحات قرار داده شود. این توضیحات می تواند برای فهم بهتر کد مناسب باشد. جاوا هم از توضیحات یک خطی و هم از توضیحات چند خطی پشتیبانی می کند. توضیحات در جاوا بسیار شبیه به توضیحات در زبان های c , c++ می باشد. همه عباراتی که در داخل توضیحات نوشته شود قابلیت کد و اجرا ندارد و کامپایلر جاوا آنها را نادیده خواهد گرفت. در کد زیر توضیحات یک خطی و چند خطی آورده شده است.
<java>
public class MyFirstJavaProgram{

   /* This is my first java program.
    * This will print 'Hello World' as the output
    * This is an example of multi-line comments.
    */

    public static void main(String []args){
       // This is an example of single line comment
       /* This is also an example of single line comment. */
       System.out.println(Hello World); 
    }
} 

<java>
همانطور که در کد بالا نشان داده شده است اگر در قسمت از کد از دو کاراکتر // استفاده شود مابقی آن خط به عنوان توضیحات در نظر گرفته می شود. همچنین برای شروع توضیحات چند خطی از علامت اسلش و ستاره */ و برای پایان توضیحات چند خطی از ستاره و اسلش /* استفاده می شود.

!!آرایه ها در جاوا
آرایه ها اشیائی هستند که چند متغیر از یک نوع را در خود ذخیره می‌کنند. اما خود آرایه به تنهایی یک شئ محسوب می‌شود. و مهم نیست که چند متغیر در داخل آن قرار دارند.

!!Enum
enum ها در نسخه ۵ جاوا معرفی شدند. Enum ها یک متغیر را محدود می‌کنند تا فقط از مقادیری که قبلاً تعریف شده است استفاده کند و نتوان به آن مقداری دیگر داد. با استفاده از enum ها می‌توان احتمال بروز خطا در کد را کاهش داد. برای مثال اگر ما یک برنامه برای آبمیوه فروشی نوشته باشیم ممکن است که ازما خواسته شود که اندازه لیوان های موجود را فقط به اندازه های کوچک و متوسط و بزرگ بگیریم. این باعث می‌شود که مشتری‌ها نتوانند هر اندازه‌ای که دلخواه آن‌ها بود را انتخاب کنند و سفارش دهند و فقط اندازه های کوچک و متوسط و بزرگ را سفارش دهند. برای مثال به کد زیر دقت کنید.
<java>
class FreshJuice {

   enum FreshJuiceSize{ SMALL, MEDIUM, LARGE }
   FreshJuiceSize size;
}

public class FreshJuiceTest {

   public static void main(String args[]){
      FreshJuice juice = new FreshJuice();
      juice.size = FreshJuice.FreshJuiceSize.MEDIUM ;
      System.out.println(Size:  + juice.size);
   }
}

<java>
ما در کد بالاا یک کلاس به نام FreshJuice تعریف کرده ایم که داخل آن یک enum به نام FreshJuiceSize تعریف کرده ایم و همچنین یک شی از این enum در داخل کلاس به عنوان فیلد کلاس تعریف کرده ایم. و در داخل تابع main یک شی از کلاس FreshJuice تعریف کرده ایم و مقدار فیلد size آن را برابر  FreshJuice.FreshJuiceSize.MEDIUM قرار داده ایم. در انتها این فیلد size را در خروجی چاپ می کنیم.
خروجی کد بالا به شکل زیر خواهد بود.
<text>
Size: MEDIUM
<<text
دقت داشته باشید که enum ها می توانند خودشان به تنهایی و یا در داخل کلاس دیگری تعریف شوند. 

!!مفاهیم شی گرایی
تا این قسمت از برنامه بیشتر به مفاهیم جاوا پرداخته شد. از این بخش به بعد کمی به مباحث شی گرایی در جاوا خواهیم پرداخت. جاوا یک زبان کاملا شی گرا می باشد. جاوا مفاهیم اصلی زیر را پشتیبانی می نماید.
# چندریختی polymorphism
# وراثت Inheritance
# کپسوله سازی Encapsulation
# انتزاع Abstraction
# کلاس ها Classes
# اشیا Objects
# نمونه ها Instances
# متدها

!!وراثت
در جاوا کلاس ها می توانند از کلاس های دیگر مشتق شوند و از کلاس های دیگر گرفته شود. در اصل اگر شما قصد داشته باشید که کلاس جدیدی ایجاد کنید و از قبل کلاسی وجود داشته باشد که کد آن به شکلی است که قسمتی از کد شما همان کلاس است به عبارت دیگر شما قصد دارید که آن کلاس را گسترش دهید و به ویژگی های آن اضافه کنید. برای این کار به جای این که کلاس جدیدی را از اول بنویسید می توانید این کلاس را از کلاسی که وجود دارد و بسیاری از ویژگی های این کلاس را دارا می باشد مشتق کنید. این مفهوم به شما این امکان را می دهد که از کدی که قبلا دارید بتوانید به طور مجدد استفاده کنید بدون این که کد تکراری بنویسیم و از کدهایی که قبلا وجود داشته استفاده کنیم و فقط کدهای جدید را بنویسیم. در این مفهوم به کلاسی که قبلا وجود داشته باشد کلاس پدر و یا super class می گویند و به کلاس هایی که مشتق شده اند کلاس فرزند یا subclass می گویند.

!!اینترفیس ها Interface
در زبان جاوا اینترفیس یک قرار داد بین اشیا است که چگونه با یکدیگر ارتباط داشته باشند. وقتی که بحث وراثت پیش می آید اینترفیس یک نقش بسیار مهم دارد. یک اینترفیس متدها را تعریف می کند و کلاس های مشتق شده باید از این قانون تبعیت کند. در اینترفیس فقط نام و نوع متدها مشخص می شود ولی هیچ گونه پیاده سازی انجام نمی شود و همه پیاده سازی ها در سمت کلاس فرزند انجام می شود. 

!!اشیاء در جاوا
در این بخش به طور عمیق اشیا را بررسی می کنیم. اگر بخواهیم دنیای واقعی را مثال بزنیم می توانیم اشیائی را در دنیای اطرافمان پیدا کنیم. انسانها و ماشین ها و حیوانات و ... همه اشیا هستند. همه ی این اشیا دارای ویژگی ها و رفتارهایی هستند. یک سگ ویژگی هایی مانند رنگ و نژاد و وزن دارد و رفتارهایی مانند خوردن و خوابیدن و واق واق کردن و دویدن دارد. اگر بخواهیم اشیا در برنامه نویسی را با اشیا در دنیای واقعی بررسی کنیم بسیار شبیه به هم هستند. اشیا در برنامه نویسی نیز دارای ویژگی ها و رفتارهایی می باشند. یک شی نرم افزاری ویژگی هایش را در فیلدها ذخیره می کند و رفتارهایش در قالب متدها نشان داده می شوند. پس در توسعه نرم افزار متد ها بر روی ویژگی های داخلی شی کار می کنند و همچنین ارتباط بین اشیا نیز با استفاده از متدها انجام خواهد شد. در بخش های آینده به ادامه بررسی مباحث شی گرایی می پردازیم و زبان جاوا را به مرور شرح خواهیم داد. *Itpro باشید*

نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

در زبان جاوا امکانی وجود دارد که در داخل کد جملاتی برای توضیحات قرار داده شود. این توضیحات می تواند برای فهم بهتر کد مناسب باشد. جاوا هم از توضیحات یک خطی و هم از توضیحات چند خطی پشتیبانی می کند. توضیحات در جاوا بسیار شبیه به توضیحات در زبان های c , c++ می باشد. همه عباراتی که در داخل توضیحات نوشته شود قابلیت کد و اجرا ندارد و کامپایلر جاوا آنها را نادیده خواهد گرفت. در کد زیر توضیحات یک خطی و چند خطی آورده شده است.

public class MyFirstJavaProgram{

   /* This is my first java program.
    * This will print 'Hello World' as the output
    * This is an example of multi-line comments.
    */

    public static void main(String []args){
       // This is an example of single line comment
       /* This is also an example of single line comment. */
       System.out.println("Hello World"); 
    }
} 

همانطور که در کد بالا نشان داده شده است اگر در قسمت از کد از دو کاراکتر // استفاده شود مابقی آن خط به عنوان توضیحات در نظر گرفته می شود. همچنین برای شروع توضیحات چند خطی از علامت اسلش و ستاره و برای پایان توضیحات چند خطی از ستاره و اسلش استفاده می شود.

آرایه در جاوا چیست؟

آرایه ها اشیائی هستند که چند متغیر از یک نوع را در خود ذخیره می‌کنند. اما خود آرایه به تنهایی یک شئ محسوب می‌شود. و مهم نیست که چند متغیر در داخل آن قرار دارند.

Enum چیست؟

enum ها در نسخه ۵ جاوا معرفی شدند. Enum ها یک متغیر را محدود می‌کنند تا فقط از مقادیری که قبلاً تعریف شده است استفاده کند و نتوان به آن مقداری دیگر داد. با استفاده از enum ها می‌توان احتمال بروز خطا در کد را کاهش داد. برای مثال اگر ما یک برنامه برای آبمیوه فروشی نوشته باشیم ممکن است

که ازما خواسته شود که اندازه لیوان های موجود را فقط به اندازه های کوچک و متوسط و بزرگ بگیریم. این باعث می‌شود که مشتری‌ها نتوانند هر اندازه‌ای که دلخواه آن‌ها بود را انتخاب کنند و سفارش دهند و فقط اندازه های کوچک و متوسط و بزرگ را سفارش دهند. برای مثال به کد زیر دقت کنید.

class FreshJuice {

   enum FreshJuiceSize{ SMALL, MEDIUM, LARGE }
   FreshJuiceSize size;
}

public class FreshJuiceTest {

   public static void main(String args[]){
      FreshJuice juice = new FreshJuice();
      juice.size = FreshJuice.FreshJuiceSize.MEDIUM ;
      System.out.println("Size: " + juice.size);
   }
}

ما در کد بالاا یک کلاس به نام FreshJuice تعریف کرده ایم که داخل آن یک enum به نام FreshJuiceSize تعریف کرده ایم و همچنین یک شی از این enum در داخل کلاس به عنوان فیلد کلاس تعریف کرده ایم. و در داخل تابع main یک شی از کلاس FreshJuice تعریف کرده ایم و مقدار فیلد size آن را برابر FreshJuice.FreshJuiceSize.MEDIUM قرار داده ایم. در انتها این فیلد size را در خروجی چاپ می کنیم.خروجی کد بالا به شکل زیر خواهد بود.

Size: MEDIUM

دقت داشته باشید که enum ها می توانند خودشان به تنهایی و یا در داخل کلاس دیگری تعریف شوند.

معرفی 8 مفهوم در برنامه نویسی شی گرا در جاوا

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

  1. چندریختی polymorphism
  2. وراثت Inheritance
  3. کپسوله سازی Encapsulation
  4. انتزاع Abstraction
  5. کلاس ها Classes
  6. اشیا Objects
  7. نمونه ها Instances
  8. متدها

وراثت چیست؟

در جاوا کلاس ها می توانند از کلاس های دیگر مشتق شوند و از کلاس های دیگر گرفته شود. در اصل اگر شما قصد داشته باشید که کلاس جدیدی ایجاد کنید و از قبل کلاسی وجود داشته باشد که کد آن به شکلی است که قسمتی از کد شما همان کلاس است به عبارت دیگر شما قصد دارید که آن کلاس را گسترش دهید و به ویژگی های آن اضافه کنید.

برای این کار به جای این که کلاس جدیدی را از اول بنویسید می توانید این کلاس را از کلاسی که وجود دارد و بسیاری از ویژگی های این کلاس را دارا می باشد مشتق کنید. این مفهوم به شما این امکان را می دهد که از کدی که قبلا دارید بتوانید به طور مجدد استفاده کنید بدون این که کد تکراری بنویسیم و از کدهایی که قبلا وجود داشته استفاده کنیم و فقط کدهای جدید را بنویسیم. در این مفهوم به کلاسی که قبلا وجود داشته باشد کلاس پدر و یا super class می گویند و به کلاس هایی که مشتق شده اند کلاس فرزند یا subclass می گویند.

اینترفیس Interface در جاوا چیست؟

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

بررسی مفهوم شی | Object در جاوا

در این بخش به طور عمیق اشیا را بررسی می کنیم. اگر بخواهیم دنیای واقعی را مثال بزنیم می توانیم اشیائی را در دنیای اطرافمان پیدا کنیم. انسانها و ماشین ها و حیوانات و ... همه اشیا هستند. همه ی این اشیا دارای ویژگی ها و رفتارهایی هستند.

یک سگ ویژگی هایی مانند رنگ و نژاد و وزن دارد و رفتارهایی مانند خوردن و خوابیدن و واق واق کردن و دویدن دارد. اگر بخواهیم اشیا در برنامه نویسی را با اشیا در دنیای واقعی بررسی کنیم بسیار شبیه به هم هستند. اشیا در برنامه نویسی نیز دارای ویژگی ها و رفتارهایی می باشند. یک شی نرم افزاری ویژگی هایش را در فیلدها ذخیره می کند و رفتارهایش در قالب متدها نشان داده می شوند.

پس در توسعه نرم افزار متد ها بر روی ویژگی های داخلی شی کار می کنند و همچنین ارتباط بین اشیا نیز با استفاده از متدها انجام خواهد شد. در بخش های آینده به ادامه بررسی مباحث شی گرایی می پردازیم و زبان جاوا را به مرور شرح خواهیم داد

شی گرایی قسمت سه

در ادامه مباحث زبان جاوا به بررسی شی گرایی در این زبان می پردازیم.

کلاس ها در جاوا

یک کلاس یک قالب برای اشیائی است که از آن ساخته می شود. به این معنی که کلاس مشخص می کند که شیئی که از این کلاس ساخته می شود باید چه ویژگی ها و چه رفتار هایی داشته باشد. همه اشیا از کلاس ها ساخته می شوند. در شکل زیر یک نمونه از کلاس را مشاهده می کنید.

public class Dog{
   int ageC
   String color;

   void barking(){
   }
   
   void hungry(){
   }
   
   void sleeping(){
   }
}

یک کلاس می تواند هرکدام از موارد زیر را داشته باشد.

  1. متغیر محلی: متغیری است که در داخل متدها و یا سازنده(constructor) ها و یا بلوک ها تعریف می شود. این متغیر ها در داخل متد و یا constructor و یا داخل یک بلوک کد تعریف می شوند و مورد استفاده قرار می گیرند و هنگامی که به پایان متد یا constructor رسیدیم از حافظه پاک خواهند شد.
  2. متغیر های عضو: متغیرهای نمونه متغیرهایی داخل کلاس هستند ولی داخل هیچ متد و یا بلوکی نیستند و بیرون از همه بلوک های موجود هستند. این متغیرها وقتی که از کلاس شی ساخته شد مقدار دهی می شوند. متغیرهای عضو از داخل همه ی متدها و constructor ها و بلوک های کلاس قابل دسترسی هستند.
  3. متغیر های کلاس: متغیرهایی هستند که در داخل کلاس تعریف شده اند ولی داخل هیچ متد یا بلوکی نیستند و داخل خود کلاس هستند. تفاوت این متغیر ها با متغیرهای عضو این است که این متغیر ها به صورت Static تعریف شده اند. یعنی برای تعریف آنها از به همراه نوع آنها از کلمه کلیدی static نیز استفاده شده است.

یک کلاس می تواند هر تعداد متد داشته باشد که می تواند به متغیرهای گفته شده دسترسی داشته باشد و متدهای دیگر را فراخوانی کند. در مثال بالا sleeping و hungry و barking به عنوان متد شناخته می شود. موارد مهمی که در باره ی کلاس ها وجود دارند در ادامه آورده شده اند.

Constructor چیست؟

وقتی درباره ی کلاس ها بحث می شود یکی از مهمترین موضوعات در باره ی constructor ها خواهد بود. هر کلاس حداقل یک constructor دارد. اگر ما از خودمان برای کلاس یک constructor تعریف نکنیم کامپایلر جاوا به صورت پیشفرض برای کلاس یک constructor می سازد.

هر وقت که یک شی جدید از کلاس ساخته می شود حداقل یکی از constructor ها فراخوانی خواهد شد. قانون اصلی برای تعریف constructor ها به این شکل است که constructorها توابعی هستند که همنام کلاس هستند و نوع بازگشتی برای آنان تعریف نمی شود. یک کلاس می تواند بیش از یک constructor داشته باشد. کد زیر یک نمونه از constructor ها را نشان می دهد.

public class Puppy{
   public Puppy(){
   }

   public Puppy(String name){
      // This constructor has one parameter, name.
   }
}

آموزش ساخت شیء در جاوا

همانگونه که قبلا نیز گفتیم یک کلاس یک قالب است و یک شی از یک کلاس ساخته می شود. در جاوا ما با استفاده از کلمه کلیدی new شی خود را از کلاس می سازیم. سه مرحله برای ساخت یک شی از کلاس وجود دارد که به شکل زیر است.

  1. تعریف متغیر در این مرحله یک متغیر را از نوع همان کلاسی که می خواهیم از آن شی بسازیم تعریف می کنیم
  2. نمونه سازی با استفاده از کلمه کلیدی new یک نمونه جدید ایجاد می شود.
  3. مقدار دهی اولیه وقتی با استفاده از کلمه کلیدی new شی جدیدی ساخته می‌شود constructor فراخوانی می‌شود و این به معنی مقداردهی شی ساخته شده است.

نمونه‌هایی از ساخت شی جدید در کد زیر آمده است.

public class Puppy{

   public Puppy(String name){
      // This constructor has one parameter, name.
      System.out.println("Passed Name is :" + name ); 
   }
   
   public static void main(String []args){
      // Following statement would create an object myPuppy
      Puppy myPuppy = new Puppy( "tommy" );
   }
}

همانطور که در کد مشاهده می‌کنید کلاسی به نام Puppy داریم که یک سازنده دارد. سازنده دارای یک آرگومان ورودی از نوع String می باشد.constructor مقدار ورودی را در صفحه چاپ می‌کند. در داخل تابع main با استفاده از کلمه کلیدی new یک شی جدید ساخته شده است و به عنوان ورودی نام tommy را برای آن قرار داده است. اگر برنامه فوق را اجرا کنیم خروجی آن به شکل زیر خواهد بود.

Passed Name is :tommy

دسترسی به متدها و متغیرهای عضو

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

/* First create an object */
ObjectReference = new Constructor();

ObjectReference.variableName;

ObjectReference.MethodName();

طبق کد ابتدا باید یک شی جدید بسازیم سپس با استفاده از عملگر نقطه . به اعضای آن دسترسی داشت. برای مثال به مثال زیر دقت کنید.

public class ItPro {

    String url;

    public ItPro(String name){
        // This constructor has one parameter, name.
        System.out.println("Url chosen is :" + name );
    }

    public void setUrl( String webUrl ){
        url = webUrl;
    }

    public String getUrl( ){
        System.out.println("website url is :" + url);
        return url;
    }

    public static void main(String []args){
     
        ItPro webAddress = new ItPro( "tosinso.com" );

 
        webAddress.setUrl("programming.tosinso.com");

     
        webAddress.getUrl();

     
        System.out.println("Variable Value :" + webAddress.url);
    }
}

در این برنامه یک کلاس ItPro داریم که یک فیلد به نام url دارد و متدهایی به نام getUrl و setUrl دارد. که در طی برنامه از آن استفاده شده است. حال اگر کد بالا را اجرا کنیم خروجی به شکل زیر خواهد شد.

Url chosen is :tosinso.com
website url is :programming.tosinso.com
Variable Value :programming.tosinso.com

قوانین تعریف فایل های سورس

در این بخش به معرفی قوانین فایل های سورس می پردازیم:

  • در هر فایل سورس باید یک کلاس از نوع public وجود داشته باشد.
  • یک فایل سورس می تواند چند کلاس غیر public داشته باشد.
  • نام کلاس public باید با نام فایل سورس یکی باشد. پسوند فایل های سورس .java است. برای مثال در کد بالا باید نام فایل ItPro.java باشد.
  • اگر کلاس داخل یک پکیج ساخته شده باشد باید نام پکیج در خط اول فایل سورس باشد.
  • عبارات import باید بین خط پکیج و کلاس باشد. برای یک فایل سورس نمی شود که برای هر کلاس به طور جداگانه عبارت import نوشت. عبارات import برای اضافه کردن کتابخانه های مختلف به داخل برنامه به کار می روند.

کلاس چندین سطح دسترسی دارند و انواع کلاس های متفاوتی وجود دارد مانند کلاس های final و کلاس های abstract و ... که در بخش های بعدی هرکدام از این نوع ها را شرح خواهیم داد.

معرفی پکیج های جاوا

اگر بخواهیم اینترفیس ها و کلاس های جاوا را در زمان برنامه نویسی دسته بندی کنیم. در پروژه های بزرگ ممکن است که صدها کلاس در پروژه ما وجود داشته باشد که بدون دسته بندی بسیار نامنظم خواهد بود. بنابراین باید این فایل ها را با استفاده از پکیج ها دسته بندی کرد.

کاربرد عبارات import

در جاوا اگر بخواهیم از کتابخانه ای استفاده کنیم باید نام کامل آن کتابخانه را به همراه همه ی پکیج ها و کلاس آن بنویسیم که ممکن است طول خط کدهای ما را بسیار طولانی کند و کدنویسی خسته کننده شود. عبارات import به ما کمک می کند که کد خود را کوتاهتر کنیم. همچنین به کامپایلر می گوید که در کدام کتابخانه باید به دنبال کلاس مربوطه بگردد. برای مثال خط کد زیر به کامپایلر می گوید که همه کلاس های قسمت java/io را لود کند. که این پوشه ها در محل نصب جاوا وجود دارد.

import java.io.*;

تا به این قسمت از مطالب به معرفی تئوری زبان جاوا پرداختیم در قسمت های بعد بیشتر وارد کد و مباحث فنی زبان جاوا خواهیم شد و مباحث گفته شده را به کار خواهیم گرفت

انواع داده

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

با توجه به نوع داده ای که شما از آن متغیر می سازید سیستم عامل مقدار خاصی فضا به شما اختصاص می دهد. همچنین با استفاده از نوع داده مشخص شده تصمیم گرفته می شود که در محل مورد نظر از حافظه چه مقادیری ذخیره شود.

بنابراین انواع داده در زبان جاوا بسیار مهم هستند. یکی از دلایل این انواع داده این است که اگر شما یک متغیر معرفی کرده باشید که فقط در آن عدد صحیح ذخیره کنید به شما این اجازه داده نمی شود که بتوانید در آن متغیر متن یا زمان ذخیره کنید. انواع داده دو دسته هستند که در ادامه آمده اند.

  1. نوع داده اصلی
  2. نوع داده ارجاعی یا شیئی

معرفی انواع داده های اصلی در جاوا

در زبان جاوا 8 نوع داده اصلی وجود دارد. انواع داده اصلی در زبان جاوا از قبل تعریف شده اند و قابل گسترش نیستند. به عبارت دیگر انواع داده اصلی به عنوان پایه انواع داده های دیگر می باشد. انواع داده اصلی دارای نام هایی هستند که این نام ها جزء کلمات کلیدی است. در ادامه به معرفی این انواع داده می پردازیم و آنها را شرح خواهیم داد.

معرفی نوع داده byte

نوع داده byte دارای خواص زیر است.

  • نوع داده byte 8 بیت حافظه لازم دارد
  • فقط می توان عدد بدون ممیز در این نوع داده ذخیره کرد
  • این نوع داده کوچکترین عددی را که می تواند در خود نگه دارد -128 است
  • بزرگترین عددی که این نوع داده می تواند در خود نگه دارد 127 می باشد.
  • مقدار پیشفرض این نوع داده 0 است. به این معنی که وقتی که یک متغیر از نوع byte تعریف می کنیم کامپایلر مقدار آن را 0 قرار می دهد.
  • اگر اعداد شما در برنامه نویسی زیاد بزرگ نیست و از ممیز هم استفاده نمی کنید می توانید از این نوع داده استفاده کنید زیرا که در حافظه صرفه جویی می کند. زیرا این نوع داده یک چهارم نوع داده int فضا لازم دارد. کد زیر مثالی از تعریف متغیر از نوع داده byte است.
byte a=100;
byte b=-43;

معرفی نوع داده short

این نوع داده اعداد بدون ممیز را در خود نگهداری می نماید.

  • نوع داده short یک نوع داده علامت دار 16 بیتی است.
  • کوچکترین مقداری که این نوع داده می تواند در خود نگهداری نماید -32768 می باشد.
  • بزرگترین مقداری که این نوع داده می تواند در خود نگهداری نماید 32767 می باشد.
  • مقدار پیشفرض این نوع داده 0 است.
  • حافظه مصرفی این نوع داده نصف نوع داده int است.

مثال تعریف متغیر از نوع short :

short s=10000;
short r=-3400

معرفی نوع داده int

  • نوع داده int یک نوع داده عددی علامت داره 32 بیتی است.
  • کوچکترین عددی که این نوع داده می تواند در خود نگهداری نماید -2147483648 می باشد.
  • بزرگترین عددی که این نوع داده می تواند در خود نگهداری کند 2147483647 می باشد.
  • عموما برای متغیرهای اعداد صحیح از این نوع داده استفاده می شود ولی برای استفاده بهینه تر از حافظه می توان از انواع داده قبلی هم استفاده کرد. ولی امروزه به علت بالا بودن حجم حافظه ها صرفه جویی در حافظه مسئله حادی نیست.
  • مقدار پیشفرض این نوع داده 0 است.

در زیر مثالی از این نوع داده آورده شده است:

int m=60;
int c=-200000;
int h=800000;

معرفی نوع داده long

  • نوع داده long یک نوع داده برای نگهداری اعداد صحیح علامت دار است که 64 بیت حافظه اشغال می کند.
  • کوچکترین عددی که این نوع داده می تواند در خود نگهداری کند -9223372036854775808 است
  • بزرگترین عددی که این نوع داده می تواند در خود نگهداری کند عدد 9223372036854775807 می باشد.
  • این نوع داده زمانی استفاده می شود که بخواهیم با اعداد صحیح بسیار بزرگ کار کنیم.
  • مقدار پیشفرض این نوع داده 0L است.

در زیر مثالی از این نوع داده آورده شده است.

long a=1000000L;

معرفی نوع داده float

  • نوع داده float برای نگهداری اعداد ممیز دار با 32بیت است.
  • این نوع داده بر اساس استاندارد ممیز شناور IEEE 754 کار می کند.
  • مقدار پیشفرض این نوع داده 0.0f است
  • این نوع داده برای جاهایی که دقت بسیار مهم است مورد استفاده قرار نمی گیرد. مثلا برای نگهداشتن واحدهای پولی از این نوع داده استفاده نمی شود چون دقیق نیست.

مثال تعریف متغیر از این نوع داده به شکل زیر است:

float f1=234.5f;

معرفی نوع داده double

  • این نوع داده یک نوع داده 64 بیتی دقیق است.
  • این نوع داده از استاندارد ممیز شناور IEEE 754 استفاده می کند.
  • این نوع داده نوع داده پیشفرض برای اعداد ممیزی می باشد.
  • این نوع داده با این که از float دقیق تر است ولی هنوز خطا دارد و نباید برای مقادیر پولی مورد استفاده قرار گیرد.
  • مقدار پیش فرض این نوع داده 0.0d می باشد.

مثال این نوع داده در کد زیر آمده است.

doubel d1=123.4;

معرفی نوع داده boolean

  • این نوع داده فقط دو مقدار به خود میگیرد true,false
  • این نوع فقط برای نگهداری نتایج عبارات شرطی مورد استفاده قرار می گیرد.
  • مقدار پیشفرض این نوع داده false است.

مثالی از تعریف متغیر از این نوع داده در کد زیر آمده است.

boolean one=true;

معرفی نوع داده char

  • این نوع داده برای نگهداری کاراکتر های یونیکد می باشد.
  • این نوع داده 16بیت فضا از حافظه برای خود می گیرد.

مثالی از این نوع داده به شکل زیر است:

char letter='a';

معرفی نوع داده انواع داده ارجاعی

  • انواع داده های ارجاعی از کلاس های تعریف شده ساخته می شوند. متغیرهایی که از این نوع ساخته می شوند برای دسترسی به اشیا ساخته شده از کلاس هستند.
  • آرایه ها و اشیا از این نوع هستند و در دسته انواع داده ارجاعی قرار میگیرند.
  • مقدار پیشفرض این نوع داده ها null است.
  • یک متغیر از نوع ارجاعی می تواند به هر نوعی که با نوع خودش سازگار باشد انتساب داشته باشد.

مثالی از این نوع داده در کد زیر آمده است.

Animal anim=new Animal("rabbit");

بررسی مفهوم لیترال ها در جاوا

لیترال قسمتی از کد است که برای نشان دادن مقادیر ثابت به کار می رود. مثلا این که چگونه یک عدد یا کاراکتر را در داخل کد نشان بدهیم. لیترال ها می توانند به طور مستقیم به هر متغیر از نوع داده اصلی انتساب داده شوند. برای مثال به کد زیر توجه کنید.

byte a = 68;
char a = 'A'

انواع داده byte, int, short می توانند با مقادیر دهدهی (پایه 10) و هگزادسیمال (مبنای 16) و یا اوکتال(مبنای 8) مقداردهی شوند. برای این که مشخص کنیم عدد از نوع اوکتال است قبل از عدد آن یک عدد 0 می گذاریم و برای این که مشخص کنیم که عدد هگزادسیمال است قبل از عدد آن ا ز0x استفاده می کنیم. برای مثال

int decimal = 100;
int octal = 0144;
int hexa =  0x64;

لیترال های رشته ای در جاوا مانند بسیاری از زبان ها بین دو عدد کوتیشن قرار داده می شوند.برای مثال رشته های زیر نمونه هایی از لیترال های رشته ای هستند:

"Hello World"
"two\nlines"
"\"This is in quotes\""

نوع داده های char و String می توانند هر کاراکتر یونیکد را داخل خود داشته باشند. برای مثال:

char a = '\u0001';
String a = "\u0001";

در داخل رشته ها بعضی کاراکتر ها معنی و مفهوم خاصی دارند. به این معنی که کامپایلر جاوا آنها را به عنوان رشته معمولی در نظر نمی گیرد و برای کامپایلر معنی خاصی دارند. جدول این کاراکتر ها در شکل زیر آورده شده است که معنی هرکدام را توضیح می دهد.

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

# نوع داده اصلی
# نوع داده ارجاعی یا شیئی

!!نوع داده اصلی
در زبان جاوا 8 نوع داده اصلی وجود دارد. انواع داده اصلی در زبان جاوا از قبل تعریف شده اند و قابل گسترش نیستند. به عبارت دیگر انواع داده اصلی به عنوان پایه انواع داده های دیگر می باشد. انواع داده اصلی دارای نام هایی هستند که این نام ها جزء کلمات کلیدی است. در ادامه به معرفی این انواع داده می پردازیم و آنها را شرح خواهیم داد.

!! byte
نوع داده byte دارای خواص زیر است.
* نوع داده byte 8 بیت حافظه لازم دارد
* فقط می توان عدد بدون ممیز در این نوع داده ذخیره کرد
* این نوع داده کوچکترین عددی را که می تواند در خود نگه دارد -128 است
* بزرگترین عددی که این نوع داده می تواند در خود نگه دارد 127 می باشد.
*  مقدار پیشفرض این نوع داده 0 است. به این معنی که وقتی که یک متغیر از نوع byte تعریف می کنیم کامپایلر مقدار آن را 0 قرار می دهد.
* اگر اعداد شما در برنامه نویسی زیاد بزرگ نیست و از ممیز هم استفاده نمی کنید می توانید از این نوع داده استفاده کنید زیرا که در حافظه صرفه جویی می کند. زیرا این نوع داده یک چهارم نوع داده int فضا لازم دارد. کد زیر مثالی از تعریف متغیر از نوع داده byte است.
<java>
byte a=100;
byte b=-43;
<java>

!!short
این نوع داده اعداد بدون ممیز را در خود نگهداری می نماید.
* نوع داده short یک نوع داده علامت دار 16 بیتی است.
* کوچکترین مقداری که این نوع داده می تواند در خود نگهداری نماید -32768 می باشد.
*  بزرگترین مقداری که این نوع داده می تواند در خود نگهداری نماید 32767  می باشد.
* مقدار پیشفرض این نوع داده 0 است.
* حافظه مصرفی این نوع داده نصف نوع داده int است.
مثال تعریف متغیر از نوع short :
<java>
short s=10000;
short r=-3400
<java>

!!int
* نوع داده int یک نوع داده عددی علامت داره 32 بیتی است.
*  کوچکترین عددی که این نوع داده می تواند در خود نگهداری نماید -2147483648 می باشد.
* بزرگترین عددی که این نوع داده می تواند در خود نگهداری کند 2147483647  می باشد.
* عموما برای متغیرهای  اعداد صحیح از این نوع داده استفاده می شود ولی برای استفاده بهینه تر از حافظه می توان از انواع داده قبلی هم استفاده کرد. ولی امروزه به علت بالا بودن حجم حافظه ها صرفه جویی در حافظه مسئله حادی نیست.
* مقدار پیشفرض این نوع داده 0 است.
در زیر مثالی از این نوع داده آورده شده است:
<java>
int m=60;
int c=-200000;
int h=800000;
<java>

!!long
* نوع داده long یک نوع داده برای نگهداری اعداد صحیح علامت دار است که 64 بیت حافظه اشغال می کند.
* کوچکترین عددی که این نوع داده می تواند در خود نگهداری کند -9223372036854775808 است
* بزرگترین عددی که این نوع داده می تواند در خود نگهداری کند عدد 9223372036854775807 می باشد.
*  این نوع داده زمانی استفاده می شود که بخواهیم با اعداد صحیح بسیار بزرگ کار کنیم.
*  مقدار پیشفرض این نوع داده 0L است.
در زیر مثالی از این نوع داده آورده شده است.
<java>
long a=1000000L;
<java>

!!float
* نوع داده float برای نگهداری اعداد ممیز دار با 32بیت است.
* این نوع داده بر اساس استاندارد ممیز شناور IEEE 754 کار می کند.
* مقدار پیشفرض این نوع داده 0.0f است
* این نوع داده برای جاهایی که دقت بسیار مهم است مورد استفاده قرار نمی گیرد. مثلا برای نگهداشتن واحدهای پولی از این نوع داده استفاده نمی شود چون دقیق نیست.
مثال تعریف متغیر از این نوع داده به شکل زیر است:
<java>
float f1=234.5f;
<java>

!!double
* این نوع داده یک نوع داده 64 بیتی دقیق است.
* این نوع داده از استاندارد ممیز شناور IEEE 754 استفاده می کند.
* این نوع داده نوع داده پیشفرض برای اعداد ممیزی می باشد.
* این نوع داده با این که از float دقیق تر است ولی هنوز خطا دارد و نباید برای مقادیر پولی مورد استفاده قرار گیرد.
* مقدار پیش فرض این نوع داده 0.0d می باشد.
مثال این نوع داده در کد زیر آمده است.
<java>
doubel d1=123.4;
<java>

!!boolean
* این نوع داده فقط دو مقدار به خود میگیرد true,false
* این نوع فقط برای نگهداری نتایج عبارات شرطی مورد استفاده قرار می گیرد.
* مقدار پیشفرض این نوع داده false است.
مثالی از تعریف متغیر از این نوع داده در کد زیر آمده است.
<java>
boolean one=true;
<java>

!!char
* این نوع داده برای نگهداری کاراکتر های یونیکد می باشد.
* این نوع داده 16بیت فضا از حافظه برای خود می گیرد.
مثالی از این نوع داده به شکل زیر است:
<java>
char letter='a';
<java>

!!انواع داده ارجاعی
* انواع داده های ارجاعی از کلاس های تعریف شده ساخته می شوند. متغیرهایی که از این نوع ساخته می شوند برای دسترسی به اشیا ساخته شده از کلاس هستند.
* آرایه ها و اشیا از این نوع هستند و در دسته انواع داده ارجاعی قرار میگیرند.
* مقدار پیشفرض این نوع داده ها null است.
* یک متغیر از نوع ارجاعی می تواند به هر نوعی که با نوع خودش سازگار باشد انتساب داشته باشد.
مثالی از این نوع داده در کد زیر آمده است.
<java>
Animal anim=new Animal(rabbit);
<java>

!!لیترال ها در جاوا
لیترال قسمتی از کد است که برای نشان دادن مقادیر ثابت به کار می رود. مثلا این که چگونه یک عدد یا کاراکتر را در داخل کد نشان بدهیم. لیترال ها می توانند به طور مستقیم به هر متغیر از نوع داده اصلی انتساب داده شوند. برای مثال به کد زیر توجه کنید.
<java>
byte a = 68;
char a = 'A'
<java>
انواع داده byte, int, short می توانند با مقادیر دهدهی (پایه 10) و هگزادسیمال (مبنای 16) و یا اوکتال(مبنای 8) مقداردهی شوند. برای این که مشخص کنیم عدد از نوع اوکتال است قبل از عدد آن یک عدد 0 می گذاریم و برای این که مشخص کنیم که عدد هگزادسیمال است قبل از عدد آن ا ز0x استفاده می کنیم. برای مثال
<java>
int decimal = 100;
int octal = 0144;
int hexa =  0x64;
<java>
لیترال های رشته ای در جاوا مانند بسیاری از زبان ها بین دو عدد کوتیشن قرار داده می شوند.برای مثال رشته های زیر نمونه هایی از لیترال های رشته ای هستند:
<java>
Hello World
two\nlines
\This is in quotes
<java>
نوع داده های char و String می توانند هر کاراکتر یونیکد را داخل خود داشته باشند. برای مثال:
<java>
char a = '\u0001';
String a = \u0001;

<java>
در داخل رشته ها بعضی کاراکتر ها معنی و مفهوم خاصی دارند. به این معنی که کامپایلر جاوا آنها را به عنوان رشته معمولی در نظر نمی گیرد و برای کامپایلر معنی خاصی دارند. جدول این کاراکتر ها در شکل زیر آورده شده است که معنی هرکدام را توضیح می دهد.
||http://tosinso.com/files/get/e341440a-b916-40df-a329-9aaf30d5e541||
همانطور که در جدول مشاهده می نمایید کاراکتر backslash در همه مشترکت است برای این که در متن یک کاراکتر backslash قرار بدهید باید دوبار این کاراکتر را تکرار کنید.در این مطلب به توضیح انواع داده در جاوا پرداخته شد. امید است که مفید بوده باشد. می توانید با نظرات خود می توانید مارا در بهبود مطالب کمک کنید.*Itpro باشید*

نویسنده: مهدی عادلی فر
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

همانطور که در جدول مشاهده می نمایید کاراکتر backslash در همه مشترکت است برای این که در متن یک کاراکتر backslash قرار بدهید باید دوبار این کاراکتر را تکرار کنید.در این مطلب به توضیح انواع داده در جاوا پرداخته شد. امید است که مفید بوده باشد.

انواع متغیر

در ادامه مباحث برنامه نویسی جاوا به انواع متغیرهای موجود در جاوا می پردازیم. در قسمت های قبل گفتیم که هر متغیر یک قسمت از حافظه است که نامی برای آن مشخص کرده ایم. سپس گفتیم که برای متغیرها باید نوع داده آن را مشخص کنیم.

این نوع داده نشان می دهد که متغیر چه مقدار حافظه اشغال کرده است و چه چیزی را می تواند در خود نگهداری نماید و چه عملیاتی بر روی آن قابل انجام است. شما باید هر متغیر را قبل از این که از آن استفاده کنید معرفی نمایید. شکل اصلی معرفی متغیر به شکل زیر است

data type variable [ = value][, variable [= value] ...] ;

کلمه Data type در خط بالا نشان دهنده یکی از انواع داده ای است که در مطلب قبلی به آن پرداخته شد. برای آن که چند متغیر پشت سرهم از یک نوع تعریف کنیم باید آنها را با استفاده از کاما یا ، جدا نماییم. در کد زیر نمونه های صحیحی از تعریف متغیر ها را مشاهده می کنید.

int a, b, c;         // معرفی سه متغیر.
int a = 10, b = 10;  // معرفی به همراه مقداردهی
byte B = 22;         // معرفی یک متغیر از نوع بایت
double pi = 3.14159; // معرفی متغیر برای عدد پی
char a = 'a';        // معرفی متغیر کاراکتری

حال به شرح کامل انواع متغیرها می پردازیم.

  • متغیرهای محلی
  • فیلدها
  • متغیرهای کلاس (استاتیک)

متغیر محلی چیست؟

متغیرهای محلی دارای ویژگی های زیر می باشند.

  • متغیرهای محلی در داخل متدها و یا constructorها و یا بلوک ها تعریف می شوند. بلوک فضای بین دو براکت{} را می گویند.
  • متغیرهای محلی زمانی ساخته می شوند که وارد متد یا constructor و یا بلوک کد می شویم و وقتی خارج بشیم از حافظه پاک خواهند شد.
  • برای متغیرهای محلی از Modifier دسترسی نمی توان استفاده کرد.
  • متغیرهای محلی فقط در محلی که تعریف شده اند قابل دسترس هستند. به طول مثال اگر در داخل متدی تعریف شده باشند فقط در داخل همان متد قابل دسترسی می باشند.
  • متغیرهای محلی در محل پشته سیستم تعریف می شوند.
  • وقتی که متغیر محلی تعریف می شوند هیچ مقدار پیشفرضی برای آنها در نظر گرفته نمی شود. بنابراین قبل از این که از متغیر تعریف شده استفاده کنید باید آن را مقدار دهی نمایید. برای مثال به کد زیر دقت کنید که age یک متغیر محلی است که داخل متد pupAge() تعریف شده است و حوزه آن فقط به همین متد محدود شده است.
public class Test{ 
   public void pupAge(){
      int age = 0;
      age = age + 7;
      System.out.println("Puppy age is : " + age);
   }
   
   public static void main(String args[]){
      Test test = new Test();
      test.pupAge();
   }
}

نتیجه کد بالا به شرح زیر است.

Puppy age is: 7

حال در مثال زیر می بینید که از متغیر age بدون این که مقداردهی شود استفاده شده است بنابراین کدزیر دارای خطا است.

public class Test{ 
   public void pupAge(){
      int age;
      age = age + 7;
      System.out.println("Puppy age is : " + age);
   }
   
   public static void main(String args[]){
      Test test = new Test();
      test.pupAge();
   }
}

خروجی کد بالا به شکل زیر خواهد بود.

Test.java:4:variable number might not have been initialized
age = age + 7;
         ^
1 error

بررسی مفهوم فیلدها در جاوا

فیلدها دارا خواص زیر می باشند.

  • فیلدها داخل کلاس ها تعریف می شوند ولی داخل هیچ متد، constructor یا بلوکی نیستند
  • وقتی که یک شی از یک کلاس می سازیم. به اندازه تعداد فیلدهای آن شی به آن حافظه اختصاص داده می شود.
  • فیلد ها وقتی که با استفاده از کلمه کلیدی new یک شی را می سازیم ساخته می شوند و تا وقتی که خود شی از بین نرفته باقی می مانند.
  • فیلدها مقادیری را در خود نگهداری می کنند که توسط چند متد یا constructor مورد استفاده قرار می گیرد و فیلد ها باید در همه جای کلاس قابل دسترسی باشند.
  • برای فیلدها می توان از Modifierهای نیز می توان استفاده کرد. که اگر یک فیلد را به صورت public معرفی کنیم خارج از کلاس نیز قابل دسترسی است.
  • معمولا توصیه می شود که فیلدها را به شکل private معرفی کنیم. اما اگر بخواهیم برای کلاس های فرزند یا subclass ها قابل دسترس باشند آن را به صورت protected معرفی می کنیم.
  • فیلدها دارای مقدار پیشفرض هستند. این به این معنی است که اگر یک فیلد عددی معرفی کنیم مقدار آن به طور پیشفرض 0 خواهد بود.
    • مقدار اولیه فیلدها می تواند هم در زمان تعریف فیلد و هم در داخل constructor مقداردهی بشود.
    • برای دسترسی به فیلدهای یک شی باید نام شی را نوشته و پس از آن یک نقطه گذاشته و نام فیلد را باید نوشت.ObjectReference.VariableName البته این به شرطی قابل انجام است که فیلد مورد نظر public تعریف شده باشد. کد زیر مثالی برای فیلدها می باشد.
import java.io.*;

public class Employee{
   // این فیلد برای همه اشیا و بیرون از کلاس قابل دسترس است.
   public String name;
   
   // این فیلد فقط در داخل کلاس قابل دسترس است.
   private double salary;
   
   // مقداردهی فیلد در داخل سازنده. 
   public Employee (String empName){
      name = empName;
   }

   // این فیلد با استفاده از یک تابع مقدار دهی می شود..
   public void setSalary(double empSal){
      salary = empSal;
   }
   
   // این متد مقادیر فیلدها را در خروجی نشان می دهد
   public void printEmp(){
      System.out.println("name  : " + name );
      System.out.println("salary :" + salary);
   }

   public static void main(String args[]){
      Employee empOne = new Employee("Mehdi");
      empOne.setSalary(1000);
      empOne.printEmp();
   }
}

خروجی کد به شکل زیر است.

name  : Mehdi
salary :1000.0

بررسی مفهوم متغیرهای کلاس استاتیک در جاوا

متغیرهای استاتیک دارای خواص زیر می باشند.

  • متغیرهای کلاس به این دلیل متغیر استاتیک نامیده می شوند که هنگام تعریف آنها از کلمه کلیدی static استفاده می شود. ولی باید این متغیرها را بیرون از متدها و سایر بلوک ها معرفی کرد.
  • خاصیت مهمی که این متغیرها دارند این است که اگر چند شی از یک کلاس داشته باشیم این متغیر بین همه یکسان و مشترک است. به این معنی که اگر دریکی از اشیا مقدار متغیر را تغییر بدهید در بقیه اشیا نیز تغییر خواهد کرد.
  • این متغیرها بیشتر برای نگهداری یک ثابت مورد استفاده قرار می گیرند و زیاد تغییر نمی کنند.
  • متغیرهای استاتیک زمانی که برنامه شروع می شوند ساخته می شوند و زمانی که برنامه تمام می شود از بین می روند.
  • معرفی متغیر استاتیک معمولا به صورت public تعریف می شوند.
  • مقدار پیشفرض این متغیرها مانند فیلد ها می باشد و می توان بدون مقداردهی اولیه از آنها و مقدار پیشفرض آنها استفاده کرد.
  • برای دسترسی به یک متغیر استاتیک می توان نام کلاس را تایپ کرده و سپس با زدن نقطه به متغیر مورد نظر دسترسی پیدا کرد.ClassName.VariableName
  • وقتی که یک متغیر کلاس را به صورت public و final تعریف می کنیم بهتر است که همه حروف نام آن را بزرگ بنویسیم. و در غیر این صورت مانند متغیر عادی معرفی می کنیم. برای مثال به کد زیر دقت کنید
import java.io.*;

public class Employee{
   // متغیر استاتیک به صورت خصوصی معرفی شده
   private static double salary;

   // به عنوان یک ثابت تعریف شده است
   public static final String DEPARTMENT = "Development ";

   public static void main(String args[]){
      salary = 1000;
      System.out.println(DEPARTMENT + "average salary:" + salary);
   }
}

خروجی کد به شکل زیر خواهد بود:

Development average salary:1000

دقت داشته باشید که برای این که در کد بالا بخواهیم با استفاده از کلاس به ثابت مورد نظر دسترسی داشته باشیم باید کد زیر را بنویسیم .

Employee.DEPARTMENT

امیدوارم که درباره ی انواع متغیرها در جاوا ابهامی وجود نداشته باشد

Modifier ها

در ادامه مباخث برنامه نویسی به زبان جاوا به بررسی Modifier ها در این زبان خواهیم پرداخت. Modifierها کلمات کلیدی هستند که برای تغییر معنی تعاریف استفاده می شوند. زبان جاوا Modifier های متفاوتی دارند که دو دسته مهم آنها عبارتند از:

  1. Modifierهای دسترسی
  2. Modifierهای غیردسترسی

برای استفاده از Modifier شما باید نام آن را قبل از تعریف کلاس و یامتد و یا متغیر خود بیاورید. در کد زیر نحوه استفاده از Modifier ها را نشان داده ایم.:

public class className {
   // ...
}
private boolean myFlag;
static final double weeks = 9.5;
protected static final int BOXWIDTH = 42;
public static void main(String[] arguments) {
   // body of method
}

کلماتی مانند public , private, final عضو Modifierها هستند.

Modifier های دسترسی چه هستند؟

جاوا برای این که سطح دسترسی را مشخص کند از تعدادی Modifier دسترسی استفاده می کند. مشخص کردن سطح دسترسی می تواند در سطح کلاس یا متد یا متغیر باشد. چهار سطح دسترسی در جاوا عبارتند از:

  • قابل در دسترس در کل پکیج. این سطح دسترسی به طور پیشفرض برای همه ی مشخصه ها می باشد و اگر از هیچ modifier استفاده نشود این سطح دسترسی برای آن مشخصه در نظر گرفته می شود. یعنی در کل پکیج و همه کلاس های موجود در آن پکیج قابل دسترس است. برای مثال به کد زیر توجه نمایید
String version = "1.5.1";

boolean processOrder() {
   return true;
}
  • قابل دسترس در کلاس تعریف شده. این سطح دسترسی فقط در داخل کلاسی که مشخصه را تعریف کرده ایم قابل استفاده است و بیرون از آن قابل دسترسی نیست. برای این سطح دسترسی از private استفاده می شود. این سطح دسترسی محدود کننده ترین سطح دسترسی است. استفاده از دسترسی private راه کپسوله کردن و پنهان کردن اطلاعات کلاس از سایر کلاس ها است. برای مثال به کد زیر توجه نمایید
public class Logger {
   private String format;
   public String getFormat() {
      return this.format;
   }
   public void setFormat(String format) {
      this.format = format;
   }
}

در کد بالا متغیر format به صورت private تعریف شده است بنابراین هیچ راهی برای کلاس های دیگر وجود ندارد که به طور مستقیم به این متغیر دسترسی داشته باشند. برای این که از سایر کلاس ها به این متغیر دسترسی داشته باشیم دو متد با نام های getFormat که مقدار کنونی متغیر را برمیگرداند و setFormat که مقدار متغیر را برابر با ورودی اش قرار می دهد تعریف کرده ایم. تعریف متد های get, set در جاوا بسیار رایج است و این متدها به getter,setter معروف هستند.

  • قابل استفاده در همه جا. برای این که همه جا حتی بیرون از پکیج هم مشخصه ما قابل دسترس باشد از این سطح دسترسی استفاده می کنیم. مثلا کلاسی نوشته ایم که می خواهیم در همه جای برنامه قابل استفاده باشد. برای این کار باید از این سطح دسترسی استفاده کنیم. برای مشخص کردن این سطح دسترسی از public استفاده می شود. در وراثت متدها و متغیر های public در کلاس فرزند نیز قابل استفاده می باشند. به عبارت دیگر جزئی از کلاس فرزند محسوب می شوند که از کلاس پدر به ارث رسیده اند. برای مثال به کد زیر دقت کنید:
public static void main(String[] arguments) {
   // ...
}

تابع main در برنامه ها باید به صورت public باشد. اگر این تابع public نباشد برنامه قابلیت اجرا ندارد.

  • قابل استفاده در subClassها. برای این که متغیر یا متدی در کلاس پدر قابل دسترس باشد و همچنین در کلاس فرزند نیز قابل استفاده باشد ولی در جای دیگر این امر ممکن نباشد از این سطح دسترسی استفاده می کنیم. برای مشخص کردن این سطح دسترسی باید از کلمه کلیدی protected قبل از تعریف شناسه استفاده کرد. همچنین در هنگام استفاده از این Modifier شناسه در داخل پکیج نیز قابل دسترسی خواهد بود. کلاس ها و اینترفیس ها را نمی توان به صورت protected تعریف کرد.

بررسی قوانین دسترسی در وراثت

قوانین زیر زمان وراثت کلاس ها باید رعایت شود

  1. متدهایی که در کلاس پدر به صورت public معرفی شده اند باید در کلاس فرزند هم به صورت public باشند.
  2. متدهایی که در کلاس پدر به صورت protected معرفی شده اند باید در کلاس فرزند به صورت protected و یا public باشند ولی نمی توانند به صورت private تعریف شوند.
  3. متدهایی که بدون Modifier دسترسی در کلاس پدر تعریف شده اند نمی توانند در کلاس فرزند به صورت private باشند.
  4. متدهایی که در کلاس پدر به صورت private تعریف شده اند قابل به ارث رسیدن نیستند و در کلاس فرزند اصلا قابل مشاهده و دسترسی نمی باشند.

Modifier های غیر دسترسی چه هستند؟

در ادامه به معرفی تعدادی از Modifier های جاوا می پردازیم که ربطی به سطح دسترسی ندارند و هرکدام دارای معنی جداگانه ای می باشند. این Modifier ها در ادامه آمده اند:

  • استفاده از static. برای این که متدها و متغیرهایی بسازیم که بدون ساخت شی از کلاس قابل دسترس باشند و همچنین بین همه اشیا مشترک باشند از static استفاده می شود. به عبارت دیگر اگر یک متد را static تعریف کنیم. آن متد از طریق نام خود کلاس و بدون ساخت شی از آن کلاس قابل استفاده است. در تعریف متدهای static نمی توان از فیلدها و متغیرهای غیر static موجود در داخل کلاس استفاده کرد. برای مثال این Modifier به کد زیر دقت کنید:
public class InstanceCounter {

   private static int numInstances = 0;

   protected static int getCount() {
      return numInstances;
   }

   private static void addInstance() {
      numInstances++;
   }

   InstanceCounter() {
      InstanceCounter.addInstance(); 
   }

   public static void main(String[] arguments) {
      System.out.println("Starting with " +
      InstanceCounter.getCount() + " instances");
      for (int i = 0; i < 500; ++i){
         new InstanceCounter();
	  }
      System.out.println("Created " +
      InstanceCounter.getCount() + " instances");
   }
}

خروجی کد بالا به شکل زیر خواهد بود.

Started with 0 instances
Created 500 instances

دلیل این که شمارش اعداد به تعداد اشیا ساخته شده است این است که متغیر numInstances بین همه اشیا مشترک است زیرا که static تعریف شده است. همچنین به علت این که تابع addInstance به صورت static تعریف شده است می توان بدون داشتن شی به آن دسترسی داشت.

  • استفاده از final. این Modifier بسیار مهم است. اگر از این Modifier برای معرفی کلاس خود استفاده کنید این کلاس دیگر نمی تواند فرزند داشته باشد یعنی نمی توان از آن با استفاده از کلمه کلیدی extends کلاس فرزند ساخت. اگر از این Modifier در تعریف متد در کلاس پدر استفاده کنید در کلاس های فرزند نمی توانید این متد را به صورت سفارشی بازنویسی یا override کنید. اگر از این Modifier در تعریف متغیر استفاده کنید. فقط یک بار می توانید آن متغیر را مقدار دهی کنید. البته لازم نیست که زمان تعریف مقدار دهی کنیم. اما اگر یک بار مقداردهی کنیم دیگر قابل مقداردهی نیست. برای مثال به کد زیر دقت کنید:
public class Test{
  final int value = 10;
 
  public static final int BOXWIDTH = 6;
  static final String TITLE = "Manager";
  
  public void changeValue(){
     value = 12; //خطا ایجاد خواهد شد
  }
}
  • استفاده از abstract. این Modifier زمانی استفاده می شود که بخواهیم کلاسی که میسازیم صرفا کلاس پدر باشد. یعنی فقط به این منظور این کلاس را می سازیم که بقیه کلاسها از آن وراثت داشته باشند. همچنین از کلاس های abstract نمی توان شی جدیدی با استفاده از new ساخت. یک کلاس نمی تواند هم final باشد هم abstract. اگر کلاسی دارای متد abstract باشد خود آن کلاس باید حتما به صورت abstract تعریف شده باشد. یک کلاس abstract می تواند هم متد معمولی داشته باشد و هم متد abstract داشته باشد. حال اگر از این Modifier برای متد استفاده کنیم. متد را پیاده سازی نمی کنیم. و فقط شکل معرفی متد را می نویسیم و در کلاس های فرزند آن را تعریف خواهیم کرد. دقت کنید که هنگامی که متد را abstract تعریف می کنیم باید بعد از تعریف از علامت سمی کالن استفاده کنیم. در کد زیر مثالی از تعریف کلاس و متد abstract آمده است.
public abstract class GraphicObject {
   // declare fields
   // declare nonabstract methods
   abstract void draw();
}
  • کلمه کلیدی synchronized به این منظور مورد استفاده قرار می گیرد که مشخص کند که یک متد در یک زمان فقط توسط یک thread قابل دسترسی است. این Modifier می تواند با هر کدام از 4 Modifier دسترسی به کار برود. برای مثال به کد زیر دقت کنید:
public synchronized void showDetails(){
.......
}
  • از کلمه کلیدی transient بدین منظور استفاده می شود که به ماشین مجازی جاوا(JVM) بفهمانیم که هنگامی که محتویات شی را سریالیز می کند، متغیری که به صورت transient تعریف شده است را نادیده بگیرد. برای مثال به کد زیر دقت کنید.
public transient int limit = 55;   // will not persist
public int b; // will persist
  • از volatile زمانی استفاده می کنیم که از چند thread در برنامه استفاده کنیم. منظور از استفاده از این Modifier این است که وقتی از این Modifier برای یک متغیر استفاده می کنیم به ماشین مجازی جاوا می گوییم که همه ی thread ها اگر متغیر مورد نظر را در حافظه کش خود تغییر بدهند باید آن تغییر بر روی متغیر در حافظه هم اعمال شود. دلیل این کار این است که اگر چند thread به صورت همزمان از یک متغیر استفاده می کنند مقدار متغیر داده قدیمی نداشته باشد و همیشه همگام پیش برویم. این Modifier فقط بر روی فیلدهای کلاس قابل استفاده است. یک متغیر volatile می تواند null باشد. برای مثال به کد زیر دقت کنید:
public class MyRunnable implements Runnable{
    private volatile boolean active;
 
    public void run(){
        active = true;
        while (active){ 
            // some code here
        }
    }
    
    public void stop(){
        active = false; 
    }
}

اگر کد run را توسط یک thread اجرا کنیم و اگر متد stop را توسط یک thread دیگر اجرا کنیم ممکن است که در خط while(active) از متغیر active یک کپی در حافظه کش مربوط به thread اجرا کننده موجود باشد. بنابراین حتی اگر متد stop هم اجرا شود برنامه متوقف نمی شود. اما در این برنامه به دلیل این که متغیر active به صورت volatile معرفی شده است، اگر در متد stop مقدار این متغیر برابر False قرار بگیرد در همان زمان متد run هم متوقف خواهد شد

عملگرها قسمت یکچ

در ادامه مطالب برنامه نویسی جاوا به عملگرهای موجود در این زبان و انواع آنها خواهیم پرداخت. هر زبان برنامه نویسی باید قابلیت تغییر و پردازش داده ها و انجام عملیاتی بر روی انواع داده را داشته باشد. زبان جاوا در این زمینه بسیار قوی عمل کرده است. این زبان که بیشتر عملگرهای خویش را ازC++ گرفته است دامنه وسیعی از عملگرها را برای انجام امور مختلف ارائه می دهد. عملگرهای جاوا به دسته های زیر تقسیم می شوند که در ادامه مطلب هرکدام را به طور کامل شرح خواهیم داد.

  1. عملگرهای محاسباتی
  2. عملگرهای رابطه ای
  3. عملگرهای بیتی
  4. عملگرهای منطقی
  5. عملگرهای انتسابی
  6. عملگرهای متفرقه

معرفی انواع عملگرهای محاسباتی در جاوا

عملگرهای محاسباتی در عبارات ریاضی و جبری استفاده می شوند. در ادامه عملگرهای ریاضی آورده شده اند. دقت داشته باشید که برای دیدن نتیجه این عملگرها مقدار متغیر A برابر 10 و مقدار B مقدار 20 است. این عملگرها عبارتند از:

  • عملگر جمع کردن: این عملگر دو مقدار عددی را با هم جمع می کند و علامت آن + می باشد. برای مثال نتیجه A+B برابر 30 خواهد شد.
  • عملگر تفریق کردن: این عملگر مقدار عددی دوم را از مقدار عددی اول کم خواهد کرد و علامت این عملگر - می باشد. برای مثال نتیجه A-B برابر -10 خواهد شد.
  • عملگر ضرب دو مقدار را در هم ضرب می نماید و علامت این عملگر می باشد برای مثال نتیجه AB برابر با 200 خواهد بود.
  • عملگر تقسیم: این عملگر مقدار اول را بر مقدار دوم تقسیم می کند. علامت این عملگر اسلش () می باشد. برای مثال نتیجه BA برابر 2 خواهد بود. نکته ای که باید به آن توجه داشته باشید این است که مقدار مقسوم علیه در کامپیوتر نباید صفر باشد.
  • عملگر باقی مانده: این عملگر مقدار اولی را بر مقدار دوم تقسیم می کند و باقی مانده را برمی گرداند. علامت این عملگر در جاوا % می باشد. برای مثال نتیجه B%A برابر 0 خواهد بود.
  • عملگر افزایش: این عملگر یک عملگر تک عملوندی است. به این معنی که فقط با یک عدد یا مقدار کار می کند. وظیفه این عملگر این است که به مقدار موجود یک واحد اضافه می نماید. علامت این عملگر ++ می باشد. برای مثال نتیجه B++ برابر 21 خواهد بود.
  • عملگر کاهش: این عملگر از مقدار قبلی یک واحد کم می کند. علامت این عملگر -- می باشد. برای مثال عمل B-- برابر 19 خواهد بود.

برای درک بهتر عملگرهای ریاضی به مثال های زیر دقت نمایید.

public class Test {

  public static void main(String args[]) {
     int a = 10;
     int b = 20;
     int c = 25;
     int d = 25;
     System.out.println("a + b = " + (a + b) );
     System.out.println("a - b = " + (a - b) );
     System.out.println("a * b = " + (a * b) );
     System.out.println("b / a = " + (b / a) );
     System.out.println("b % a = " + (b % a) );
     System.out.println("c % a = " + (c % a) );
     System.out.println("a++   = " +  (a++) );
     System.out.println("b--   = " +  (a--) );
     
     System.out.println("d++   = " +  (d++) );
     System.out.println("++d   = " +  (++d) );
  }
} 

خروجی کد بالا به شکل زیر خواهد بود:

a + b = 30
a - b = -10
a * b = 200
b / a = 2
b % a = 0
c % a = 5
a++   = 10
b--   = 11
d++   = 25
++d   = 27

همانطور که در شکل دیده می شود اگر عملگر افزایش یا کاهش قبل یا بعد از عملوند قرار گیرد رفتار متفاوتی از خود نشان خواهد داد. به این شکل که اگر عملگر قبل از عملوند قرار بگیرد ابتدا عمل کاهش یا افزایش صورت گرفته و سپس عمل چاپ شدن انجام می شود. ولی اگر عملوند بعد از عملگر قرار بگیرد مانند d++ ابتدا عمل چاپ شدن انجام می شود و سپس عمل افزایش یا کاهش انجام خواهد شد.

معرفی انواع عملگرهای رابطه ای در جاوا

عملگرهای رابطه ای عملگرهایی هستند که در مورد رابطه دو مقدار باهم تصمیم گیری می کنند. نتیجه تصمیم گیری هم مقدار درست یا نادرست است(true/false) برای مثال A را برابر با 10 و B را برابر با 20 در نظر می گیریم. در ادامه به بررسی عملگرهای رابطه ای می پردازیم:

  • عملگر تساوی. این عملگر برای مشخص کردن تساوی دو مقدار به کار می رود که علامت آن == می باشد و مشخص می کند که دو مقدار با هم مساوی هستند یا خیر. برای مثال نتیجه A==B برابر با false خواهد بود.
  • عملگر نامساوی: این عملگر به این گونه عمل می کند که اگر دو مقدار با هم مساوی باشند مقدار true و اگر دو مقدار با هم مخالف باشند مقدار ‏true برمی گرداند. علامت این عملگر در جاوا != می باشد. برای مثال نتیجه A!=B برابر با true خواهد بود.
  • عملگر بزرگتر: این عملگر مشخص می کند که آیا مقدار سمت چپ از مقدار سمت راست بزرگتر است یا خیر. اگر مقدار سمت چپ بزرگتر بود جواب true و در غیر این صورت چواب false می دهد. علامت این عملگر < می باشد. برای مثال مقدار A>B نتیجه غلط یا False در پی خواهد داشت. دقت داشته باشید که اگر دو مقدار مساوی هم باشند این عملگر مقدار غلط در بر خواهد داشت.
  • عملگر کوچکتر: این عملگر مخالف عملگر بزرگتر است و مشخص می کند که آیا مقدار سمت چپ عملگر از مقدار سمت راست عملگر کوچکتر است یا خیر. در صورت کوچکتر بودن جواب true می دهد. علامت این عملگر به شکل > می باشد. برای مثال مقدار عبارت A<B برابر true است.
  • عملگر بزرگتر مساوی به این شکل است که اگر مقدار سمت چپ بزرگتر از مقدار سمت راست باشد یا با مقدار سمت راست مساوی باشد مقدار true برمی گرداند. علامت این عملگر به شکل >= برای مثال جواب A>=B برابر false خواهد بود.
  • عملگر کوچکترمساوی: این عملگر مشخص می کند که عملوند سمت چپ از عملوند سمت راست کوچکتر است یا هردو عملوند با هم مساوی هستند. علامت این عملگر به شکل <= می باشد برای مثال نتیجه عبارت A<=B برابر true است.

مثال زیر کاربرد این عملگر ها و نحوه استفاده از آنها در جاوا را نشان می دهد.

public class Test {

  public static void main(String args[]) {
     int a = 10;
     int b = 20;
     System.out.println("a == b = " + (a == b) );
     System.out.println("a != b = " + (a != b) );
     System.out.println("a > b = " + (a > b) );
     System.out.println("a < b = " + (a < b) );
     System.out.println("b >= a = " + (b >= a) );
     System.out.println("b <= a = " + (b <= a) );
  }
} 

نتیجه اجرای خطوط بالا به شرح زیر خواهد بود.

a == b = false
a != b = true
a > b = false
a < b = true
b >= a = true
b <= a = false

عملگرها قسمت دو

معرفی انواع عملگرهای بیتی در جاوا

جاوا دارای چندین عملگر بیتی است که این عملگرها بر روی انواع داده int, long, short, char, byte قابل اعمال است. عملگرهای بیتی بر روی تک تک بیتهای عملوند ها کار می کنند. برای مثال در متغیر a مقدار 60 را قرار می دهیم و در متغیر b عدد 13 را قرار می دهیم. حال شکل باینری این دو متغیر به شکل زیر خواهد بود

a=00111100
b=00001101

در ادامه به بررسی این عملگرها می پردازیم.

  • عملگر and بیتی (&) این عملگر بیت های دو عملوند را دو به دو با هم and می کند و مقدار را مشخص می نماید برای مثال نتیجه and بیتی a&b برابر 12 خواهد بود که مقدار باینری آن 00001100 می باشد.
  • عملگر or بیتی این عملگر بیت های دو عملوند را دو به دو با هم or می نماید. برای مثال نتیجه عمل a|b برابر مقدار 61 یعنی عدد باینری 00111101 خواهد بود.
  • عملگر xor بیتی (^) این عملگر بیت های دو عدد را با هم xor می نماید. یعنی اگر یکی از مقادیر مقدار یک و دیگری مقدار 0 داشته باشد جواب 1 و اگر هردو یکسان باشند جواب 0 می دهد. برای مثال نتیجه عمل a^b برابر 49 که معادل باینری آن 00110001 می باشد است.
  • عملگر مکمل بیتی(~) این عملگر یک عملگر تک عملوندی است که بیت های عملوند خود را برعکس می کند یعنی اگر بیت مورد نظر 1 باشد آن را 0 و اگر 0 باشد آن را 1 می کند. برای مثال ~a برابر -61 با عدد باینری 11000011 است.
  • عملوند شیفت به چپ (>>) این عملوند مقدار عدد را به تعداد گفته شده به سمت چپ شیفت بیتی می دهد. برای مثال اگر بخواهیم a را دو بار به سمت چپ شیفت بدهیم باید به این شکل بنویسیم.a<<2 در این صورت نتیجه برابر 240 خواهد بود زیرا که معادل باینری آن 11110000 می باشد.
  • عملگر شیفت به راست(>>) این عملگر مقدار عدد را به تعداد گفته شده به راست شیفت می دهد. برای مثال نتیجه عمل a>>2 برابر مقدار 15 با عدد باینری 1111 خواهد شد.
  • عملگر شیفت به راست با ورود 0 : عملگرهای شیفت به راست و شیفت به چپ که گفته شده مقدار عدد خارج شده را به عنوان مقدار ورودی شیفت وارد می کردند ولی عملگر شیفت به راست با ورودی 0 عدد را به سمت راست شیفت می دهد و مقدار صفر را از سمت چپ به آن وارد می نماید. برای مثال نتیجه عمل a>>>2 عدد 15 می باشد.

برای درک بهتر عملگرهای بیتی به کد زیر دقت کنید.

public class Test {

  public static void main(String args[]) {
     int a = 60;	/* 60 = 0011 1100 */  
     int b = 13;	/* 13 = 0000 1101 */
     int c = 0;

     c = a & b;       /* 12 = 0000 1100 */ 
     System.out.println("a & b = " + c );

     c = a | b;       /* 61 = 0011 1101 */
     System.out.println("a | b = " + c );

     c = a ^ b;       /* 49 = 0011 0001 */
     System.out.println("a ^ b = " + c );

     c = ~a;          /*-61 = 1100 0011 */
     System.out.println("~a = " + c );

     c = a << 2;     /* 240 = 1111 0000 */
     System.out.println("a << 2 = " + c );

     c = a >> 2;     /* 215 = 1111 */
     System.out.println("a >> 2  = " + c );

     c = a >>> 2;     /* 215 = 0000 1111 */
     System.out.println("a >>> 2 = " + c );
  }
} 

خروجی برنامه بالا به شکل زیر خواهد بود

a & b = 12
a | b = 61
a ^ b = 49
~a = -61
a << 2 = 240
a >> 2=15
a >>> 2=15

معرفی عملگرهای منطقی در جاوا

عملگرهای منطقی بر روی داده های از نوع boolean و یا عباراتی که نتیجه boolean یعنی مقدار درست یا غلط دارند عمل می کنند. در ادامه به شرح این عملوند ها می پردازیم. برای مثال فرض کنید که دو متغیر a, b داریم که مقدار a برابر true و مقدار b برابر false می باشد.

  1. عملگر and منطقی (&&) این عملگر در صورتی جواب true برمی گرداند که هردو عملوند چپ و راست آن true یا غیرصفر باشند. برای مثال نتیجه عمل a&&b مقدار false است.
  2. عملگر or منطقی این عملگر در صورتی نتیجه true می دهد که یکی از عملوند ها true یا غیر صفر باشد. برای مثال نتیجه عمل a||b مقدار true است.
  3. عملگر نقیض منطقی(!) این عملگر یک عملگر تک عملوندی است. اگر عملوند این عملگر درست باشد مقدار False و در غیر این صورت مقدار true برمی گرداند. برای مثال حاصل عبارت !(a&&b) مقدار true می باشد.

برای مثال به کد زیر دقت نمایید.

public class Test {

  public static void main(String args[]) {
     boolean a = true;	
     boolean b = false;	

     System.out.println("a && b = " + (a&&b));

     System.out.println("a || b = " + (a||b) );

     System.out.println("!(a && b) = " + !(a && b));
  }
} 

خروجی کد به شکل زیر است

a && b = false
a || b = true
!(a && b) = true

معرفی انواع عملگرهای انتسابی در جاوا

عملگرهای انتسابی که توسط جاوا پشتیبانی می شوند عبارتند از:

  • عملگر انتساب(=) این عملگر مقدار سمت راست عملگر را در عملوند سمت چپ می ریزد. برای مثال C=A+B مقدار C برابر با جمع A و B خواهد بود.
  • عملگر جمع و انتساب(+=) این عملگر به این شکل عمل می کند که ابتدا عملوند سمت راست را با عملوند سمت چپ جمع نموده و در عملوند سمت چپ ذخیره می نماید. برای مثال C+=A معادل C=C+A می باشد.
  • عملگر تفریق و انتساب(-=) مانند همان عملگر جمع و انتساب عمل می کند با این تفاوت که عملوند سمت راست را از عملوند سمت چپ کم کرده و ذخیره می کند. برای مثال عمل C-=A معادل C=C-A می باشد.
  • عملگر ضرب و انتساب(*=) و عملگر (/=) و عملگر (%=) معادل اعمال قبلی هستند.
  • عملگر های >>= و <<= و &= و ^= و |= نیز اعمال بیتی گفته شده را به انضمام انتساب انجام می دهند.

برای مثال و درک بهتر عملگرهای انتساب به مثال زیر دقت نمایید.

public class Test {

  public static void main(String args[]) {
     int a = 10;	
     int b = 20;
     int c = 0;

     c = a + b;
     System.out.println("c = a + b = " + c );

     c += a ;
     System.out.println("c += a  = " + c );

     c -= a ;
     System.out.println("c -= a = " + c );

     c *= a ;
     System.out.println("c *= a = " + c );

     a = 10;
     c = 15;
     c /= a ;
     System.out.println("c /= a = " + c );

     a = 10;
     c = 15;
     c %= a ;
     System.out.println("c %= a  = " + c );

     c <<= 2 ;
     System.out.println("c <<= 2 = " + c );

     c >>= 2 ;
     System.out.println("c >>= 2 = " + c );

     c >>= 2 ;
     System.out.println("c >>= a = " + c );

     c &= a ;
     System.out.println("c &= 2  = " + c );
  
     c ^= a ;
     System.out.println("c ^= a   = " + c );

     c |= a ;
     System.out.println("c |= a   = " + c );
  }
} 

خروجی کد بالا به شکل زیر است:

c = a + b = 30
c += a  = 40
c -= a = 30
c *= a = 300
c /= a = 1
c %= a  = 5
c <<= 2 = 20
c >>= 2 = 5
c >>= 2 = 1
c &= a  = 0
c ^= a   = 10
c |= a   = 10

معرفی عملگرهای متفرقه در جاوا

عملگرهای دیگری نیز در جاوا وجود دارند که در ادامه آمده اند. این عملگرها در گروه های بالا قرار می گیرند.

  • عملگر شرطی (? :). این عملگر که به عنوان عملگر سه گانه نیز شناخته می شود برای ارزیابی یک مقدار boolean به کار می رود. این عملگر به این منظور به کار می رود که مشخص کند که کدام مقدار در عملوند سمت چپ انتساب قرار گیرد. اگر شرط عملگر درست باشد مقداری که پشت علامت سوال ؟ قرار می گیرد انتخاب می شود و در غیر این صورت مقدار موجود بعد از علامت دو نقطه : انتخاب خواهد شد. برای مثال به کد زیر دقت کنید.
public class Test {

   public static void main(String args[]){
      int a, b;
      a = 10;
      b = (a == 1) ? 20: 30;
      System.out.println( "Value of b is : " +  b );

      b = (a == 10) ? 20: 30;
      System.out.println( "Value of b is : " + b );
   }
}

خروجی این کد به شکل زیر خواهد بود

Value of b is : 30
Value of b is : 20

این عملگر یک عملگر تصمیم گیری است و به جای if else های راحت مورد استفاده قرار می گیرد.

  • عملگر instanceof این عملگر برای اشیا به کار می رود. این عملگر چک می کند که آیا شی مورد نظر یک نمونه از کلاس یا اینترفیس مشخص شده است یا خیر. اگر شی گفته شده از نوع کلاس یا اینترفیس مورد نظر باشد نتیجه true و در غیر این صورت نتیجه false خواهد بود. برای مثال به کد زیر دقت کنید.
public class Test {

   public static void main(String args[]){
      String name = "James";
      // following will return true since name is type of String
      boolean result = name instanceof String;  
      System.out.println( result );
   }
}

نتیجه کد بالا به شرح زیر خواهد بود

true

به مثال زیر نیز دقت کنید.

class Vehicle {}

public class Car extends Vehicle {
   public static void main(String args[]){
      Vehicle a = new Car();
      boolean result =  a instanceof Car;
      System.out.println( result );
   }
}

خروجی کد بالا هم true می باشد.

بررسی تقدم عملگرها در جاوا

نکته ای که باقی می ماند این است که بدانیم کدام یک از متغیر ها نسبت به قبلی دارای تقدم بیشتری در اجرا می باشد. تقدم عملگرها برای ارزیابی متغیرها بسیار مهم است. تقدم برخی متغیرها نسبت به برخی دیگر بالاتر است. برای مثال عملگر ضرب دارای تقدم بیشتری نسبت به جمع و تفریق است. برای مثال x=7+3*2 ابتدا عمل ضرب انجام می شوند و سپس عمل جمع انجام می شود که نتیجه عمل عدد 13 خواهد بود. در شکل زیر تقدم عملگرها از بالا به پایین نشان داده شده است.

با سلام به همه دوستان و همراهان Itpro.

!!عملگرهای بیتی
جاوا دارای چندین عملگر بیتی است که این عملگرها بر روی انواع داده int, long, short, char, byte قابل اعمال است. عملگرهای بیتی بر روی تک تک بیتهای عملوند ها کار می کنند. برای مثال در متغیر a مقدار 60 را قرار می دهیم و در متغیر b عدد 13 را قرار می دهیم. حال شکل باینری این دو متغیر به شکل زیر خواهد بود
<text>
a=00111100
b=00001101
<text>
در ادامه به بررسی این عملگرها می پردازیم. 
* عملگر and بیتی (&) این عملگر بیت های دو عملوند را دو به دو با هم and می کند و مقدار را مشخص می نماید برای مثال نتیجه and بیتی a&b برابر 12 خواهد بود که مقدار باینری آن 00001100 می باشد.
* عملگر or بیتی  این عملگر بیت های دو عملوند را دو به دو با هم or می نماید. برای مثال نتیجه عمل a|b برابر مقدار 61 یعنی عدد باینری 00111101 خواهد بود.
* عملگر xor بیتی (^) این عملگر بیت های دو عدد را با هم xor می نماید. یعنی اگر یکی از مقادیر مقدار یک و دیگری مقدار 0 داشته باشد جواب 1 و اگر هردو یکسان باشند جواب 0 می دهد. برای مثال نتیجه عمل a^b برابر 49 که معادل باینری آن 00110001 می باشد است.
* عملگر مکمل بیتی(~) این عملگر یک عملگر تک عملوندی است که بیت های عملوند خود را برعکس می کند یعنی اگر بیت مورد نظر 1 باشد آن را 0 و اگر 0 باشد آن را 1 می کند. برای مثال ~a برابر -61 با عدد باینری 11000011 است.
* عملوند شیفت به چپ (>>) این عملوند مقدار عدد را به تعداد گفته شده به سمت چپ شیفت بیتی می دهد. برای مثال اگر بخواهیم a را دو بار به سمت چپ شیفت بدهیم باید به این شکل بنویسیم.a<<2 در این صورت نتیجه برابر 240 خواهد بود زیرا که معادل باینری آن 11110000 می باشد.
* عملگر شیفت به راست(>>) این عملگر مقدار عدد را به تعداد گفته شده به راست شیفت می دهد. برای مثال نتیجه عمل a>>2 برابر مقدار 15 با عدد باینری 1111  خواهد شد.
* عملگر شیفت به راست با ورود 0 : عملگرهای شیفت به راست و شیفت به چپ که گفته شده مقدار عدد خارج شده را به عنوان مقدار ورودی شیفت وارد می کردند ولی عملگر شیفت به راست با ورودی 0 عدد را به سمت راست شیفت می دهد و مقدار صفر را از سمت چپ به آن وارد می نماید. برای مثال نتیجه عمل a>>>2 عدد 15 می باشد.
برای درک بهتر عملگرهای بیتی به کد زیر دقت کنید.
<java>
public class Test {

  public static void main(String args[]) {
     int a = 60;	/* 60 = 0011 1100 */  
     int b = 13;	/* 13 = 0000 1101 */
     int c = 0;

     c = a & b;       /* 12 = 0000 1100 */ 
     System.out.println(a & b =  + c );

     c = a | b;       /* 61 = 0011 1101 */
     System.out.println(a | b =  + c );

     c = a ^ b;       /* 49 = 0011 0001 */
     System.out.println(a ^ b =  + c );

     c = ~a;          /*-61 = 1100 0011 */
     System.out.println(~a =  + c );

     c = a << 2;     /* 240 = 1111 0000 */
     System.out.println(a << 2 =  + c );

     c = a >> 2;     /* 215 = 1111 */
     System.out.println(a >> 2  =  + c );

     c = a >>> 2;     /* 215 = 0000 1111 */
     System.out.println(a >>> 2 =  + c );
  }
} 

<java>
خروجی برنامه بالا به شکل زیر خواهد بود
<text>
a & b = 12
a | b = 61
a ^ b = 49
~a = -61
a << 2 = 240
a >> 2=15
a >>> 2=15

<text>

!!عملگرهای منطقی
عملگرهای منطقی بر روی داده های از نوع boolean و یا عباراتی که نتیجه boolean یعنی مقدار درست یا غلط دارند عمل می کنند. در ادامه به شرح این عملوند ها می پردازیم. برای مثال فرض کنید که دو متغیر a, b داریم که مقدار a برابر true و مقدار b برابر false  می باشد.
# عملگر and منطقی (&&) این عملگر در صورتی جواب true برمی گرداند که هردو عملوند چپ و راست آن true یا غیرصفر باشند. برای مثال نتیجه عمل a&&b مقدار false است.
# عملگر or منطقی  این عملگر در صورتی نتیجه true می دهد که یکی از عملوند ها true یا غیر صفر باشد. برای مثال نتیجه عمل a||b مقدار true است.
# عملگر نقیض منطقی(!)  این عملگر یک عملگر تک عملوندی است. اگر عملوند این عملگر درست باشد مقدار False و در غیر این صورت مقدار true برمی گرداند. برای مثال حاصل عبارت !(a&&b) مقدار true می باشد.
برای مثال به کد زیر دقت نمایید.
<java>
public class Test {

  public static void main(String args[]) {
     boolean a = true;	
     boolean b = false;	

     System.out.println(a && b =  + (a&&b));

     System.out.println(a || b =  + (a||b) );

     System.out.println(!(a && b) =  + !(a && b));
  }
} 
<java>
خروجی کد به شکل زیر است
<text>
a && b = false
a || b = true
!(a && b) = true
<text>

!!عملگرهای انتسابی
عملگرهای انتسابی که توسط جاوا پشتیبانی می شوند عبارتند از:
* عملگر انتساب(=) این عملگر مقدار سمت راست عملگر را در عملوند سمت چپ می ریزد. برای مثال C=A+B مقدار C برابر با جمع A و B خواهد بود.
* عملگر جمع و انتساب(+=) این عملگر به این شکل عمل می کند که ابتدا عملوند سمت راست را با عملوند سمت چپ جمع نموده و در عملوند سمت چپ ذخیره می نماید. برای مثال C+=A معادل C=C+A می باشد.
* عملگر تفریق و انتساب(-=) مانند همان عملگر جمع و انتساب عمل می کند با این تفاوت که عملوند سمت راست را از عملوند سمت چپ کم کرده و ذخیره می کند. برای مثال عمل C-=A معادل C=C-A می باشد.
* عملگر ضرب و انتساب(*=) و عملگر (/=) و عملگر (%=) معادل اعمال قبلی هستند.
* عملگر های >>= و <<= و &= و ^= و |= نیز اعمال بیتی گفته شده را به انضمام انتساب انجام می دهند.
برای مثال و درک بهتر عملگرهای انتساب به مثال زیر دقت نمایید.
<java>
public class Test {

  public static void main(String args[]) {
     int a = 10;	
     int b = 20;
     int c = 0;

     c = a + b;
     System.out.println(c = a + b =  + c );

     c += a ;
     System.out.println(c += a  =  + c );

     c -= a ;
     System.out.println(c -= a =  + c );

     c *= a ;
     System.out.println(c *= a =  + c );

     a = 10;
     c = 15;
     c /= a ;
     System.out.println(c /= a =  + c );

     a = 10;
     c = 15;
     c %= a ;
     System.out.println(c %= a  =  + c );

     c <<= 2 ;
     System.out.println(c <<= 2 =  + c );

     c >>= 2 ;
     System.out.println(c >>= 2 =  + c );

     c >>= 2 ;
     System.out.println(c >>= a =  + c );

     c &= a ;
     System.out.println(c &= 2  =  + c );
  
     c ^= a ;
     System.out.println(c ^= a   =  + c );

     c |= a ;
     System.out.println(c |= a   =  + c );
  }
} 

<java>
خروجی کد بالا به شکل زیر است:
<text>
c = a + b = 30
c += a  = 40
c -= a = 30
c *= a = 300
c /= a = 1
c %= a  = 5
c <<= 2 = 20
c >>= 2 = 5
c >>= 2 = 1
c &= a  = 0
c ^= a   = 10
c |= a   = 10

<text>

!!عملگرهای متفرقه
عملگرهای دیگری نیز در جاوا وجود دارند که در ادامه آمده اند. این عملگرها در گروه های بالا قرار می گیرند.
* عملگر شرطی (? :). این عملگر که به عنوان عملگر سه گانه نیز شناخته می شود برای ارزیابی یک مقدار boolean به کار می رود. این عملگر به این منظور به کار می رود که مشخص کند که کدام مقدار در عملوند سمت چپ انتساب قرار گیرد. اگر شرط عملگر درست باشد مقداری که پشت علامت سوال ؟ قرار می گیرد انتخاب می شود و در غیر این صورت مقدار موجود بعد از علامت دو نقطه : انتخاب خواهد شد.  برای مثال به کد زیر دقت کنید.
<java>
public class Test {

   public static void main(String args[]){
      int a, b;
      a = 10;
      b = (a == 1) ? 20: 30;
      System.out.println( Value of b is :  +  b );

      b = (a == 10) ? 20: 30;
      System.out.println( Value of b is :  + b );
   }
}

<java>
خروجی این کد به شکل زیر خواهد بود
<text>
Value of b is : 30
Value of b is : 20

<text>
این عملگر یک عملگر تصمیم گیری است و به جای if else های راحت مورد استفاده قرار می گیرد.
* عملگر instanceof  این عملگر برای اشیا به کار می رود. این عملگر چک می کند که آیا شی مورد نظر یک نمونه از کلاس یا اینترفیس مشخص شده است یا خیر. اگر شی گفته شده از نوع کلاس یا اینترفیس مورد نظر باشد نتیجه true و در غیر این صورت نتیجه false خواهد بود. برای مثال به کد زیر دقت کنید.
<java>
public class Test {

   public static void main(String args[]){
      String name = James;
      // following will return true since name is type of String
      boolean result = name instanceof String;  
      System.out.println( result );
   }
}

<java>
نتیجه کد بالا به شرح زیر خواهد بود
<text>
true
<text>
به مثال زیر نیز دقت کنید.
<java>
class Vehicle {}

public class Car extends Vehicle {
   public static void main(String args[]){
      Vehicle a = new Car();
      boolean result =  a instanceof Car;
      System.out.println( result );
   }
}

<java>
خروجی کد بالا هم true می باشد.

!!تقدم عملگرها
نکته ای که باقی می ماند این است که بدانیم کدام یک از متغیر ها نسبت به قبلی دارای تقدم بیشتری در اجرا می باشد. تقدم عملگرها برای ارزیابی متغیرها بسیار مهم است. تقدم برخی متغیرها نسبت به برخی دیگر بالاتر است. برای مثال عملگر ضرب دارای تقدم بیشتری نسبت به جمع و تفریق است. برای مثال x=7+3*2 ابتدا عمل ضرب انجام می شوند و سپس عمل جمع انجام می شود که نتیجه عمل عدد 13 خواهد بود. در شکل زیر تقدم عملگرها از بالا به پایین نشان داده شده است.
||http://tosinso.com/files/get/31219c1a-6b9f-4016-8954-ccc836705fb8||

*Itpro باشید*

نویسنده: مهدی عادلی فر
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

حلقه های تکرار

کدها در زبانهای برنامه نویسی مانند جاوا به ترتیب و خطی اجرا می شوند. به این معنی که از متد main شروع شده و خط به خط اجرا می شوند. حال ممکن است که حالاتی پیش بیاید که بخواهیم یک قسمت از کد چند بار اجرا شود. زبان های برنامه نویسی راه های مختلفی فراهم کرده اند که این نوع اجرا خطی را تغییر دهد. یکی از این راه ها حلقه های تکرار(loop) هستند. حلقه ها می توانند که یک سری دستورات را چندین بار اجرا کنند. در بسیاری از زبان های برنامه نویسی فلوچارت حلقه تکرار به شکل زیر است:

با سلام به همه دوستان و همراهان Itpro. کدها در زبانهای برنامه نویسی مانند جاوا به ترتیب و خطی اجرا می شوند. به این معنی که از متد main شروع شده و خط به خط اجرا می شوند. حال ممکن است که حالاتی پیش بیاید که بخواهیم یک قسمت از کد چند بار اجرا شود. زبان های برنامه نویسی راه های مختلفی فراهم کرده اند که این نوع اجرا خطی را تغییر دهد. یکی از این راه ها حلقه های تکرار(loop) هستند. حلقه ها می توانند که یک سری دستورات را چندین بار اجرا کنند. در بسیاری از زبان های برنامه نویسی فلوچارت حلقه تکرار به شکل زیر است:
||http://tosinso.com/files/get/e7a02b4c-5aa5-4621-9e90-00c901f35b4e||
زبان برنامه نویسی جاوا حلقه های متفاوتی برای استفاده دارد که هرکدام می تواند در شرایط مربوط به خود مفید و کاربردی باشد که عبارتند از:

!!حلقه while 
حلقه while در زبان جاوا تا وقتی که شرطش درست باشد یک قسمت از کد را اجرا می کند و وقتی که شرط آن false شد از اجرا باز می ایستد. نحوه نوشتن کد این حلقه به شکل زیر است:
<java>
while(عبارت شرطی)
{
   //دستورات حلقه که باید تکرار شوند
}
<java>
دستورات داخل حلقه می تواند یک خط دستور باشند یا یک بلوک کد باشند. عبارت شرطی ممکن است که یک متغیر باشد و یا چندین عبارت شرطی باشد و یا مقادیر true و یا false باشد و به طور کلی هرچیزی که مقدار true یا false برمی گرداند می تواند باشد. هنگامی که نتیجه عبارت شرطی while درست باشد کد داخل حلقه اجرا خواهد شد و اگر false باشد اجرا نمی شود. نمودار دیاگرام این حلقه در شکل زیر آمده است:
||http://tosinso.com/files/get/5b410259-44f8-4976-88d3-7def747194c5||
نکته ای که وجود دارد این است که ممکن است که یک حلقه while  اصلا اجرا نشود. این در حالی است که شرط حلقه همان اول کار false باشد دراین حالت بدنه حلقه اصلا اجرا نخواهد شد و به کل نادیده گرفته می شود. برای مثال به کد زیر توجه کنید:
<java>
public class Test {

   public static void main(String args[]) {
      int x = 10;

      while( x < 20 ) {
         System.out.print(value of x :  + x );
         x++;
         System.out.print(\n);
		 System.out.print(ITPRO\n);
      }
   }
}
<java>
و نتیجه اجرای آن به شکل زیر خواهد بود:
<text>
value of x : 10
ITPRO
value of x : 11
ITPRO
value of x : 12
ITPRO
value of x : 13
ITPRO
value of x : 14
ITPRO
value of x : 15
ITPRO
value of x : 16
ITPRO
value of x : 17
ITPRO
value of x : 18
ITPRO
value of x : 19
ITPRO
<text>

!!حلقه for
اگر شما می خواهید که قطعه کدی از برنامه شما به تعداد خاصی تکرار شود از حلقه for استفاده می کنیم. این حلقه در زمانی که از قبل می دانیم که یک قطعه کد چند بار اجرا خواهد شد مناسب است.شکل نوشتاری این حلقه به شکل زیر است:
<java>
for(initialization; Boolean_expression; update)
{
   //قطعه کد تکرار شونده
}
<java>
هریک از قسمت های موجود در این حلقه را در ادامه شرح می دهیم:
# بخش initialization در ابتدا اجرا می شود. این قسمت در کل حلقه فقط یک بار اجرا خواهد شد. این مرحله به شما این اجازه ره می دهد که مقدمات اجرای حلقه را فراهم کنید. به عبارت دیگر متغیری که قرار است حلقه را کنترل کند را در این بخش معرفی و مقداردهی می کنیم. پس بخش initialization باید علامت سمی کالن (;)  استفاده کنید.
# قسمت دوم Boolean Expression می باشد. در این بخش یک عبارت شرطی وجود دارد که اگر نتیجه این بخش true باشد حلقه اجرا خواهد شد و اگر false باشد حلقه اجرا نمی شود. در این بخش می توان متغیر کنترل کننده حلقه را چک کرد.
# پس از این که بدن حلقه یعنی همان قطعه کد اجرا شونده اجرا شود قسمت update اجرا خواهد شد. دقت داشته باشید که قسمت update هر بار پس از اجرای بدنه حلقه اجرا می شود. در قسمت update می توانید اعمالی مانند زیاد یا کم کردن متغیر کنترل کردن حلقه در این قسمت انجام می شود. این قسمت از حلقه حتی می تواند خالی باشد. 

زمانی که قسمت Boolean expression مقدار false برگرداند حلقه دیگر اجرا نمی شود. نمودار دیاگرام این حلقه به شکل زیر است:
||http://tosinso.com/files/get/e7e44d1f-e198-4b76-a5f8-c2471cd60afd||
به مثال زیر توجه کنید:

<java>
public class Test {

   public static void main(String args[]) {

      for(int x = 10; x < 20; x = x+1) {
         System.out.print(value of x :  + x );
         System.out.print(\n);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19
<text>
همان طور که در کد می بینید قسمت initialization این حلقه یک متغیر از نوع int با نام x تعریف شده است و مقدار آن 10 می باشد. همچنین عبارت شرطی این حلقه x<20 می باشد. همچنین در قسمت update این حلقه یک واحد به x اضافه شده است.

!!حلقه do…while
این حلقه بسیار شبیه به while می باشد. تنها تفاوتی که بین این دو حلقه وجود دارد این است که شرط حلقه در انتها چک می شود. به همین دلیل کد بدنه حلقه حداقل یک بار حتما اجرا می شود. کد این حلقه به شکل زیر است:
<java>
do
{
   //بدنه حلقه
}while(شرط حلقه);
<java>
همانگونه که می بینید شرط حلقه در انتها است پس یک بار بدنه حلقه اجرا می شود. وقتی که به شرط حلقه می رسیم اگر مقدار true داشته باشد دوباره به ابتدای بدنه بازمی گردیم و دوباره حلقه اجرا می شود. اما اگر شرط حلقه false باشد بازگشت انجام نمی شود و از حلقه خارج می شویم. دیاگرام این حلقه به شکل زیر است:
||http://tosinso.com/files/get/5b410259-44f8-4976-88d3-7def747194c5||
برای مثال این حلقه به شکل زیر توجه نمایید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 10;

      do{
         System.out.print(value of x :  + x );
         x++;
         System.out.print(\n);
      }while( x < 20 );
   }
}
<java>
نتیجه اجرای کد بالا به شکل زیر خواهد بود:
<text>
value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19
<text>

!!عبارات کنترل کننده حلقه ها
همان گونه که توضیح دادیم حلقه ها یک قسمت از کد را تکرار می کنند. حال اگر بخواهیم در حالت هایی حلقه در وسط اجرا تمام شود و از حلقه خارج شویم. یا بخواهیم برخی دستورات را اجرا نکند. برای این کار از برخی عبارات کنترل کننده حلقه ها استفاده می کنیم که در ادامه به شرح آنها می پردازیم:

!!دستور break
دستور break در زبان جاوا دو کاربرد دارد.
# وقتی که در اجرای حلقه به خط break می نویسیم حلقه در همان نقطه تمام شده و خارج می شود. و برنامه از خط بعد از حلقه ادامه پیدا می کند.
# در بلوک switch مورد استفاده قرار می گیرد که شرط case ها از یکدیگر جدا باشد که این بخش را در مطالب آینده توضیح خواهیم داد.
نحوه نوشتن این دستور به شکل زیر است:
<java>
break;
<java>
دیاگرام این دستور به شکل زیر است:
||http://tosinso.com/files/get/03dbd797-90c7-4352-a8d8-1e4cc957e9c6||
برای مثال به کد زیر دقت کنید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 10;

      for(int x=5;x<100;x=x+5){
         System.out.print(value of x :  + x );
       if(x==20)
		   break;
         System.out.print(\n);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر است
<text>
value of x : 5
value of x : 10
value of x : 15
value of x : 20
<text>
در حلقه بالا گفته ایم که تا وقتی که x کوچکتراز 100 باشد حلقه باید اجرا شود. ولی در داخل بدنه حلقه گفته ایم که اگر x برابر 20 بود اجرای حلقه تمام شود.

!!دستور continue
این دستور در همه ی حلقه ها قابل استفاده است. نحوه کار این دستور به این شکل است که در هنگام اجرای حلقه وقتی که به این دستور میرسیم در هر جای حلقه قرار داشته باشیم ادامه اجرا لغو می شود و به ابتدای حلقه بازمی گردیم. دقت داشته باشید که اگر در داخل حلقه for قرار داشته باشیم بخش update پس از رسیدن به continue اجرا خواهد شد و سپس شرط حلقه چک می شود. همچنین اگر در حلقه while  یا do…while باشد وقتی به دستور continue می رسیم به ابتدای حلقه رفته و شرط حلقه چک می شود. شکل نوشتاری این دستور به شکل زیر است:
<java>
continue;
<java>
دیاگرام این دستور به شکل زیر خواهد بود:
||http://tosinso.com/files/get/85362838-a9ab-4d26-9d81-89637bad5e01||
مثالی از این دستور در ادامه آمده است:
<java>
public class Test {

   public static void main(String args[]){
        for(int x=5;x<35;x=x+5){
         
       if(x==20)
		   continue;
	   System.out.print(value of x :  + x );
        System.out.print(\n);
      }
   }
}
<java>
نتیجه اجرای کد به شرح زیر است:
<text>
value of x : 5
value of x : 10
value of x : 15
value of x : 25
value of x : 30
<text>
همانطور که مشاهده می کنید وقتی که مقدار x برابر 20 می شود دستور continue اجرا نمی شود و دوباره به ابتدای حلقه بازگشت داده می شود و مقدار 20 چاپ نمی شود.

!!شکل پیشرفته حلقه for
در نسخه 5 جاوا یک حلقه for جدید معرفی شد. این حلقه برای پیمایش مجموعه ها و لیست ها و آرایه ها به کار می رود. به این معنی که تک تک اعضای مجموعه را یکی یکی پیمایش می کند. شکل نوشتاری این حلقه به صورت زیر است:
<java>
for(declaration : expression)
{
   //Statements
}

<java>
# در قسمت declaration باید یک متغیر تعریف کنیم. نوع این متغیر باید متناسب با نوع آیتم های مجموعه مورد نظر باشد. برای مثال اگر قصد پیمایش لیستی از اعداد صحیح داریم این متغیر باید از نوع int باشد.
# در قسمت expression باید نام مجموعه مورد نظر که می خواهیم آن را پیمایش کنیم آورده شود. این مجموعه می تواند یک آرایه باشد یا حتی می تواند یک متد باشد که مقدار بازگشتی آن آرایه باشد. برای مثال به کد زیر دقت کنید:
<java>
public class Test {

   public static void main(String args[]){
      int [] numbers = {10, 20, 30, 40, 50};

      for(int x : numbers ){
         System.out.print( x );
         System.out.print(,);
      }
      System.out.print(\n);
      String [] names ={James, Larry, Tom, Lacy};
      for( String name : names ) {
         System.out.print( name );
         System.out.print(,);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
10,20,30,40,50,
James,Larry,Tom,Lacy,
<text>
حلقه ها یکی از راه های تغییر مسیر اجرای برنامه می باشند. در مطالب بعدی نیز راه های دیگری برای تغییر مسیر اجرای برنامه و کنترل اجرای آن معرفی خواهیم کرد *Itpro باشید*

نویسنده: مهدی عادلی فر
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

زبان برنامه نویسی جاوا حلقه های متفاوتی برای استفاده دارد که هرکدام می تواند در شرایط مربوط به خود مفید و کاربردی باشد که عبارتند از:

آموزش استفاده از حلقه while

حلقه while در زبان جاوا تا وقتی که شرطش درست باشد یک قسمت از کد را اجرا می کند و وقتی که شرط آن false شد از اجرا باز می ایستد. نحوه نوشتن کد این حلقه به شکل زیر است:

while(عبارت شرطی)
{
   //دستورات حلقه که باید تکرار شوند
}

دستورات داخل حلقه می تواند یک خط دستور باشند یا یک بلوک کد باشند. عبارت شرطی ممکن است که یک متغیر باشد و یا چندین عبارت شرطی باشد و یا مقادیر true و یا false باشد و به طور کلی هرچیزی که مقدار true یا false برمی گرداند می تواند باشد. هنگامی که نتیجه عبارت شرطی while درست باشد کد داخل حلقه اجرا خواهد شد و اگر false باشد اجرا نمی شود. نمودار دیاگرام این حلقه در شکل زیر آمده است:

با سلام به همه دوستان و همراهان Itpro. کدها در زبانهای برنامه نویسی مانند جاوا به ترتیب و خطی اجرا می شوند. به این معنی که از متد main شروع شده و خط به خط اجرا می شوند. حال ممکن است که حالاتی پیش بیاید که بخواهیم یک قسمت از کد چند بار اجرا شود. زبان های برنامه نویسی راه های مختلفی فراهم کرده اند که این نوع اجرا خطی را تغییر دهد. یکی از این راه ها حلقه های تکرار(loop) هستند. حلقه ها می توانند که یک سری دستورات را چندین بار اجرا کنند. در بسیاری از زبان های برنامه نویسی فلوچارت حلقه تکرار به شکل زیر است:
||http://tosinso.com/files/get/e7a02b4c-5aa5-4621-9e90-00c901f35b4e||
زبان برنامه نویسی جاوا حلقه های متفاوتی برای استفاده دارد که هرکدام می تواند در شرایط مربوط به خود مفید و کاربردی باشد که عبارتند از:

!!حلقه while 
حلقه while در زبان جاوا تا وقتی که شرطش درست باشد یک قسمت از کد را اجرا می کند و وقتی که شرط آن false شد از اجرا باز می ایستد. نحوه نوشتن کد این حلقه به شکل زیر است:
<java>
while(عبارت شرطی)
{
   //دستورات حلقه که باید تکرار شوند
}
<java>
دستورات داخل حلقه می تواند یک خط دستور باشند یا یک بلوک کد باشند. عبارت شرطی ممکن است که یک متغیر باشد و یا چندین عبارت شرطی باشد و یا مقادیر true و یا false باشد و به طور کلی هرچیزی که مقدار true یا false برمی گرداند می تواند باشد. هنگامی که نتیجه عبارت شرطی while درست باشد کد داخل حلقه اجرا خواهد شد و اگر false باشد اجرا نمی شود. نمودار دیاگرام این حلقه در شکل زیر آمده است:
||http://tosinso.com/files/get/5b410259-44f8-4976-88d3-7def747194c5||
نکته ای که وجود دارد این است که ممکن است که یک حلقه while  اصلا اجرا نشود. این در حالی است که شرط حلقه همان اول کار false باشد دراین حالت بدنه حلقه اصلا اجرا نخواهد شد و به کل نادیده گرفته می شود. برای مثال به کد زیر توجه کنید:
<java>
public class Test {

   public static void main(String args[]) {
      int x = 10;

      while( x < 20 ) {
         System.out.print(value of x :  + x );
         x++;
         System.out.print(\n);
		 System.out.print(ITPRO\n);
      }
   }
}
<java>
و نتیجه اجرای آن به شکل زیر خواهد بود:
<text>
value of x : 10
ITPRO
value of x : 11
ITPRO
value of x : 12
ITPRO
value of x : 13
ITPRO
value of x : 14
ITPRO
value of x : 15
ITPRO
value of x : 16
ITPRO
value of x : 17
ITPRO
value of x : 18
ITPRO
value of x : 19
ITPRO
<text>

!!حلقه for
اگر شما می خواهید که قطعه کدی از برنامه شما به تعداد خاصی تکرار شود از حلقه for استفاده می کنیم. این حلقه در زمانی که از قبل می دانیم که یک قطعه کد چند بار اجرا خواهد شد مناسب است.شکل نوشتاری این حلقه به شکل زیر است:
<java>
for(initialization; Boolean_expression; update)
{
   //قطعه کد تکرار شونده
}
<java>
هریک از قسمت های موجود در این حلقه را در ادامه شرح می دهیم:
# بخش initialization در ابتدا اجرا می شود. این قسمت در کل حلقه فقط یک بار اجرا خواهد شد. این مرحله به شما این اجازه ره می دهد که مقدمات اجرای حلقه را فراهم کنید. به عبارت دیگر متغیری که قرار است حلقه را کنترل کند را در این بخش معرفی و مقداردهی می کنیم. پس بخش initialization باید علامت سمی کالن (;)  استفاده کنید.
# قسمت دوم Boolean Expression می باشد. در این بخش یک عبارت شرطی وجود دارد که اگر نتیجه این بخش true باشد حلقه اجرا خواهد شد و اگر false باشد حلقه اجرا نمی شود. در این بخش می توان متغیر کنترل کننده حلقه را چک کرد.
# پس از این که بدن حلقه یعنی همان قطعه کد اجرا شونده اجرا شود قسمت update اجرا خواهد شد. دقت داشته باشید که قسمت update هر بار پس از اجرای بدنه حلقه اجرا می شود. در قسمت update می توانید اعمالی مانند زیاد یا کم کردن متغیر کنترل کردن حلقه در این قسمت انجام می شود. این قسمت از حلقه حتی می تواند خالی باشد. 

زمانی که قسمت Boolean expression مقدار false برگرداند حلقه دیگر اجرا نمی شود. نمودار دیاگرام این حلقه به شکل زیر است:
||http://tosinso.com/files/get/e7e44d1f-e198-4b76-a5f8-c2471cd60afd||
به مثال زیر توجه کنید:

<java>
public class Test {

   public static void main(String args[]) {

      for(int x = 10; x < 20; x = x+1) {
         System.out.print(value of x :  + x );
         System.out.print(\n);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19
<text>
همان طور که در کد می بینید قسمت initialization این حلقه یک متغیر از نوع int با نام x تعریف شده است و مقدار آن 10 می باشد. همچنین عبارت شرطی این حلقه x<20 می باشد. همچنین در قسمت update این حلقه یک واحد به x اضافه شده است.

!!حلقه do…while
این حلقه بسیار شبیه به while می باشد. تنها تفاوتی که بین این دو حلقه وجود دارد این است که شرط حلقه در انتها چک می شود. به همین دلیل کد بدنه حلقه حداقل یک بار حتما اجرا می شود. کد این حلقه به شکل زیر است:
<java>
do
{
   //بدنه حلقه
}while(شرط حلقه);
<java>
همانگونه که می بینید شرط حلقه در انتها است پس یک بار بدنه حلقه اجرا می شود. وقتی که به شرط حلقه می رسیم اگر مقدار true داشته باشد دوباره به ابتدای بدنه بازمی گردیم و دوباره حلقه اجرا می شود. اما اگر شرط حلقه false باشد بازگشت انجام نمی شود و از حلقه خارج می شویم. دیاگرام این حلقه به شکل زیر است:
||http://tosinso.com/files/get/5b410259-44f8-4976-88d3-7def747194c5||
برای مثال این حلقه به شکل زیر توجه نمایید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 10;

      do{
         System.out.print(value of x :  + x );
         x++;
         System.out.print(\n);
      }while( x < 20 );
   }
}
<java>
نتیجه اجرای کد بالا به شکل زیر خواهد بود:
<text>
value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19
<text>

!!عبارات کنترل کننده حلقه ها
همان گونه که توضیح دادیم حلقه ها یک قسمت از کد را تکرار می کنند. حال اگر بخواهیم در حالت هایی حلقه در وسط اجرا تمام شود و از حلقه خارج شویم. یا بخواهیم برخی دستورات را اجرا نکند. برای این کار از برخی عبارات کنترل کننده حلقه ها استفاده می کنیم که در ادامه به شرح آنها می پردازیم:

!!دستور break
دستور break در زبان جاوا دو کاربرد دارد.
# وقتی که در اجرای حلقه به خط break می نویسیم حلقه در همان نقطه تمام شده و خارج می شود. و برنامه از خط بعد از حلقه ادامه پیدا می کند.
# در بلوک switch مورد استفاده قرار می گیرد که شرط case ها از یکدیگر جدا باشد که این بخش را در مطالب آینده توضیح خواهیم داد.
نحوه نوشتن این دستور به شکل زیر است:
<java>
break;
<java>
دیاگرام این دستور به شکل زیر است:
||http://tosinso.com/files/get/03dbd797-90c7-4352-a8d8-1e4cc957e9c6||
برای مثال به کد زیر دقت کنید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 10;

      for(int x=5;x<100;x=x+5){
         System.out.print(value of x :  + x );
       if(x==20)
		   break;
         System.out.print(\n);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر است
<text>
value of x : 5
value of x : 10
value of x : 15
value of x : 20
<text>
در حلقه بالا گفته ایم که تا وقتی که x کوچکتراز 100 باشد حلقه باید اجرا شود. ولی در داخل بدنه حلقه گفته ایم که اگر x برابر 20 بود اجرای حلقه تمام شود.

!!دستور continue
این دستور در همه ی حلقه ها قابل استفاده است. نحوه کار این دستور به این شکل است که در هنگام اجرای حلقه وقتی که به این دستور میرسیم در هر جای حلقه قرار داشته باشیم ادامه اجرا لغو می شود و به ابتدای حلقه بازمی گردیم. دقت داشته باشید که اگر در داخل حلقه for قرار داشته باشیم بخش update پس از رسیدن به continue اجرا خواهد شد و سپس شرط حلقه چک می شود. همچنین اگر در حلقه while  یا do…while باشد وقتی به دستور continue می رسیم به ابتدای حلقه رفته و شرط حلقه چک می شود. شکل نوشتاری این دستور به شکل زیر است:
<java>
continue;
<java>
دیاگرام این دستور به شکل زیر خواهد بود:
||http://tosinso.com/files/get/85362838-a9ab-4d26-9d81-89637bad5e01||
مثالی از این دستور در ادامه آمده است:
<java>
public class Test {

   public static void main(String args[]){
        for(int x=5;x<35;x=x+5){
         
       if(x==20)
		   continue;
	   System.out.print(value of x :  + x );
        System.out.print(\n);
      }
   }
}
<java>
نتیجه اجرای کد به شرح زیر است:
<text>
value of x : 5
value of x : 10
value of x : 15
value of x : 25
value of x : 30
<text>
همانطور که مشاهده می کنید وقتی که مقدار x برابر 20 می شود دستور continue اجرا نمی شود و دوباره به ابتدای حلقه بازگشت داده می شود و مقدار 20 چاپ نمی شود.

!!شکل پیشرفته حلقه for
در نسخه 5 جاوا یک حلقه for جدید معرفی شد. این حلقه برای پیمایش مجموعه ها و لیست ها و آرایه ها به کار می رود. به این معنی که تک تک اعضای مجموعه را یکی یکی پیمایش می کند. شکل نوشتاری این حلقه به صورت زیر است:
<java>
for(declaration : expression)
{
   //Statements
}

<java>
# در قسمت declaration باید یک متغیر تعریف کنیم. نوع این متغیر باید متناسب با نوع آیتم های مجموعه مورد نظر باشد. برای مثال اگر قصد پیمایش لیستی از اعداد صحیح داریم این متغیر باید از نوع int باشد.
# در قسمت expression باید نام مجموعه مورد نظر که می خواهیم آن را پیمایش کنیم آورده شود. این مجموعه می تواند یک آرایه باشد یا حتی می تواند یک متد باشد که مقدار بازگشتی آن آرایه باشد. برای مثال به کد زیر دقت کنید:
<java>
public class Test {

   public static void main(String args[]){
      int [] numbers = {10, 20, 30, 40, 50};

      for(int x : numbers ){
         System.out.print( x );
         System.out.print(,);
      }
      System.out.print(\n);
      String [] names ={James, Larry, Tom, Lacy};
      for( String name : names ) {
         System.out.print( name );
         System.out.print(,);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
10,20,30,40,50,
James,Larry,Tom,Lacy,
<text>
حلقه ها یکی از راه های تغییر مسیر اجرای برنامه می باشند. در مطالب بعدی نیز راه های دیگری برای تغییر مسیر اجرای برنامه و کنترل اجرای آن معرفی خواهیم کرد *Itpro باشید*

نویسنده: مهدی عادلی فر
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

نکته ای که وجود دارد این است که ممکن است که یک حلقه while اصلا اجرا نشود. این در حالی است که شرط حلقه همان اول کار false باشد دراین حالت بدنه حلقه اصلا اجرا نخواهد شد و به کل نادیده گرفته می شود. برای مثال به کد زیر توجه کنید:

public class Test {

   public static void main(String args[]) {
      int x = 10;

      while( x < 20 ) {
         System.out.print("value of x : " + x );
         x++;
         System.out.print("\n");
		 System.out.print("ITPRO\n");
      }
   }
}

و نتیجه اجرای آن به شکل زیر خواهد بود:

value of x : 10
ITPRO
value of x : 11
ITPRO
value of x : 12
ITPRO
value of x : 13
ITPRO
value of x : 14
ITPRO
value of x : 15
ITPRO
value of x : 16
ITPRO
value of x : 17
ITPRO
value of x : 18
ITPRO
value of x : 19
ITPRO

آموزش استفاده از حلقه for

اگر شما می خواهید که قطعه کدی از برنامه شما به تعداد خاصی تکرار شود از حلقه for استفاده می کنیم. این حلقه در زمانی که از قبل می دانیم که یک قطعه کد چند بار اجرا خواهد شد مناسب است.شکل نوشتاری این حلقه به شکل زیر است:

for(initialization; Boolean_expression; update)
{
   //قطعه کد تکرار شونده
}

هریک از قسمت های موجود در این حلقه را در ادامه شرح می دهیم:

  1. بخش initialization در ابتدا اجرا می شود. این قسمت در کل حلقه فقط یک بار اجرا خواهد شد. این مرحله به شما این اجازه ره می دهد که مقدمات اجرای حلقه را فراهم کنید. به عبارت دیگر متغیری که قرار است حلقه را کنترل کند را در این بخش معرفی و مقداردهی می کنیم. پس بخش initialization باید علامت سمی کالن (;) استفاده کنید.
  2. قسمت دوم Boolean Expression می باشد. در این بخش یک عبارت شرطی وجود دارد که اگر نتیجه این بخش true باشد حلقه اجرا خواهد شد و اگر false باشد حلقه اجرا نمی شود. در این بخش می توان متغیر کنترل کننده حلقه را چک کرد.
  3. پس از این که بدن حلقه یعنی همان قطعه کد اجرا شونده اجرا شود قسمت update اجرا خواهد شد. دقت داشته باشید که قسمت update هر بار پس از اجرای بدنه حلقه اجرا می شود. در قسمت update می توانید اعمالی مانند زیاد یا کم کردن متغیر کنترل کردن حلقه در این قسمت انجام می شود. این قسمت از حلقه حتی می تواند خالی باشد.

زمانی که قسمت Boolean expression مقدار false برگرداند حلقه دیگر اجرا نمی شود. نمودار دیاگرام این حلقه به شکل زیر است:

با سلام به همه دوستان و همراهان Itpro. کدها در زبانهای برنامه نویسی مانند جاوا به ترتیب و خطی اجرا می شوند. به این معنی که از متد main شروع شده و خط به خط اجرا می شوند. حال ممکن است که حالاتی پیش بیاید که بخواهیم یک قسمت از کد چند بار اجرا شود. زبان های برنامه نویسی راه های مختلفی فراهم کرده اند که این نوع اجرا خطی را تغییر دهد. یکی از این راه ها حلقه های تکرار(loop) هستند. حلقه ها می توانند که یک سری دستورات را چندین بار اجرا کنند. در بسیاری از زبان های برنامه نویسی فلوچارت حلقه تکرار به شکل زیر است:
||http://tosinso.com/files/get/e7a02b4c-5aa5-4621-9e90-00c901f35b4e||
زبان برنامه نویسی جاوا حلقه های متفاوتی برای استفاده دارد که هرکدام می تواند در شرایط مربوط به خود مفید و کاربردی باشد که عبارتند از:

!!حلقه while 
حلقه while در زبان جاوا تا وقتی که شرطش درست باشد یک قسمت از کد را اجرا می کند و وقتی که شرط آن false شد از اجرا باز می ایستد. نحوه نوشتن کد این حلقه به شکل زیر است:
<java>
while(عبارت شرطی)
{
   //دستورات حلقه که باید تکرار شوند
}
<java>
دستورات داخل حلقه می تواند یک خط دستور باشند یا یک بلوک کد باشند. عبارت شرطی ممکن است که یک متغیر باشد و یا چندین عبارت شرطی باشد و یا مقادیر true و یا false باشد و به طور کلی هرچیزی که مقدار true یا false برمی گرداند می تواند باشد. هنگامی که نتیجه عبارت شرطی while درست باشد کد داخل حلقه اجرا خواهد شد و اگر false باشد اجرا نمی شود. نمودار دیاگرام این حلقه در شکل زیر آمده است:
||http://tosinso.com/files/get/5b410259-44f8-4976-88d3-7def747194c5||
نکته ای که وجود دارد این است که ممکن است که یک حلقه while  اصلا اجرا نشود. این در حالی است که شرط حلقه همان اول کار false باشد دراین حالت بدنه حلقه اصلا اجرا نخواهد شد و به کل نادیده گرفته می شود. برای مثال به کد زیر توجه کنید:
<java>
public class Test {

   public static void main(String args[]) {
      int x = 10;

      while( x < 20 ) {
         System.out.print(value of x :  + x );
         x++;
         System.out.print(\n);
		 System.out.print(ITPRO\n);
      }
   }
}
<java>
و نتیجه اجرای آن به شکل زیر خواهد بود:
<text>
value of x : 10
ITPRO
value of x : 11
ITPRO
value of x : 12
ITPRO
value of x : 13
ITPRO
value of x : 14
ITPRO
value of x : 15
ITPRO
value of x : 16
ITPRO
value of x : 17
ITPRO
value of x : 18
ITPRO
value of x : 19
ITPRO
<text>

!!حلقه for
اگر شما می خواهید که قطعه کدی از برنامه شما به تعداد خاصی تکرار شود از حلقه for استفاده می کنیم. این حلقه در زمانی که از قبل می دانیم که یک قطعه کد چند بار اجرا خواهد شد مناسب است.شکل نوشتاری این حلقه به شکل زیر است:
<java>
for(initialization; Boolean_expression; update)
{
   //قطعه کد تکرار شونده
}
<java>
هریک از قسمت های موجود در این حلقه را در ادامه شرح می دهیم:
# بخش initialization در ابتدا اجرا می شود. این قسمت در کل حلقه فقط یک بار اجرا خواهد شد. این مرحله به شما این اجازه ره می دهد که مقدمات اجرای حلقه را فراهم کنید. به عبارت دیگر متغیری که قرار است حلقه را کنترل کند را در این بخش معرفی و مقداردهی می کنیم. پس بخش initialization باید علامت سمی کالن (;)  استفاده کنید.
# قسمت دوم Boolean Expression می باشد. در این بخش یک عبارت شرطی وجود دارد که اگر نتیجه این بخش true باشد حلقه اجرا خواهد شد و اگر false باشد حلقه اجرا نمی شود. در این بخش می توان متغیر کنترل کننده حلقه را چک کرد.
# پس از این که بدن حلقه یعنی همان قطعه کد اجرا شونده اجرا شود قسمت update اجرا خواهد شد. دقت داشته باشید که قسمت update هر بار پس از اجرای بدنه حلقه اجرا می شود. در قسمت update می توانید اعمالی مانند زیاد یا کم کردن متغیر کنترل کردن حلقه در این قسمت انجام می شود. این قسمت از حلقه حتی می تواند خالی باشد. 

زمانی که قسمت Boolean expression مقدار false برگرداند حلقه دیگر اجرا نمی شود. نمودار دیاگرام این حلقه به شکل زیر است:
||http://tosinso.com/files/get/e7e44d1f-e198-4b76-a5f8-c2471cd60afd||
به مثال زیر توجه کنید:

<java>
public class Test {

   public static void main(String args[]) {

      for(int x = 10; x < 20; x = x+1) {
         System.out.print(value of x :  + x );
         System.out.print(\n);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19
<text>
همان طور که در کد می بینید قسمت initialization این حلقه یک متغیر از نوع int با نام x تعریف شده است و مقدار آن 10 می باشد. همچنین عبارت شرطی این حلقه x<20 می باشد. همچنین در قسمت update این حلقه یک واحد به x اضافه شده است.

!!حلقه do…while
این حلقه بسیار شبیه به while می باشد. تنها تفاوتی که بین این دو حلقه وجود دارد این است که شرط حلقه در انتها چک می شود. به همین دلیل کد بدنه حلقه حداقل یک بار حتما اجرا می شود. کد این حلقه به شکل زیر است:
<java>
do
{
   //بدنه حلقه
}while(شرط حلقه);
<java>
همانگونه که می بینید شرط حلقه در انتها است پس یک بار بدنه حلقه اجرا می شود. وقتی که به شرط حلقه می رسیم اگر مقدار true داشته باشد دوباره به ابتدای بدنه بازمی گردیم و دوباره حلقه اجرا می شود. اما اگر شرط حلقه false باشد بازگشت انجام نمی شود و از حلقه خارج می شویم. دیاگرام این حلقه به شکل زیر است:
||http://tosinso.com/files/get/5b410259-44f8-4976-88d3-7def747194c5||
برای مثال این حلقه به شکل زیر توجه نمایید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 10;

      do{
         System.out.print(value of x :  + x );
         x++;
         System.out.print(\n);
      }while( x < 20 );
   }
}
<java>
نتیجه اجرای کد بالا به شکل زیر خواهد بود:
<text>
value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19
<text>

!!عبارات کنترل کننده حلقه ها
همان گونه که توضیح دادیم حلقه ها یک قسمت از کد را تکرار می کنند. حال اگر بخواهیم در حالت هایی حلقه در وسط اجرا تمام شود و از حلقه خارج شویم. یا بخواهیم برخی دستورات را اجرا نکند. برای این کار از برخی عبارات کنترل کننده حلقه ها استفاده می کنیم که در ادامه به شرح آنها می پردازیم:

!!دستور break
دستور break در زبان جاوا دو کاربرد دارد.
# وقتی که در اجرای حلقه به خط break می نویسیم حلقه در همان نقطه تمام شده و خارج می شود. و برنامه از خط بعد از حلقه ادامه پیدا می کند.
# در بلوک switch مورد استفاده قرار می گیرد که شرط case ها از یکدیگر جدا باشد که این بخش را در مطالب آینده توضیح خواهیم داد.
نحوه نوشتن این دستور به شکل زیر است:
<java>
break;
<java>
دیاگرام این دستور به شکل زیر است:
||http://tosinso.com/files/get/03dbd797-90c7-4352-a8d8-1e4cc957e9c6||
برای مثال به کد زیر دقت کنید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 10;

      for(int x=5;x<100;x=x+5){
         System.out.print(value of x :  + x );
       if(x==20)
		   break;
         System.out.print(\n);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر است
<text>
value of x : 5
value of x : 10
value of x : 15
value of x : 20
<text>
در حلقه بالا گفته ایم که تا وقتی که x کوچکتراز 100 باشد حلقه باید اجرا شود. ولی در داخل بدنه حلقه گفته ایم که اگر x برابر 20 بود اجرای حلقه تمام شود.

!!دستور continue
این دستور در همه ی حلقه ها قابل استفاده است. نحوه کار این دستور به این شکل است که در هنگام اجرای حلقه وقتی که به این دستور میرسیم در هر جای حلقه قرار داشته باشیم ادامه اجرا لغو می شود و به ابتدای حلقه بازمی گردیم. دقت داشته باشید که اگر در داخل حلقه for قرار داشته باشیم بخش update پس از رسیدن به continue اجرا خواهد شد و سپس شرط حلقه چک می شود. همچنین اگر در حلقه while  یا do…while باشد وقتی به دستور continue می رسیم به ابتدای حلقه رفته و شرط حلقه چک می شود. شکل نوشتاری این دستور به شکل زیر است:
<java>
continue;
<java>
دیاگرام این دستور به شکل زیر خواهد بود:
||http://tosinso.com/files/get/85362838-a9ab-4d26-9d81-89637bad5e01||
مثالی از این دستور در ادامه آمده است:
<java>
public class Test {

   public static void main(String args[]){
        for(int x=5;x<35;x=x+5){
         
       if(x==20)
		   continue;
	   System.out.print(value of x :  + x );
        System.out.print(\n);
      }
   }
}
<java>
نتیجه اجرای کد به شرح زیر است:
<text>
value of x : 5
value of x : 10
value of x : 15
value of x : 25
value of x : 30
<text>
همانطور که مشاهده می کنید وقتی که مقدار x برابر 20 می شود دستور continue اجرا نمی شود و دوباره به ابتدای حلقه بازگشت داده می شود و مقدار 20 چاپ نمی شود.

!!شکل پیشرفته حلقه for
در نسخه 5 جاوا یک حلقه for جدید معرفی شد. این حلقه برای پیمایش مجموعه ها و لیست ها و آرایه ها به کار می رود. به این معنی که تک تک اعضای مجموعه را یکی یکی پیمایش می کند. شکل نوشتاری این حلقه به صورت زیر است:
<java>
for(declaration : expression)
{
   //Statements
}

<java>
# در قسمت declaration باید یک متغیر تعریف کنیم. نوع این متغیر باید متناسب با نوع آیتم های مجموعه مورد نظر باشد. برای مثال اگر قصد پیمایش لیستی از اعداد صحیح داریم این متغیر باید از نوع int باشد.
# در قسمت expression باید نام مجموعه مورد نظر که می خواهیم آن را پیمایش کنیم آورده شود. این مجموعه می تواند یک آرایه باشد یا حتی می تواند یک متد باشد که مقدار بازگشتی آن آرایه باشد. برای مثال به کد زیر دقت کنید:
<java>
public class Test {

   public static void main(String args[]){
      int [] numbers = {10, 20, 30, 40, 50};

      for(int x : numbers ){
         System.out.print( x );
         System.out.print(,);
      }
      System.out.print(\n);
      String [] names ={James, Larry, Tom, Lacy};
      for( String name : names ) {
         System.out.print( name );
         System.out.print(,);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
10,20,30,40,50,
James,Larry,Tom,Lacy,
<text>
حلقه ها یکی از راه های تغییر مسیر اجرای برنامه می باشند. در مطالب بعدی نیز راه های دیگری برای تغییر مسیر اجرای برنامه و کنترل اجرای آن معرفی خواهیم کرد *Itpro باشید*

نویسنده: مهدی عادلی فر
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

به مثال زیر توجه کنید:

public class Test {

   public static void main(String args[]) {

      for(int x = 10; x < 20; x = x+1) {
         System.out.print("value of x : " + x );
         System.out.print("\n");
      }
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19

همان طور که در کد می بینید قسمت initialization این حلقه یک متغیر از نوع int با نام x تعریف شده است و مقدار آن 10 می باشد. همچنین عبارت شرطی این حلقه x<20 می باشد. همچنین در قسمت update این حلقه یک واحد به x اضافه شده است.

آموزش استفاده از حلقه do…while

این حلقه بسیار شبیه به while می باشد. تنها تفاوتی که بین این دو حلقه وجود دارد این است که شرط حلقه در انتها چک می شود. به همین دلیل کد بدنه حلقه حداقل یک بار حتما اجرا می شود. کد این حلقه به شکل زیر است:

do
{
   //بدنه حلقه
}while(شرط حلقه);

همانگونه که می بینید شرط حلقه در انتها است پس یک بار بدنه حلقه اجرا می شود. وقتی که به شرط حلقه می رسیم اگر مقدار true داشته باشد دوباره به ابتدای بدنه بازمی گردیم و دوباره حلقه اجرا می شود. اما اگر شرط حلقه false باشد بازگشت انجام نمی شود و از حلقه خارج می شویم. دیاگرام این حلقه به شکل زیر است:

با سلام به همه دوستان و همراهان Itpro. کدها در زبانهای برنامه نویسی مانند جاوا به ترتیب و خطی اجرا می شوند. به این معنی که از متد main شروع شده و خط به خط اجرا می شوند. حال ممکن است که حالاتی پیش بیاید که بخواهیم یک قسمت از کد چند بار اجرا شود. زبان های برنامه نویسی راه های مختلفی فراهم کرده اند که این نوع اجرا خطی را تغییر دهد. یکی از این راه ها حلقه های تکرار(loop) هستند. حلقه ها می توانند که یک سری دستورات را چندین بار اجرا کنند. در بسیاری از زبان های برنامه نویسی فلوچارت حلقه تکرار به شکل زیر است:
||http://tosinso.com/files/get/e7a02b4c-5aa5-4621-9e90-00c901f35b4e||
زبان برنامه نویسی جاوا حلقه های متفاوتی برای استفاده دارد که هرکدام می تواند در شرایط مربوط به خود مفید و کاربردی باشد که عبارتند از:

!!حلقه while 
حلقه while در زبان جاوا تا وقتی که شرطش درست باشد یک قسمت از کد را اجرا می کند و وقتی که شرط آن false شد از اجرا باز می ایستد. نحوه نوشتن کد این حلقه به شکل زیر است:
<java>
while(عبارت شرطی)
{
   //دستورات حلقه که باید تکرار شوند
}
<java>
دستورات داخل حلقه می تواند یک خط دستور باشند یا یک بلوک کد باشند. عبارت شرطی ممکن است که یک متغیر باشد و یا چندین عبارت شرطی باشد و یا مقادیر true و یا false باشد و به طور کلی هرچیزی که مقدار true یا false برمی گرداند می تواند باشد. هنگامی که نتیجه عبارت شرطی while درست باشد کد داخل حلقه اجرا خواهد شد و اگر false باشد اجرا نمی شود. نمودار دیاگرام این حلقه در شکل زیر آمده است:
||http://tosinso.com/files/get/5b410259-44f8-4976-88d3-7def747194c5||
نکته ای که وجود دارد این است که ممکن است که یک حلقه while  اصلا اجرا نشود. این در حالی است که شرط حلقه همان اول کار false باشد دراین حالت بدنه حلقه اصلا اجرا نخواهد شد و به کل نادیده گرفته می شود. برای مثال به کد زیر توجه کنید:
<java>
public class Test {

   public static void main(String args[]) {
      int x = 10;

      while( x < 20 ) {
         System.out.print(value of x :  + x );
         x++;
         System.out.print(\n);
		 System.out.print(ITPRO\n);
      }
   }
}
<java>
و نتیجه اجرای آن به شکل زیر خواهد بود:
<text>
value of x : 10
ITPRO
value of x : 11
ITPRO
value of x : 12
ITPRO
value of x : 13
ITPRO
value of x : 14
ITPRO
value of x : 15
ITPRO
value of x : 16
ITPRO
value of x : 17
ITPRO
value of x : 18
ITPRO
value of x : 19
ITPRO
<text>

!!حلقه for
اگر شما می خواهید که قطعه کدی از برنامه شما به تعداد خاصی تکرار شود از حلقه for استفاده می کنیم. این حلقه در زمانی که از قبل می دانیم که یک قطعه کد چند بار اجرا خواهد شد مناسب است.شکل نوشتاری این حلقه به شکل زیر است:
<java>
for(initialization; Boolean_expression; update)
{
   //قطعه کد تکرار شونده
}
<java>
هریک از قسمت های موجود در این حلقه را در ادامه شرح می دهیم:
# بخش initialization در ابتدا اجرا می شود. این قسمت در کل حلقه فقط یک بار اجرا خواهد شد. این مرحله به شما این اجازه ره می دهد که مقدمات اجرای حلقه را فراهم کنید. به عبارت دیگر متغیری که قرار است حلقه را کنترل کند را در این بخش معرفی و مقداردهی می کنیم. پس بخش initialization باید علامت سمی کالن (;)  استفاده کنید.
# قسمت دوم Boolean Expression می باشد. در این بخش یک عبارت شرطی وجود دارد که اگر نتیجه این بخش true باشد حلقه اجرا خواهد شد و اگر false باشد حلقه اجرا نمی شود. در این بخش می توان متغیر کنترل کننده حلقه را چک کرد.
# پس از این که بدن حلقه یعنی همان قطعه کد اجرا شونده اجرا شود قسمت update اجرا خواهد شد. دقت داشته باشید که قسمت update هر بار پس از اجرای بدنه حلقه اجرا می شود. در قسمت update می توانید اعمالی مانند زیاد یا کم کردن متغیر کنترل کردن حلقه در این قسمت انجام می شود. این قسمت از حلقه حتی می تواند خالی باشد. 

زمانی که قسمت Boolean expression مقدار false برگرداند حلقه دیگر اجرا نمی شود. نمودار دیاگرام این حلقه به شکل زیر است:
||http://tosinso.com/files/get/e7e44d1f-e198-4b76-a5f8-c2471cd60afd||
به مثال زیر توجه کنید:

<java>
public class Test {

   public static void main(String args[]) {

      for(int x = 10; x < 20; x = x+1) {
         System.out.print(value of x :  + x );
         System.out.print(\n);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19
<text>
همان طور که در کد می بینید قسمت initialization این حلقه یک متغیر از نوع int با نام x تعریف شده است و مقدار آن 10 می باشد. همچنین عبارت شرطی این حلقه x<20 می باشد. همچنین در قسمت update این حلقه یک واحد به x اضافه شده است.

!!حلقه do…while
این حلقه بسیار شبیه به while می باشد. تنها تفاوتی که بین این دو حلقه وجود دارد این است که شرط حلقه در انتها چک می شود. به همین دلیل کد بدنه حلقه حداقل یک بار حتما اجرا می شود. کد این حلقه به شکل زیر است:
<java>
do
{
   //بدنه حلقه
}while(شرط حلقه);
<java>
همانگونه که می بینید شرط حلقه در انتها است پس یک بار بدنه حلقه اجرا می شود. وقتی که به شرط حلقه می رسیم اگر مقدار true داشته باشد دوباره به ابتدای بدنه بازمی گردیم و دوباره حلقه اجرا می شود. اما اگر شرط حلقه false باشد بازگشت انجام نمی شود و از حلقه خارج می شویم. دیاگرام این حلقه به شکل زیر است:
||http://tosinso.com/files/get/5b410259-44f8-4976-88d3-7def747194c5||
برای مثال این حلقه به شکل زیر توجه نمایید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 10;

      do{
         System.out.print(value of x :  + x );
         x++;
         System.out.print(\n);
      }while( x < 20 );
   }
}
<java>
نتیجه اجرای کد بالا به شکل زیر خواهد بود:
<text>
value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19
<text>

!!عبارات کنترل کننده حلقه ها
همان گونه که توضیح دادیم حلقه ها یک قسمت از کد را تکرار می کنند. حال اگر بخواهیم در حالت هایی حلقه در وسط اجرا تمام شود و از حلقه خارج شویم. یا بخواهیم برخی دستورات را اجرا نکند. برای این کار از برخی عبارات کنترل کننده حلقه ها استفاده می کنیم که در ادامه به شرح آنها می پردازیم:

!!دستور break
دستور break در زبان جاوا دو کاربرد دارد.
# وقتی که در اجرای حلقه به خط break می نویسیم حلقه در همان نقطه تمام شده و خارج می شود. و برنامه از خط بعد از حلقه ادامه پیدا می کند.
# در بلوک switch مورد استفاده قرار می گیرد که شرط case ها از یکدیگر جدا باشد که این بخش را در مطالب آینده توضیح خواهیم داد.
نحوه نوشتن این دستور به شکل زیر است:
<java>
break;
<java>
دیاگرام این دستور به شکل زیر است:
||http://tosinso.com/files/get/03dbd797-90c7-4352-a8d8-1e4cc957e9c6||
برای مثال به کد زیر دقت کنید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 10;

      for(int x=5;x<100;x=x+5){
         System.out.print(value of x :  + x );
       if(x==20)
		   break;
         System.out.print(\n);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر است
<text>
value of x : 5
value of x : 10
value of x : 15
value of x : 20
<text>
در حلقه بالا گفته ایم که تا وقتی که x کوچکتراز 100 باشد حلقه باید اجرا شود. ولی در داخل بدنه حلقه گفته ایم که اگر x برابر 20 بود اجرای حلقه تمام شود.

!!دستور continue
این دستور در همه ی حلقه ها قابل استفاده است. نحوه کار این دستور به این شکل است که در هنگام اجرای حلقه وقتی که به این دستور میرسیم در هر جای حلقه قرار داشته باشیم ادامه اجرا لغو می شود و به ابتدای حلقه بازمی گردیم. دقت داشته باشید که اگر در داخل حلقه for قرار داشته باشیم بخش update پس از رسیدن به continue اجرا خواهد شد و سپس شرط حلقه چک می شود. همچنین اگر در حلقه while  یا do…while باشد وقتی به دستور continue می رسیم به ابتدای حلقه رفته و شرط حلقه چک می شود. شکل نوشتاری این دستور به شکل زیر است:
<java>
continue;
<java>
دیاگرام این دستور به شکل زیر خواهد بود:
||http://tosinso.com/files/get/85362838-a9ab-4d26-9d81-89637bad5e01||
مثالی از این دستور در ادامه آمده است:
<java>
public class Test {

   public static void main(String args[]){
        for(int x=5;x<35;x=x+5){
         
       if(x==20)
		   continue;
	   System.out.print(value of x :  + x );
        System.out.print(\n);
      }
   }
}
<java>
نتیجه اجرای کد به شرح زیر است:
<text>
value of x : 5
value of x : 10
value of x : 15
value of x : 25
value of x : 30
<text>
همانطور که مشاهده می کنید وقتی که مقدار x برابر 20 می شود دستور continue اجرا نمی شود و دوباره به ابتدای حلقه بازگشت داده می شود و مقدار 20 چاپ نمی شود.

!!شکل پیشرفته حلقه for
در نسخه 5 جاوا یک حلقه for جدید معرفی شد. این حلقه برای پیمایش مجموعه ها و لیست ها و آرایه ها به کار می رود. به این معنی که تک تک اعضای مجموعه را یکی یکی پیمایش می کند. شکل نوشتاری این حلقه به صورت زیر است:
<java>
for(declaration : expression)
{
   //Statements
}

<java>
# در قسمت declaration باید یک متغیر تعریف کنیم. نوع این متغیر باید متناسب با نوع آیتم های مجموعه مورد نظر باشد. برای مثال اگر قصد پیمایش لیستی از اعداد صحیح داریم این متغیر باید از نوع int باشد.
# در قسمت expression باید نام مجموعه مورد نظر که می خواهیم آن را پیمایش کنیم آورده شود. این مجموعه می تواند یک آرایه باشد یا حتی می تواند یک متد باشد که مقدار بازگشتی آن آرایه باشد. برای مثال به کد زیر دقت کنید:
<java>
public class Test {

   public static void main(String args[]){
      int [] numbers = {10, 20, 30, 40, 50};

      for(int x : numbers ){
         System.out.print( x );
         System.out.print(,);
      }
      System.out.print(\n);
      String [] names ={James, Larry, Tom, Lacy};
      for( String name : names ) {
         System.out.print( name );
         System.out.print(,);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
10,20,30,40,50,
James,Larry,Tom,Lacy,
<text>
حلقه ها یکی از راه های تغییر مسیر اجرای برنامه می باشند. در مطالب بعدی نیز راه های دیگری برای تغییر مسیر اجرای برنامه و کنترل اجرای آن معرفی خواهیم کرد *Itpro باشید*

نویسنده: مهدی عادلی فر
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

برای مثال این حلقه به شکل زیر توجه نمایید:

public class Test {

   public static void main(String args[]){
      int x = 10;

      do{
         System.out.print("value of x : " + x );
         x++;
         System.out.print("\n");
      }while( x < 20 );
   }
}

نتیجه اجرای کد بالا به شکل زیر خواهد بود:

value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19

بررسی عبارات کنترل کننده حلقه ها

همان گونه که توضیح دادیم حلقه ها یک قسمت از کد را تکرار می کنند. حال اگر بخواهیم در حالت هایی حلقه در وسط اجرا تمام شود و از حلقه خارج شویم. یا بخواهیم برخی دستورات را اجرا نکند. برای این کار از برخی عبارات کنترل کننده حلقه ها استفاده می کنیم که در ادامه به شرح آنها می پردازیم:

آموزش استفاده از دستور break

دستور break در زبان جاوا دو کاربرد دارد.

  1. وقتی که در اجرای حلقه به خط break می نویسیم حلقه در همان نقطه تمام شده و خارج می شود. و برنامه از خط بعد از حلقه ادامه پیدا می کند.
  2. در بلوک switch مورد استفاده قرار می گیرد که شرط case ها از یکدیگر جدا باشد که این بخش را در مطالب آینده توضیح خواهیم داد.

نحوه نوشتن این دستور به شکل زیر است:

break;

دیاگرام این دستور به شکل زیر است:

با سلام به همه دوستان و همراهان Itpro. کدها در زبانهای برنامه نویسی مانند جاوا به ترتیب و خطی اجرا می شوند. به این معنی که از متد main شروع شده و خط به خط اجرا می شوند. حال ممکن است که حالاتی پیش بیاید که بخواهیم یک قسمت از کد چند بار اجرا شود. زبان های برنامه نویسی راه های مختلفی فراهم کرده اند که این نوع اجرا خطی را تغییر دهد. یکی از این راه ها حلقه های تکرار(loop) هستند. حلقه ها می توانند که یک سری دستورات را چندین بار اجرا کنند. در بسیاری از زبان های برنامه نویسی فلوچارت حلقه تکرار به شکل زیر است:
||http://tosinso.com/files/get/e7a02b4c-5aa5-4621-9e90-00c901f35b4e||
زبان برنامه نویسی جاوا حلقه های متفاوتی برای استفاده دارد که هرکدام می تواند در شرایط مربوط به خود مفید و کاربردی باشد که عبارتند از:

!!حلقه while 
حلقه while در زبان جاوا تا وقتی که شرطش درست باشد یک قسمت از کد را اجرا می کند و وقتی که شرط آن false شد از اجرا باز می ایستد. نحوه نوشتن کد این حلقه به شکل زیر است:
<java>
while(عبارت شرطی)
{
   //دستورات حلقه که باید تکرار شوند
}
<java>
دستورات داخل حلقه می تواند یک خط دستور باشند یا یک بلوک کد باشند. عبارت شرطی ممکن است که یک متغیر باشد و یا چندین عبارت شرطی باشد و یا مقادیر true و یا false باشد و به طور کلی هرچیزی که مقدار true یا false برمی گرداند می تواند باشد. هنگامی که نتیجه عبارت شرطی while درست باشد کد داخل حلقه اجرا خواهد شد و اگر false باشد اجرا نمی شود. نمودار دیاگرام این حلقه در شکل زیر آمده است:
||http://tosinso.com/files/get/5b410259-44f8-4976-88d3-7def747194c5||
نکته ای که وجود دارد این است که ممکن است که یک حلقه while  اصلا اجرا نشود. این در حالی است که شرط حلقه همان اول کار false باشد دراین حالت بدنه حلقه اصلا اجرا نخواهد شد و به کل نادیده گرفته می شود. برای مثال به کد زیر توجه کنید:
<java>
public class Test {

   public static void main(String args[]) {
      int x = 10;

      while( x < 20 ) {
         System.out.print(value of x :  + x );
         x++;
         System.out.print(\n);
		 System.out.print(ITPRO\n);
      }
   }
}
<java>
و نتیجه اجرای آن به شکل زیر خواهد بود:
<text>
value of x : 10
ITPRO
value of x : 11
ITPRO
value of x : 12
ITPRO
value of x : 13
ITPRO
value of x : 14
ITPRO
value of x : 15
ITPRO
value of x : 16
ITPRO
value of x : 17
ITPRO
value of x : 18
ITPRO
value of x : 19
ITPRO
<text>

!!حلقه for
اگر شما می خواهید که قطعه کدی از برنامه شما به تعداد خاصی تکرار شود از حلقه for استفاده می کنیم. این حلقه در زمانی که از قبل می دانیم که یک قطعه کد چند بار اجرا خواهد شد مناسب است.شکل نوشتاری این حلقه به شکل زیر است:
<java>
for(initialization; Boolean_expression; update)
{
   //قطعه کد تکرار شونده
}
<java>
هریک از قسمت های موجود در این حلقه را در ادامه شرح می دهیم:
# بخش initialization در ابتدا اجرا می شود. این قسمت در کل حلقه فقط یک بار اجرا خواهد شد. این مرحله به شما این اجازه ره می دهد که مقدمات اجرای حلقه را فراهم کنید. به عبارت دیگر متغیری که قرار است حلقه را کنترل کند را در این بخش معرفی و مقداردهی می کنیم. پس بخش initialization باید علامت سمی کالن (;)  استفاده کنید.
# قسمت دوم Boolean Expression می باشد. در این بخش یک عبارت شرطی وجود دارد که اگر نتیجه این بخش true باشد حلقه اجرا خواهد شد و اگر false باشد حلقه اجرا نمی شود. در این بخش می توان متغیر کنترل کننده حلقه را چک کرد.
# پس از این که بدن حلقه یعنی همان قطعه کد اجرا شونده اجرا شود قسمت update اجرا خواهد شد. دقت داشته باشید که قسمت update هر بار پس از اجرای بدنه حلقه اجرا می شود. در قسمت update می توانید اعمالی مانند زیاد یا کم کردن متغیر کنترل کردن حلقه در این قسمت انجام می شود. این قسمت از حلقه حتی می تواند خالی باشد. 

زمانی که قسمت Boolean expression مقدار false برگرداند حلقه دیگر اجرا نمی شود. نمودار دیاگرام این حلقه به شکل زیر است:
||http://tosinso.com/files/get/e7e44d1f-e198-4b76-a5f8-c2471cd60afd||
به مثال زیر توجه کنید:

<java>
public class Test {

   public static void main(String args[]) {

      for(int x = 10; x < 20; x = x+1) {
         System.out.print(value of x :  + x );
         System.out.print(\n);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19
<text>
همان طور که در کد می بینید قسمت initialization این حلقه یک متغیر از نوع int با نام x تعریف شده است و مقدار آن 10 می باشد. همچنین عبارت شرطی این حلقه x<20 می باشد. همچنین در قسمت update این حلقه یک واحد به x اضافه شده است.

!!حلقه do…while
این حلقه بسیار شبیه به while می باشد. تنها تفاوتی که بین این دو حلقه وجود دارد این است که شرط حلقه در انتها چک می شود. به همین دلیل کد بدنه حلقه حداقل یک بار حتما اجرا می شود. کد این حلقه به شکل زیر است:
<java>
do
{
   //بدنه حلقه
}while(شرط حلقه);
<java>
همانگونه که می بینید شرط حلقه در انتها است پس یک بار بدنه حلقه اجرا می شود. وقتی که به شرط حلقه می رسیم اگر مقدار true داشته باشد دوباره به ابتدای بدنه بازمی گردیم و دوباره حلقه اجرا می شود. اما اگر شرط حلقه false باشد بازگشت انجام نمی شود و از حلقه خارج می شویم. دیاگرام این حلقه به شکل زیر است:
||http://tosinso.com/files/get/5b410259-44f8-4976-88d3-7def747194c5||
برای مثال این حلقه به شکل زیر توجه نمایید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 10;

      do{
         System.out.print(value of x :  + x );
         x++;
         System.out.print(\n);
      }while( x < 20 );
   }
}
<java>
نتیجه اجرای کد بالا به شکل زیر خواهد بود:
<text>
value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19
<text>

!!عبارات کنترل کننده حلقه ها
همان گونه که توضیح دادیم حلقه ها یک قسمت از کد را تکرار می کنند. حال اگر بخواهیم در حالت هایی حلقه در وسط اجرا تمام شود و از حلقه خارج شویم. یا بخواهیم برخی دستورات را اجرا نکند. برای این کار از برخی عبارات کنترل کننده حلقه ها استفاده می کنیم که در ادامه به شرح آنها می پردازیم:

!!دستور break
دستور break در زبان جاوا دو کاربرد دارد.
# وقتی که در اجرای حلقه به خط break می نویسیم حلقه در همان نقطه تمام شده و خارج می شود. و برنامه از خط بعد از حلقه ادامه پیدا می کند.
# در بلوک switch مورد استفاده قرار می گیرد که شرط case ها از یکدیگر جدا باشد که این بخش را در مطالب آینده توضیح خواهیم داد.
نحوه نوشتن این دستور به شکل زیر است:
<java>
break;
<java>
دیاگرام این دستور به شکل زیر است:
||http://tosinso.com/files/get/03dbd797-90c7-4352-a8d8-1e4cc957e9c6||
برای مثال به کد زیر دقت کنید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 10;

      for(int x=5;x<100;x=x+5){
         System.out.print(value of x :  + x );
       if(x==20)
		   break;
         System.out.print(\n);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر است
<text>
value of x : 5
value of x : 10
value of x : 15
value of x : 20
<text>
در حلقه بالا گفته ایم که تا وقتی که x کوچکتراز 100 باشد حلقه باید اجرا شود. ولی در داخل بدنه حلقه گفته ایم که اگر x برابر 20 بود اجرای حلقه تمام شود.

!!دستور continue
این دستور در همه ی حلقه ها قابل استفاده است. نحوه کار این دستور به این شکل است که در هنگام اجرای حلقه وقتی که به این دستور میرسیم در هر جای حلقه قرار داشته باشیم ادامه اجرا لغو می شود و به ابتدای حلقه بازمی گردیم. دقت داشته باشید که اگر در داخل حلقه for قرار داشته باشیم بخش update پس از رسیدن به continue اجرا خواهد شد و سپس شرط حلقه چک می شود. همچنین اگر در حلقه while  یا do…while باشد وقتی به دستور continue می رسیم به ابتدای حلقه رفته و شرط حلقه چک می شود. شکل نوشتاری این دستور به شکل زیر است:
<java>
continue;
<java>
دیاگرام این دستور به شکل زیر خواهد بود:
||http://tosinso.com/files/get/85362838-a9ab-4d26-9d81-89637bad5e01||
مثالی از این دستور در ادامه آمده است:
<java>
public class Test {

   public static void main(String args[]){
        for(int x=5;x<35;x=x+5){
         
       if(x==20)
		   continue;
	   System.out.print(value of x :  + x );
        System.out.print(\n);
      }
   }
}
<java>
نتیجه اجرای کد به شرح زیر است:
<text>
value of x : 5
value of x : 10
value of x : 15
value of x : 25
value of x : 30
<text>
همانطور که مشاهده می کنید وقتی که مقدار x برابر 20 می شود دستور continue اجرا نمی شود و دوباره به ابتدای حلقه بازگشت داده می شود و مقدار 20 چاپ نمی شود.

!!شکل پیشرفته حلقه for
در نسخه 5 جاوا یک حلقه for جدید معرفی شد. این حلقه برای پیمایش مجموعه ها و لیست ها و آرایه ها به کار می رود. به این معنی که تک تک اعضای مجموعه را یکی یکی پیمایش می کند. شکل نوشتاری این حلقه به صورت زیر است:
<java>
for(declaration : expression)
{
   //Statements
}

<java>
# در قسمت declaration باید یک متغیر تعریف کنیم. نوع این متغیر باید متناسب با نوع آیتم های مجموعه مورد نظر باشد. برای مثال اگر قصد پیمایش لیستی از اعداد صحیح داریم این متغیر باید از نوع int باشد.
# در قسمت expression باید نام مجموعه مورد نظر که می خواهیم آن را پیمایش کنیم آورده شود. این مجموعه می تواند یک آرایه باشد یا حتی می تواند یک متد باشد که مقدار بازگشتی آن آرایه باشد. برای مثال به کد زیر دقت کنید:
<java>
public class Test {

   public static void main(String args[]){
      int [] numbers = {10, 20, 30, 40, 50};

      for(int x : numbers ){
         System.out.print( x );
         System.out.print(,);
      }
      System.out.print(\n);
      String [] names ={James, Larry, Tom, Lacy};
      for( String name : names ) {
         System.out.print( name );
         System.out.print(,);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
10,20,30,40,50,
James,Larry,Tom,Lacy,
<text>
حلقه ها یکی از راه های تغییر مسیر اجرای برنامه می باشند. در مطالب بعدی نیز راه های دیگری برای تغییر مسیر اجرای برنامه و کنترل اجرای آن معرفی خواهیم کرد *Itpro باشید*

نویسنده: مهدی عادلی فر
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

برای مثال به کد زیر دقت کنید:

public class Test {

   public static void main(String args[]){
      int x = 10;

      for(int x=5;x<100;x=x+5){
         System.out.print("value of x : " + x );
       if(x==20)
		   break;
         System.out.print("\n");
      }
   }
}

خروجی کد بالا به شکل زیر است

value of x : 5
value of x : 10
value of x : 15
value of x : 20

در حلقه بالا گفته ایم که تا وقتی که x کوچکتراز 100 باشد حلقه باید اجرا شود. ولی در داخل بدنه حلقه گفته ایم که اگر x برابر 20 بود اجرای حلقه تمام شود.

آموزش استفاده از دستور continue

این دستور در همه ی حلقه ها قابل استفاده است. نحوه کار این دستور به این شکل است که در هنگام اجرای حلقه وقتی که به این دستور میرسیم در هر جای حلقه قرار داشته باشیم ادامه اجرا لغو می شود و به ابتدای حلقه بازمی گردیم. دقت داشته باشید که اگر در داخل حلقه for قرار داشته باشیم بخش update پس از رسیدن به continue اجرا خواهد شد و سپس شرط حلقه چک می شود. همچنین اگر در حلقه while یا do…while باشد وقتی به دستور continue می رسیم به ابتدای حلقه رفته و شرط حلقه چک می شود. شکل نوشتاری این دستور به شکل زیر است:

continue;

دیاگرام این دستور به شکل زیر خواهد بود:

با سلام به همه دوستان و همراهان Itpro. کدها در زبانهای برنامه نویسی مانند جاوا به ترتیب و خطی اجرا می شوند. به این معنی که از متد main شروع شده و خط به خط اجرا می شوند. حال ممکن است که حالاتی پیش بیاید که بخواهیم یک قسمت از کد چند بار اجرا شود. زبان های برنامه نویسی راه های مختلفی فراهم کرده اند که این نوع اجرا خطی را تغییر دهد. یکی از این راه ها حلقه های تکرار(loop) هستند. حلقه ها می توانند که یک سری دستورات را چندین بار اجرا کنند. در بسیاری از زبان های برنامه نویسی فلوچارت حلقه تکرار به شکل زیر است:
||http://tosinso.com/files/get/e7a02b4c-5aa5-4621-9e90-00c901f35b4e||
زبان برنامه نویسی جاوا حلقه های متفاوتی برای استفاده دارد که هرکدام می تواند در شرایط مربوط به خود مفید و کاربردی باشد که عبارتند از:

!!حلقه while 
حلقه while در زبان جاوا تا وقتی که شرطش درست باشد یک قسمت از کد را اجرا می کند و وقتی که شرط آن false شد از اجرا باز می ایستد. نحوه نوشتن کد این حلقه به شکل زیر است:
<java>
while(عبارت شرطی)
{
   //دستورات حلقه که باید تکرار شوند
}
<java>
دستورات داخل حلقه می تواند یک خط دستور باشند یا یک بلوک کد باشند. عبارت شرطی ممکن است که یک متغیر باشد و یا چندین عبارت شرطی باشد و یا مقادیر true و یا false باشد و به طور کلی هرچیزی که مقدار true یا false برمی گرداند می تواند باشد. هنگامی که نتیجه عبارت شرطی while درست باشد کد داخل حلقه اجرا خواهد شد و اگر false باشد اجرا نمی شود. نمودار دیاگرام این حلقه در شکل زیر آمده است:
||http://tosinso.com/files/get/5b410259-44f8-4976-88d3-7def747194c5||
نکته ای که وجود دارد این است که ممکن است که یک حلقه while  اصلا اجرا نشود. این در حالی است که شرط حلقه همان اول کار false باشد دراین حالت بدنه حلقه اصلا اجرا نخواهد شد و به کل نادیده گرفته می شود. برای مثال به کد زیر توجه کنید:
<java>
public class Test {

   public static void main(String args[]) {
      int x = 10;

      while( x < 20 ) {
         System.out.print(value of x :  + x );
         x++;
         System.out.print(\n);
		 System.out.print(ITPRO\n);
      }
   }
}
<java>
و نتیجه اجرای آن به شکل زیر خواهد بود:
<text>
value of x : 10
ITPRO
value of x : 11
ITPRO
value of x : 12
ITPRO
value of x : 13
ITPRO
value of x : 14
ITPRO
value of x : 15
ITPRO
value of x : 16
ITPRO
value of x : 17
ITPRO
value of x : 18
ITPRO
value of x : 19
ITPRO
<text>

!!حلقه for
اگر شما می خواهید که قطعه کدی از برنامه شما به تعداد خاصی تکرار شود از حلقه for استفاده می کنیم. این حلقه در زمانی که از قبل می دانیم که یک قطعه کد چند بار اجرا خواهد شد مناسب است.شکل نوشتاری این حلقه به شکل زیر است:
<java>
for(initialization; Boolean_expression; update)
{
   //قطعه کد تکرار شونده
}
<java>
هریک از قسمت های موجود در این حلقه را در ادامه شرح می دهیم:
# بخش initialization در ابتدا اجرا می شود. این قسمت در کل حلقه فقط یک بار اجرا خواهد شد. این مرحله به شما این اجازه ره می دهد که مقدمات اجرای حلقه را فراهم کنید. به عبارت دیگر متغیری که قرار است حلقه را کنترل کند را در این بخش معرفی و مقداردهی می کنیم. پس بخش initialization باید علامت سمی کالن (;)  استفاده کنید.
# قسمت دوم Boolean Expression می باشد. در این بخش یک عبارت شرطی وجود دارد که اگر نتیجه این بخش true باشد حلقه اجرا خواهد شد و اگر false باشد حلقه اجرا نمی شود. در این بخش می توان متغیر کنترل کننده حلقه را چک کرد.
# پس از این که بدن حلقه یعنی همان قطعه کد اجرا شونده اجرا شود قسمت update اجرا خواهد شد. دقت داشته باشید که قسمت update هر بار پس از اجرای بدنه حلقه اجرا می شود. در قسمت update می توانید اعمالی مانند زیاد یا کم کردن متغیر کنترل کردن حلقه در این قسمت انجام می شود. این قسمت از حلقه حتی می تواند خالی باشد. 

زمانی که قسمت Boolean expression مقدار false برگرداند حلقه دیگر اجرا نمی شود. نمودار دیاگرام این حلقه به شکل زیر است:
||http://tosinso.com/files/get/e7e44d1f-e198-4b76-a5f8-c2471cd60afd||
به مثال زیر توجه کنید:

<java>
public class Test {

   public static void main(String args[]) {

      for(int x = 10; x < 20; x = x+1) {
         System.out.print(value of x :  + x );
         System.out.print(\n);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19
<text>
همان طور که در کد می بینید قسمت initialization این حلقه یک متغیر از نوع int با نام x تعریف شده است و مقدار آن 10 می باشد. همچنین عبارت شرطی این حلقه x<20 می باشد. همچنین در قسمت update این حلقه یک واحد به x اضافه شده است.

!!حلقه do…while
این حلقه بسیار شبیه به while می باشد. تنها تفاوتی که بین این دو حلقه وجود دارد این است که شرط حلقه در انتها چک می شود. به همین دلیل کد بدنه حلقه حداقل یک بار حتما اجرا می شود. کد این حلقه به شکل زیر است:
<java>
do
{
   //بدنه حلقه
}while(شرط حلقه);
<java>
همانگونه که می بینید شرط حلقه در انتها است پس یک بار بدنه حلقه اجرا می شود. وقتی که به شرط حلقه می رسیم اگر مقدار true داشته باشد دوباره به ابتدای بدنه بازمی گردیم و دوباره حلقه اجرا می شود. اما اگر شرط حلقه false باشد بازگشت انجام نمی شود و از حلقه خارج می شویم. دیاگرام این حلقه به شکل زیر است:
||http://tosinso.com/files/get/5b410259-44f8-4976-88d3-7def747194c5||
برای مثال این حلقه به شکل زیر توجه نمایید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 10;

      do{
         System.out.print(value of x :  + x );
         x++;
         System.out.print(\n);
      }while( x < 20 );
   }
}
<java>
نتیجه اجرای کد بالا به شکل زیر خواهد بود:
<text>
value of x : 10
value of x : 11
value of x : 12
value of x : 13
value of x : 14
value of x : 15
value of x : 16
value of x : 17
value of x : 18
value of x : 19
<text>

!!عبارات کنترل کننده حلقه ها
همان گونه که توضیح دادیم حلقه ها یک قسمت از کد را تکرار می کنند. حال اگر بخواهیم در حالت هایی حلقه در وسط اجرا تمام شود و از حلقه خارج شویم. یا بخواهیم برخی دستورات را اجرا نکند. برای این کار از برخی عبارات کنترل کننده حلقه ها استفاده می کنیم که در ادامه به شرح آنها می پردازیم:

!!دستور break
دستور break در زبان جاوا دو کاربرد دارد.
# وقتی که در اجرای حلقه به خط break می نویسیم حلقه در همان نقطه تمام شده و خارج می شود. و برنامه از خط بعد از حلقه ادامه پیدا می کند.
# در بلوک switch مورد استفاده قرار می گیرد که شرط case ها از یکدیگر جدا باشد که این بخش را در مطالب آینده توضیح خواهیم داد.
نحوه نوشتن این دستور به شکل زیر است:
<java>
break;
<java>
دیاگرام این دستور به شکل زیر است:
||http://tosinso.com/files/get/03dbd797-90c7-4352-a8d8-1e4cc957e9c6||
برای مثال به کد زیر دقت کنید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 10;

      for(int x=5;x<100;x=x+5){
         System.out.print(value of x :  + x );
       if(x==20)
		   break;
         System.out.print(\n);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر است
<text>
value of x : 5
value of x : 10
value of x : 15
value of x : 20
<text>
در حلقه بالا گفته ایم که تا وقتی که x کوچکتراز 100 باشد حلقه باید اجرا شود. ولی در داخل بدنه حلقه گفته ایم که اگر x برابر 20 بود اجرای حلقه تمام شود.

!!دستور continue
این دستور در همه ی حلقه ها قابل استفاده است. نحوه کار این دستور به این شکل است که در هنگام اجرای حلقه وقتی که به این دستور میرسیم در هر جای حلقه قرار داشته باشیم ادامه اجرا لغو می شود و به ابتدای حلقه بازمی گردیم. دقت داشته باشید که اگر در داخل حلقه for قرار داشته باشیم بخش update پس از رسیدن به continue اجرا خواهد شد و سپس شرط حلقه چک می شود. همچنین اگر در حلقه while  یا do…while باشد وقتی به دستور continue می رسیم به ابتدای حلقه رفته و شرط حلقه چک می شود. شکل نوشتاری این دستور به شکل زیر است:
<java>
continue;
<java>
دیاگرام این دستور به شکل زیر خواهد بود:
||http://tosinso.com/files/get/85362838-a9ab-4d26-9d81-89637bad5e01||
مثالی از این دستور در ادامه آمده است:
<java>
public class Test {

   public static void main(String args[]){
        for(int x=5;x<35;x=x+5){
         
       if(x==20)
		   continue;
	   System.out.print(value of x :  + x );
        System.out.print(\n);
      }
   }
}
<java>
نتیجه اجرای کد به شرح زیر است:
<text>
value of x : 5
value of x : 10
value of x : 15
value of x : 25
value of x : 30
<text>
همانطور که مشاهده می کنید وقتی که مقدار x برابر 20 می شود دستور continue اجرا نمی شود و دوباره به ابتدای حلقه بازگشت داده می شود و مقدار 20 چاپ نمی شود.

!!شکل پیشرفته حلقه for
در نسخه 5 جاوا یک حلقه for جدید معرفی شد. این حلقه برای پیمایش مجموعه ها و لیست ها و آرایه ها به کار می رود. به این معنی که تک تک اعضای مجموعه را یکی یکی پیمایش می کند. شکل نوشتاری این حلقه به صورت زیر است:
<java>
for(declaration : expression)
{
   //Statements
}

<java>
# در قسمت declaration باید یک متغیر تعریف کنیم. نوع این متغیر باید متناسب با نوع آیتم های مجموعه مورد نظر باشد. برای مثال اگر قصد پیمایش لیستی از اعداد صحیح داریم این متغیر باید از نوع int باشد.
# در قسمت expression باید نام مجموعه مورد نظر که می خواهیم آن را پیمایش کنیم آورده شود. این مجموعه می تواند یک آرایه باشد یا حتی می تواند یک متد باشد که مقدار بازگشتی آن آرایه باشد. برای مثال به کد زیر دقت کنید:
<java>
public class Test {

   public static void main(String args[]){
      int [] numbers = {10, 20, 30, 40, 50};

      for(int x : numbers ){
         System.out.print( x );
         System.out.print(,);
      }
      System.out.print(\n);
      String [] names ={James, Larry, Tom, Lacy};
      for( String name : names ) {
         System.out.print( name );
         System.out.print(,);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
10,20,30,40,50,
James,Larry,Tom,Lacy,
<text>
حلقه ها یکی از راه های تغییر مسیر اجرای برنامه می باشند. در مطالب بعدی نیز راه های دیگری برای تغییر مسیر اجرای برنامه و کنترل اجرای آن معرفی خواهیم کرد *Itpro باشید*

نویسنده: مهدی عادلی فر
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

مثالی از این دستور در ادامه آمده است:

public class Test {

   public static void main(String args[]){
        for(int x=5;x<35;x=x+5){
         
       if(x==20)
		   continue;
	   System.out.print("value of x : " + x );
        System.out.print("\n");
      }
   }
}

نتیجه اجرای کد به شرح زیر است:

value of x : 5
value of x : 10
value of x : 15
value of x : 25
value of x : 30

همانطور که مشاهده می کنید وقتی که مقدار x برابر 20 می شود دستور continue اجرا نمی شود و دوباره به ابتدای حلقه بازگشت داده می شود و مقدار 20 چاپ نمی شود.

آموزش استفاده از شکل پیشرفته حلقه for

در نسخه 5 جاوا یک حلقه for جدید معرفی شد. این حلقه برای پیمایش مجموعه ها و لیست ها و آرایه ها به کار می رود. به این معنی که تک تک اعضای مجموعه را یکی یکی پیمایش می کند. شکل نوشتاری این حلقه به صورت زیر است:

for(declaration : expression)
{
   //Statements
}

    1. در قسمت declaration باید یک متغیر تعریف کنیم. نوع این متغیر باید متناسب با نوع آیتم های مجموعه مورد نظر باشد. برای مثال اگر قصد پیمایش لیستی از اعداد صحیح داریم این متغیر باید از نوع int باشد.
    2. در قسمت expression باید نام مجموعه مورد نظر که می خواهیم آن را پیمایش کنیم آورده شود. این مجموعه می تواند یک آرایه باشد یا حتی می تواند یک متد باشد که مقدار بازگشتی آن آرایه باشد. برای مثال به کد زیر دقت کنید:
public class Test {

   public static void main(String args[]){
      int [] numbers = {10, 20, 30, 40, 50};

      for(int x : numbers ){
         System.out.print( x );
         System.out.print(",");
      }
      System.out.print("\n");
      String [] names ={"James", "Larry", "Tom", "Lacy"};
      for( String name : names ) {
         System.out.print( name );
         System.out.print(",");
      }
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

10,20,30,40,50,
James,Larry,Tom,Lacy,

حلقه ها یکی از راه های تغییر مسیر اجرای برنامه می باشند. در مطالب بعدی نیز راه های دیگری برای تغییر مسیر اجرای برنامه و کنترل اجرای آن معرفی خواهیم کرد

عبارات شرطی

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

با سلام به همه دوستان و همراهان Itpro. در بخش های قبل گفتیم که برنامه های جاوا خط به خط از بالا به پایین اجرا می شوند. در قسمت قبل گفتیم که حلقه ها نحوه اجرا را تغییر می دهند و باعث می شوند که قسمتی از کد چند بار اجرا شود. در این بخش شرط ها توضیح داده می شوند. شرط ها به گونه ای هستند که تصمیم می گیریم قسمتی از کد اجرا بشود یا خیر. شرط ها یک یا چند شرط را بررسی می کنند و اگر شرط درست بود کد متناظر با آن شرط را اجرا می کنند. شکل زیر دیاگرام شرط ها را نشان می دهد.
||http://tosinso.com/files/get/8433dc6e-247b-49b7-a337-8fd04e78fe6b||
زبان جاوا عبارات شرطی زیر را فراهم می آورد که آنها را شرح خواهیم داد.

!!عبارات شرطی if
یک عبارت شرطی if از یک شرط و یک یا چند عبارت اجرایی تشکیل شده است. شکل نوشتاری آن مانند کد زیر است.
<java>
if(Boolean_expression)
{
   //Statements will execute if the Boolean expression is true
}
<java>
اگر شرط موجود در قسمت Boolean expression نتیجه true دهد پس بلوک کد داخل if اجرا می شود اما اگر مقدار شرط false باشد قسمت کد داخل بلوک if اجرا نمی شود و خط بعد از بلوک if اجرا خواهد شد. دیاگرام این شرط به شکل زیر خواهد بود.
||http://tosinso.com/files/get/bbbdaaed-ae50-42fb-9185-4ecc41dd6c41||
مثال زیر نحوه استفاده از این شرط را نشان می دهد.
<java>
public class Test {

   public static void main(String args[]){
      int x = 10;

      if( x < 20 ){
         System.out.print(This is if statement);
      }
   }
}
<java>
که خروجی کد به شکل زیر خواهد بود:
<text>
This is if statement
<text>

!!شرط if-else
یک شرط if می تواند با یک else  همراه باشد. که نحوه ی این شرط به این شکل است که اگر شرط مورد نظر درست باشد دستور خود if و اگر شرط غلط باشد دستور else اجرا خواهد شد. نحوه نوشتاری این شرط به شکل زیر است:
<java>
if(Boolean_expression){
   //Executes when the Boolean expression is true
}else{
   //Executes when the Boolean expression is false
}
<java>
همانطور ک گفته شد اگر مقدار Boolean expression برابر true باشد بلوک if اجرا می شود و اگر این مقدار false باشد بلوک else اجرا خواهد شد. دیاگرام این شرط به شکل زیر خواهد بود 
||http://tosinso.com/files/get/1cdfc9e9-1107-4d4f-b09f-81c7da38893d||
برای مثال به کد زیر توجه کنید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 30;

      if( x < 20 ){
         System.out.print(This is if statement);
      }else{
         System.out.print(This is else statement);
      }
   }
}
<java>
که نتیجه آن به شکل زیر خواهد بود 
<text>
This is else statement
<text>

!!شرط if… else if … else  
یک شرط if می تواند با یک یا چند else if همراه باشد. این حالت زمانی استفاده می شود که بخواهیم حالت های مختلف شرط را بررسی کنیم. برای استفاده از این شرط باید به نکات زیر دقت کنید:
# اگر پس از if از هر چند تا else if استفاده کنید اما بهتر است که در انتهای آن از یک بلوک  else استفاده کنید. 
# هیچگاه نمی توان بعد از بلوک else  از else if استفاده کرد. 
# اگر یک else if اجرا شود بقیه else if ها و else ها اجرا نخواهند شد.
نحوه نوشتن این شرط به شکل زیر خواهد بود:
<java>
if(Boolean_expression 1){
   //Executes when the Boolean expression 1 is true
}else if(Boolean_expression 2){
   //Executes when the Boolean expression 2 is true
}else if(Boolean_expression 3){
   //Executes when the Boolean expression 3 is true
}else {
   //Executes when the none of the above condition is true.
}
<java>
اگر مقدار Boolean expression 1 درست باشد بلوک if اجرا خواهد شد و اگر Boolean expression2 درست باشد بلوک else if اجرا خواهد شد و اگر شرط Boolean expression3 درست باشد else if دوم اجرا خواهد شد. اگر هیچکدام از شرط های گفته شده درست نباشند بلوک else اجرا می شود. برای مثال به کد زیر توجه کنید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 30;

      if( x == 10 ){
         System.out.print(Value of X is 10);
      }else if( x == 20 ){
         System.out.print(Value of X is 20);
      }else if( x == 30 ){
         System.out.print(Value of X is 30);
      }else{
         System.out.print(This is else statement);
      }
   }
}
<java>
خروجی این کد به شکل زیر خواهد بود:
<text>
Value of X is 30
<text>

!!دستورات if تودرتو
در داخل هر سه شکل if که گفته شد می توان از دستوارت if به شکل های گفته شده به صورت تو در تو استفاده کرد. برای درک بهتر به مثال زیر توجه کنید:
<java>
if(Boolean_expression 1){
   //Executes when the Boolean expression 1 is true
   if(Boolean_expression 2){
      //Executes when the Boolean expression 2 is true
   }
}
<java>
فقط توجه داشته باشید که برای دستورات چند خطی می توان از {} برای ساخت بلوک دستور استفاده کرد ولی اگر دستور مورد نظر یک خطی باشد نیازی به استفاده از این علائم نیست. همچنین برای if های تو در تو باید قانون تقدم و تاخر بلوک ها حفظ شود به این معنی که باید همیشه بلوک های داخلی که دیرتر باز شده اند زودتر بسته شوند و بلوک های بیرونی که زودتر از همه باز شده اند دیرتر از همه بسته شوند. برای راحتی کار می توان همچنان که در برنامه های زبان جاوا مصطلح است بلوک های داخلی را کمی داخل تر از بلوک های خارجی نوشت. برای مثال در کد بالا if داخلی کمی فرورفته تر از if خارجی است. با رعایت این قائده کد شما بسیار خواناتر خواهد بود. برای مثال if های تودرتو به کد زیر دقت کنید.
<java>
public class Test {

   public static void main(String args[]){
      int x = 30;
      int y = 10;

      if( x == 30 ){
         if( y == 10 ){
             System.out.print(X = 30 and Y = 10);
          }
       }
    }
}
<java>
خروجی به شکل زیر خواهد بود:
<text>
X = 30 and Y = 10
<text>

!!شرط switch
اگر یک متغیر چندین حالت داشته باشد و حالت های رخ دهنده آن متغیر برای ما مشخص باشد می توان از شرط switch برای بررسی ان استفاده کرد. هر مقداری که ممکن است برای متغیر پیش بیاید یک case نامیده می شود و مقدار کنونی متغیر با کیس های گوناگون بررسی خواهد شد و اگر با یک کیس تناسب داشت کدهای متناظر با آن کیس اجرا خواهد شد. دقت کنید که همان طور که در توضیح break در بخش حلقه ها توضیح دادیم انتهای هر case یک break خواهیم داشت. البته اگر در انتهای case از break استفاده نکنیم با case بعدی هم متغیر بررسی خواهد شد و اگر مناسب باشد کد آن case هم اجرا خواهد شد. شکل نوشتاری ان شرط به شکل زیر است:
<java>
switch(expression){
    case value :
       //Statements
       break; //optional
    case value :
       //Statements
       break; //optional
    //You can have any number of case statements.
    default : //Optional
       //Statements
}
<java>
برای استفاده از switch قواعد زیر وجود دارد.
# متغیر های قابل استفاده در داخل switch فقط می تواند اعداد، کاراکتر ها و Enum ها باشد
# هر تعداد case که بخواهید می توانید در یک switch استفاده کنید. بعد از کلمه کلیدی case و مقدار متغیر باید از علامت دونقطه(:) استفاده کنید.
# نوع داده مقداری که به هر case می دهیم باید با نوع داده متغیری که برای switch استفاده کرده ایم یکی باشد. همچنین مقداری که برای case در نظر می گیریم باید ثابت باشد یا مقدار باشد و نمی توان یک مقدار نامعلوم در آن قرار داد.
# وقتی که یک مقدار متغیر switch با مقدار یکی از case ها برابر بود کد آن case تا رسیدن به خط break اجرا خواهد شد.
# وقتی که برنامه در حال اجرا به خط break برسد باید از کل بلوک switch  خارجی می شود.
# گذاشتن break برای هر case اختیاری است ولی اگر پس از کد case break گذاشته نشود case بعدی هم بررسی خواهد شد و در صورت تطبیق ان نیزاجرا خواهد شد تا وقتی که به یک break برسد و از بلوک switch خارج شود.
# هر شرط switch می تواند یک بخش به نام default داشته باشد. این بخش در انتهای بلوک case می آید. دلیل استفاده از این بخش این است که اگر هیچکدام از case ها اجرا نشود این قسمت اجرا خواهد شد.
شکل دیاگرام این شرط به شکل زیر خواهد بود:
||http://tosinso.com/files/get/e31e81ee-cbf5-4102-9609-ddaaf5bce1c5||
کد زیر مثالی از استفاده بلوک switch می باشد.
<java>
public class Test {

   public static void main(String args[]){
      //char grade = args[0].charAt(0);
      char grade = 'C';

      switch(grade)
      {
         case 'A' :
            System.out.println(Excellent!); 
            break;
         case 'B' :
         case 'C' :
            System.out.println(Well done);
            break;
         case 'D' :
            System.out.println(You passed);
         case 'F' :
            System.out.println(Better try again);
            break;
         default :
            System.out.println(Invalid grade);
      }
      System.out.println(Your grade is  + grade);
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
Well done
Your grade is a C
<text>
اگر یک شرط if-else ساده داشته باشیم می توانیم آن را با استفاده از عملگر ?: پیاده سازی کنیم. این عملگر را قبلا در بخش عملگر ها توضیح داده ایم. که شکل کلی آن به صورت زیر است:
<java>
Exp1 ? Exp2 : Exp3;
<java>
اگر شرط موجود در Expr1 درست باشد آنگاه مقدار Expr2 اجرا می شود و اگر غلط باشد کد Expr3 اجرا خواهد شد. دقت داشته باشید که بین Expr2 و Expr3 از علامت دونقطه استفاده کرده ایم. از این عملگر می توان برای مقدار دهی یک متغیر نیز استفاده کرد که اگر expr1 درست باشد مقدار متغیر برابر expr2 بوده و اگر غلط باشد مقدار متغیر برابر expr3 خواهد بود. شرط ها جزء اصلی برنامه نویسی می باشند. پس بهتر است که در استفاده از آنها تسلط پیدا کیند. *Itpro باشید*

نویسنده: مهدی عادلی فر
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

زبان جاوا عبارات شرطی زیر را فراهم می آورد که آنها را شرح خواهیم داد.

آموزش استفاده از عبارات شرطی if

یک عبارت شرطی if از یک شرط و یک یا چند عبارت اجرایی تشکیل شده است. شکل نوشتاری آن مانند کد زیر است.

if(Boolean_expression)
{
   //Statements will execute if the Boolean expression is true
}

اگر شرط موجود در قسمت Boolean expression نتیجه true دهد پس بلوک کد داخل if اجرا می شود اما اگر مقدار شرط false باشد قسمت کد داخل بلوک if اجرا نمی شود و خط بعد از بلوک if اجرا خواهد شد. دیاگرام این شرط به شکل زیر خواهد بود.

با سلام به همه دوستان و همراهان Itpro. در بخش های قبل گفتیم که برنامه های جاوا خط به خط از بالا به پایین اجرا می شوند. در قسمت قبل گفتیم که حلقه ها نحوه اجرا را تغییر می دهند و باعث می شوند که قسمتی از کد چند بار اجرا شود. در این بخش شرط ها توضیح داده می شوند. شرط ها به گونه ای هستند که تصمیم می گیریم قسمتی از کد اجرا بشود یا خیر. شرط ها یک یا چند شرط را بررسی می کنند و اگر شرط درست بود کد متناظر با آن شرط را اجرا می کنند. شکل زیر دیاگرام شرط ها را نشان می دهد.
||http://tosinso.com/files/get/8433dc6e-247b-49b7-a337-8fd04e78fe6b||
زبان جاوا عبارات شرطی زیر را فراهم می آورد که آنها را شرح خواهیم داد.

!!عبارات شرطی if
یک عبارت شرطی if از یک شرط و یک یا چند عبارت اجرایی تشکیل شده است. شکل نوشتاری آن مانند کد زیر است.
<java>
if(Boolean_expression)
{
   //Statements will execute if the Boolean expression is true
}
<java>
اگر شرط موجود در قسمت Boolean expression نتیجه true دهد پس بلوک کد داخل if اجرا می شود اما اگر مقدار شرط false باشد قسمت کد داخل بلوک if اجرا نمی شود و خط بعد از بلوک if اجرا خواهد شد. دیاگرام این شرط به شکل زیر خواهد بود.
||http://tosinso.com/files/get/bbbdaaed-ae50-42fb-9185-4ecc41dd6c41||
مثال زیر نحوه استفاده از این شرط را نشان می دهد.
<java>
public class Test {

   public static void main(String args[]){
      int x = 10;

      if( x < 20 ){
         System.out.print(This is if statement);
      }
   }
}
<java>
که خروجی کد به شکل زیر خواهد بود:
<text>
This is if statement
<text>

!!شرط if-else
یک شرط if می تواند با یک else  همراه باشد. که نحوه ی این شرط به این شکل است که اگر شرط مورد نظر درست باشد دستور خود if و اگر شرط غلط باشد دستور else اجرا خواهد شد. نحوه نوشتاری این شرط به شکل زیر است:
<java>
if(Boolean_expression){
   //Executes when the Boolean expression is true
}else{
   //Executes when the Boolean expression is false
}
<java>
همانطور ک گفته شد اگر مقدار Boolean expression برابر true باشد بلوک if اجرا می شود و اگر این مقدار false باشد بلوک else اجرا خواهد شد. دیاگرام این شرط به شکل زیر خواهد بود 
||http://tosinso.com/files/get/1cdfc9e9-1107-4d4f-b09f-81c7da38893d||
برای مثال به کد زیر توجه کنید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 30;

      if( x < 20 ){
         System.out.print(This is if statement);
      }else{
         System.out.print(This is else statement);
      }
   }
}
<java>
که نتیجه آن به شکل زیر خواهد بود 
<text>
This is else statement
<text>

!!شرط if… else if … else  
یک شرط if می تواند با یک یا چند else if همراه باشد. این حالت زمانی استفاده می شود که بخواهیم حالت های مختلف شرط را بررسی کنیم. برای استفاده از این شرط باید به نکات زیر دقت کنید:
# اگر پس از if از هر چند تا else if استفاده کنید اما بهتر است که در انتهای آن از یک بلوک  else استفاده کنید. 
# هیچگاه نمی توان بعد از بلوک else  از else if استفاده کرد. 
# اگر یک else if اجرا شود بقیه else if ها و else ها اجرا نخواهند شد.
نحوه نوشتن این شرط به شکل زیر خواهد بود:
<java>
if(Boolean_expression 1){
   //Executes when the Boolean expression 1 is true
}else if(Boolean_expression 2){
   //Executes when the Boolean expression 2 is true
}else if(Boolean_expression 3){
   //Executes when the Boolean expression 3 is true
}else {
   //Executes when the none of the above condition is true.
}
<java>
اگر مقدار Boolean expression 1 درست باشد بلوک if اجرا خواهد شد و اگر Boolean expression2 درست باشد بلوک else if اجرا خواهد شد و اگر شرط Boolean expression3 درست باشد else if دوم اجرا خواهد شد. اگر هیچکدام از شرط های گفته شده درست نباشند بلوک else اجرا می شود. برای مثال به کد زیر توجه کنید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 30;

      if( x == 10 ){
         System.out.print(Value of X is 10);
      }else if( x == 20 ){
         System.out.print(Value of X is 20);
      }else if( x == 30 ){
         System.out.print(Value of X is 30);
      }else{
         System.out.print(This is else statement);
      }
   }
}
<java>
خروجی این کد به شکل زیر خواهد بود:
<text>
Value of X is 30
<text>

!!دستورات if تودرتو
در داخل هر سه شکل if که گفته شد می توان از دستوارت if به شکل های گفته شده به صورت تو در تو استفاده کرد. برای درک بهتر به مثال زیر توجه کنید:
<java>
if(Boolean_expression 1){
   //Executes when the Boolean expression 1 is true
   if(Boolean_expression 2){
      //Executes when the Boolean expression 2 is true
   }
}
<java>
فقط توجه داشته باشید که برای دستورات چند خطی می توان از {} برای ساخت بلوک دستور استفاده کرد ولی اگر دستور مورد نظر یک خطی باشد نیازی به استفاده از این علائم نیست. همچنین برای if های تو در تو باید قانون تقدم و تاخر بلوک ها حفظ شود به این معنی که باید همیشه بلوک های داخلی که دیرتر باز شده اند زودتر بسته شوند و بلوک های بیرونی که زودتر از همه باز شده اند دیرتر از همه بسته شوند. برای راحتی کار می توان همچنان که در برنامه های زبان جاوا مصطلح است بلوک های داخلی را کمی داخل تر از بلوک های خارجی نوشت. برای مثال در کد بالا if داخلی کمی فرورفته تر از if خارجی است. با رعایت این قائده کد شما بسیار خواناتر خواهد بود. برای مثال if های تودرتو به کد زیر دقت کنید.
<java>
public class Test {

   public static void main(String args[]){
      int x = 30;
      int y = 10;

      if( x == 30 ){
         if( y == 10 ){
             System.out.print(X = 30 and Y = 10);
          }
       }
    }
}
<java>
خروجی به شکل زیر خواهد بود:
<text>
X = 30 and Y = 10
<text>

!!شرط switch
اگر یک متغیر چندین حالت داشته باشد و حالت های رخ دهنده آن متغیر برای ما مشخص باشد می توان از شرط switch برای بررسی ان استفاده کرد. هر مقداری که ممکن است برای متغیر پیش بیاید یک case نامیده می شود و مقدار کنونی متغیر با کیس های گوناگون بررسی خواهد شد و اگر با یک کیس تناسب داشت کدهای متناظر با آن کیس اجرا خواهد شد. دقت کنید که همان طور که در توضیح break در بخش حلقه ها توضیح دادیم انتهای هر case یک break خواهیم داشت. البته اگر در انتهای case از break استفاده نکنیم با case بعدی هم متغیر بررسی خواهد شد و اگر مناسب باشد کد آن case هم اجرا خواهد شد. شکل نوشتاری ان شرط به شکل زیر است:
<java>
switch(expression){
    case value :
       //Statements
       break; //optional
    case value :
       //Statements
       break; //optional
    //You can have any number of case statements.
    default : //Optional
       //Statements
}
<java>
برای استفاده از switch قواعد زیر وجود دارد.
# متغیر های قابل استفاده در داخل switch فقط می تواند اعداد، کاراکتر ها و Enum ها باشد
# هر تعداد case که بخواهید می توانید در یک switch استفاده کنید. بعد از کلمه کلیدی case و مقدار متغیر باید از علامت دونقطه(:) استفاده کنید.
# نوع داده مقداری که به هر case می دهیم باید با نوع داده متغیری که برای switch استفاده کرده ایم یکی باشد. همچنین مقداری که برای case در نظر می گیریم باید ثابت باشد یا مقدار باشد و نمی توان یک مقدار نامعلوم در آن قرار داد.
# وقتی که یک مقدار متغیر switch با مقدار یکی از case ها برابر بود کد آن case تا رسیدن به خط break اجرا خواهد شد.
# وقتی که برنامه در حال اجرا به خط break برسد باید از کل بلوک switch  خارجی می شود.
# گذاشتن break برای هر case اختیاری است ولی اگر پس از کد case break گذاشته نشود case بعدی هم بررسی خواهد شد و در صورت تطبیق ان نیزاجرا خواهد شد تا وقتی که به یک break برسد و از بلوک switch خارج شود.
# هر شرط switch می تواند یک بخش به نام default داشته باشد. این بخش در انتهای بلوک case می آید. دلیل استفاده از این بخش این است که اگر هیچکدام از case ها اجرا نشود این قسمت اجرا خواهد شد.
شکل دیاگرام این شرط به شکل زیر خواهد بود:
||http://tosinso.com/files/get/e31e81ee-cbf5-4102-9609-ddaaf5bce1c5||
کد زیر مثالی از استفاده بلوک switch می باشد.
<java>
public class Test {

   public static void main(String args[]){
      //char grade = args[0].charAt(0);
      char grade = 'C';

      switch(grade)
      {
         case 'A' :
            System.out.println(Excellent!); 
            break;
         case 'B' :
         case 'C' :
            System.out.println(Well done);
            break;
         case 'D' :
            System.out.println(You passed);
         case 'F' :
            System.out.println(Better try again);
            break;
         default :
            System.out.println(Invalid grade);
      }
      System.out.println(Your grade is  + grade);
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
Well done
Your grade is a C
<text>
اگر یک شرط if-else ساده داشته باشیم می توانیم آن را با استفاده از عملگر ?: پیاده سازی کنیم. این عملگر را قبلا در بخش عملگر ها توضیح داده ایم. که شکل کلی آن به صورت زیر است:
<java>
Exp1 ? Exp2 : Exp3;
<java>
اگر شرط موجود در Expr1 درست باشد آنگاه مقدار Expr2 اجرا می شود و اگر غلط باشد کد Expr3 اجرا خواهد شد. دقت داشته باشید که بین Expr2 و Expr3 از علامت دونقطه استفاده کرده ایم. از این عملگر می توان برای مقدار دهی یک متغیر نیز استفاده کرد که اگر expr1 درست باشد مقدار متغیر برابر expr2 بوده و اگر غلط باشد مقدار متغیر برابر expr3 خواهد بود. شرط ها جزء اصلی برنامه نویسی می باشند. پس بهتر است که در استفاده از آنها تسلط پیدا کیند. *Itpro باشید*

نویسنده: مهدی عادلی فر
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

مثال زیر نحوه استفاده از این شرط را نشان می دهد.

public class Test {

   public static void main(String args[]){
      int x = 10;

      if( x < 20 ){
         System.out.print("This is if statement");
      }
   }
}

که خروجی کد به شکل زیر خواهد بود:

This is if statement

آموزش استفاده از شرط if-else

یک شرط if می تواند با یک else همراه باشد. که نحوه ی این شرط به این شکل است که اگر شرط مورد نظر درست باشد دستور خود if و اگر شرط غلط باشد دستور else اجرا خواهد شد. نحوه نوشتاری این شرط به شکل زیر است:

if(Boolean_expression){
   //Executes when the Boolean expression is true
}else{
   //Executes when the Boolean expression is false
}

همانطور ک گفته شد اگر مقدار Boolean expression برابر true باشد بلوک if اجرا می شود و اگر این مقدار false باشد بلوک else اجرا خواهد شد. دیاگرام این شرط به شکل زیر خواهد بود

با سلام به همه دوستان و همراهان Itpro. در بخش های قبل گفتیم که برنامه های جاوا خط به خط از بالا به پایین اجرا می شوند. در قسمت قبل گفتیم که حلقه ها نحوه اجرا را تغییر می دهند و باعث می شوند که قسمتی از کد چند بار اجرا شود. در این بخش شرط ها توضیح داده می شوند. شرط ها به گونه ای هستند که تصمیم می گیریم قسمتی از کد اجرا بشود یا خیر. شرط ها یک یا چند شرط را بررسی می کنند و اگر شرط درست بود کد متناظر با آن شرط را اجرا می کنند. شکل زیر دیاگرام شرط ها را نشان می دهد.
||http://tosinso.com/files/get/8433dc6e-247b-49b7-a337-8fd04e78fe6b||
زبان جاوا عبارات شرطی زیر را فراهم می آورد که آنها را شرح خواهیم داد.

!!عبارات شرطی if
یک عبارت شرطی if از یک شرط و یک یا چند عبارت اجرایی تشکیل شده است. شکل نوشتاری آن مانند کد زیر است.
<java>
if(Boolean_expression)
{
   //Statements will execute if the Boolean expression is true
}
<java>
اگر شرط موجود در قسمت Boolean expression نتیجه true دهد پس بلوک کد داخل if اجرا می شود اما اگر مقدار شرط false باشد قسمت کد داخل بلوک if اجرا نمی شود و خط بعد از بلوک if اجرا خواهد شد. دیاگرام این شرط به شکل زیر خواهد بود.
||http://tosinso.com/files/get/bbbdaaed-ae50-42fb-9185-4ecc41dd6c41||
مثال زیر نحوه استفاده از این شرط را نشان می دهد.
<java>
public class Test {

   public static void main(String args[]){
      int x = 10;

      if( x < 20 ){
         System.out.print(This is if statement);
      }
   }
}
<java>
که خروجی کد به شکل زیر خواهد بود:
<text>
This is if statement
<text>

!!شرط if-else
یک شرط if می تواند با یک else  همراه باشد. که نحوه ی این شرط به این شکل است که اگر شرط مورد نظر درست باشد دستور خود if و اگر شرط غلط باشد دستور else اجرا خواهد شد. نحوه نوشتاری این شرط به شکل زیر است:
<java>
if(Boolean_expression){
   //Executes when the Boolean expression is true
}else{
   //Executes when the Boolean expression is false
}
<java>
همانطور ک گفته شد اگر مقدار Boolean expression برابر true باشد بلوک if اجرا می شود و اگر این مقدار false باشد بلوک else اجرا خواهد شد. دیاگرام این شرط به شکل زیر خواهد بود 
||http://tosinso.com/files/get/1cdfc9e9-1107-4d4f-b09f-81c7da38893d||
برای مثال به کد زیر توجه کنید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 30;

      if( x < 20 ){
         System.out.print(This is if statement);
      }else{
         System.out.print(This is else statement);
      }
   }
}
<java>
که نتیجه آن به شکل زیر خواهد بود 
<text>
This is else statement
<text>

!!شرط if… else if … else  
یک شرط if می تواند با یک یا چند else if همراه باشد. این حالت زمانی استفاده می شود که بخواهیم حالت های مختلف شرط را بررسی کنیم. برای استفاده از این شرط باید به نکات زیر دقت کنید:
# اگر پس از if از هر چند تا else if استفاده کنید اما بهتر است که در انتهای آن از یک بلوک  else استفاده کنید. 
# هیچگاه نمی توان بعد از بلوک else  از else if استفاده کرد. 
# اگر یک else if اجرا شود بقیه else if ها و else ها اجرا نخواهند شد.
نحوه نوشتن این شرط به شکل زیر خواهد بود:
<java>
if(Boolean_expression 1){
   //Executes when the Boolean expression 1 is true
}else if(Boolean_expression 2){
   //Executes when the Boolean expression 2 is true
}else if(Boolean_expression 3){
   //Executes when the Boolean expression 3 is true
}else {
   //Executes when the none of the above condition is true.
}
<java>
اگر مقدار Boolean expression 1 درست باشد بلوک if اجرا خواهد شد و اگر Boolean expression2 درست باشد بلوک else if اجرا خواهد شد و اگر شرط Boolean expression3 درست باشد else if دوم اجرا خواهد شد. اگر هیچکدام از شرط های گفته شده درست نباشند بلوک else اجرا می شود. برای مثال به کد زیر توجه کنید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 30;

      if( x == 10 ){
         System.out.print(Value of X is 10);
      }else if( x == 20 ){
         System.out.print(Value of X is 20);
      }else if( x == 30 ){
         System.out.print(Value of X is 30);
      }else{
         System.out.print(This is else statement);
      }
   }
}
<java>
خروجی این کد به شکل زیر خواهد بود:
<text>
Value of X is 30
<text>

!!دستورات if تودرتو
در داخل هر سه شکل if که گفته شد می توان از دستوارت if به شکل های گفته شده به صورت تو در تو استفاده کرد. برای درک بهتر به مثال زیر توجه کنید:
<java>
if(Boolean_expression 1){
   //Executes when the Boolean expression 1 is true
   if(Boolean_expression 2){
      //Executes when the Boolean expression 2 is true
   }
}
<java>
فقط توجه داشته باشید که برای دستورات چند خطی می توان از {} برای ساخت بلوک دستور استفاده کرد ولی اگر دستور مورد نظر یک خطی باشد نیازی به استفاده از این علائم نیست. همچنین برای if های تو در تو باید قانون تقدم و تاخر بلوک ها حفظ شود به این معنی که باید همیشه بلوک های داخلی که دیرتر باز شده اند زودتر بسته شوند و بلوک های بیرونی که زودتر از همه باز شده اند دیرتر از همه بسته شوند. برای راحتی کار می توان همچنان که در برنامه های زبان جاوا مصطلح است بلوک های داخلی را کمی داخل تر از بلوک های خارجی نوشت. برای مثال در کد بالا if داخلی کمی فرورفته تر از if خارجی است. با رعایت این قائده کد شما بسیار خواناتر خواهد بود. برای مثال if های تودرتو به کد زیر دقت کنید.
<java>
public class Test {

   public static void main(String args[]){
      int x = 30;
      int y = 10;

      if( x == 30 ){
         if( y == 10 ){
             System.out.print(X = 30 and Y = 10);
          }
       }
    }
}
<java>
خروجی به شکل زیر خواهد بود:
<text>
X = 30 and Y = 10
<text>

!!شرط switch
اگر یک متغیر چندین حالت داشته باشد و حالت های رخ دهنده آن متغیر برای ما مشخص باشد می توان از شرط switch برای بررسی ان استفاده کرد. هر مقداری که ممکن است برای متغیر پیش بیاید یک case نامیده می شود و مقدار کنونی متغیر با کیس های گوناگون بررسی خواهد شد و اگر با یک کیس تناسب داشت کدهای متناظر با آن کیس اجرا خواهد شد. دقت کنید که همان طور که در توضیح break در بخش حلقه ها توضیح دادیم انتهای هر case یک break خواهیم داشت. البته اگر در انتهای case از break استفاده نکنیم با case بعدی هم متغیر بررسی خواهد شد و اگر مناسب باشد کد آن case هم اجرا خواهد شد. شکل نوشتاری ان شرط به شکل زیر است:
<java>
switch(expression){
    case value :
       //Statements
       break; //optional
    case value :
       //Statements
       break; //optional
    //You can have any number of case statements.
    default : //Optional
       //Statements
}
<java>
برای استفاده از switch قواعد زیر وجود دارد.
# متغیر های قابل استفاده در داخل switch فقط می تواند اعداد، کاراکتر ها و Enum ها باشد
# هر تعداد case که بخواهید می توانید در یک switch استفاده کنید. بعد از کلمه کلیدی case و مقدار متغیر باید از علامت دونقطه(:) استفاده کنید.
# نوع داده مقداری که به هر case می دهیم باید با نوع داده متغیری که برای switch استفاده کرده ایم یکی باشد. همچنین مقداری که برای case در نظر می گیریم باید ثابت باشد یا مقدار باشد و نمی توان یک مقدار نامعلوم در آن قرار داد.
# وقتی که یک مقدار متغیر switch با مقدار یکی از case ها برابر بود کد آن case تا رسیدن به خط break اجرا خواهد شد.
# وقتی که برنامه در حال اجرا به خط break برسد باید از کل بلوک switch  خارجی می شود.
# گذاشتن break برای هر case اختیاری است ولی اگر پس از کد case break گذاشته نشود case بعدی هم بررسی خواهد شد و در صورت تطبیق ان نیزاجرا خواهد شد تا وقتی که به یک break برسد و از بلوک switch خارج شود.
# هر شرط switch می تواند یک بخش به نام default داشته باشد. این بخش در انتهای بلوک case می آید. دلیل استفاده از این بخش این است که اگر هیچکدام از case ها اجرا نشود این قسمت اجرا خواهد شد.
شکل دیاگرام این شرط به شکل زیر خواهد بود:
||http://tosinso.com/files/get/e31e81ee-cbf5-4102-9609-ddaaf5bce1c5||
کد زیر مثالی از استفاده بلوک switch می باشد.
<java>
public class Test {

   public static void main(String args[]){
      //char grade = args[0].charAt(0);
      char grade = 'C';

      switch(grade)
      {
         case 'A' :
            System.out.println(Excellent!); 
            break;
         case 'B' :
         case 'C' :
            System.out.println(Well done);
            break;
         case 'D' :
            System.out.println(You passed);
         case 'F' :
            System.out.println(Better try again);
            break;
         default :
            System.out.println(Invalid grade);
      }
      System.out.println(Your grade is  + grade);
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
Well done
Your grade is a C
<text>
اگر یک شرط if-else ساده داشته باشیم می توانیم آن را با استفاده از عملگر ?: پیاده سازی کنیم. این عملگر را قبلا در بخش عملگر ها توضیح داده ایم. که شکل کلی آن به صورت زیر است:
<java>
Exp1 ? Exp2 : Exp3;
<java>
اگر شرط موجود در Expr1 درست باشد آنگاه مقدار Expr2 اجرا می شود و اگر غلط باشد کد Expr3 اجرا خواهد شد. دقت داشته باشید که بین Expr2 و Expr3 از علامت دونقطه استفاده کرده ایم. از این عملگر می توان برای مقدار دهی یک متغیر نیز استفاده کرد که اگر expr1 درست باشد مقدار متغیر برابر expr2 بوده و اگر غلط باشد مقدار متغیر برابر expr3 خواهد بود. شرط ها جزء اصلی برنامه نویسی می باشند. پس بهتر است که در استفاده از آنها تسلط پیدا کیند. *Itpro باشید*

نویسنده: مهدی عادلی فر
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

برای مثال به کد زیر توجه کنید:

public class Test {

   public static void main(String args[]){
      int x = 30;

      if( x < 20 ){
         System.out.print("This is if statement");
      }else{
         System.out.print("This is else statement");
      }
   }
}

که نتیجه آن به شکل زیر خواهد بود

This is else statement

آموزش استفاده از شرط if… else if … else

یک شرط if می تواند با یک یا چند else if همراه باشد. این حالت زمانی استفاده می شود که بخواهیم حالت های مختلف شرط را بررسی کنیم. برای استفاده از این شرط باید به نکات زیر دقت کنید:

  1. اگر پس از if از هر چند تا else if استفاده کنید اما بهتر است که در انتهای آن از یک بلوک else استفاده کنید.
  2. هیچگاه نمی توان بعد از بلوک else از else if استفاده کرد.
  3. اگر یک else if اجرا شود بقیه else if ها و else ها اجرا نخواهند شد.

نحوه نوشتن این شرط به شکل زیر خواهد بود:

if(Boolean_expression 1){
   //Executes when the Boolean expression 1 is true
}else if(Boolean_expression 2){
   //Executes when the Boolean expression 2 is true
}else if(Boolean_expression 3){
   //Executes when the Boolean expression 3 is true
}else {
   //Executes when the none of the above condition is true.
}

اگر مقدار Boolean expression 1 درست باشد بلوک if اجرا خواهد شد و اگر Boolean expression2 درست باشد بلوک else if اجرا خواهد شد و اگر شرط Boolean expression3 درست باشد else if دوم اجرا خواهد شد. اگر هیچکدام از شرط های گفته شده درست نباشند بلوک else اجرا می شود. برای مثال به کد زیر توجه کنید:

public class Test {

   public static void main(String args[]){
      int x = 30;

      if( x == 10 ){
         System.out.print("Value of X is 10");
      }else if( x == 20 ){
         System.out.print("Value of X is 20");
      }else if( x == 30 ){
         System.out.print("Value of X is 30");
      }else{
         System.out.print("This is else statement");
      }
   }
}

خروجی این کد به شکل زیر خواهد بود:

Value of X is 30

آموزش استفاده از دستورات if تو در تو

در داخل هر سه شکل if که گفته شد می توان از دستوارت if به شکل های گفته شده به صورت تو در تو استفاده کرد. برای درک بهتر به مثال زیر توجه کنید:

if(Boolean_expression 1){
   //Executes when the Boolean expression 1 is true
   if(Boolean_expression 2){
      //Executes when the Boolean expression 2 is true
   }
}

فقط توجه داشته باشید که برای دستورات چند خطی می توان از {} برای ساخت بلوک دستور استفاده کرد ولی اگر دستور مورد نظر یک خطی باشد نیازی به استفاده از این علائم نیست. همچنین برای if های تو در تو باید قانون تقدم و تاخر بلوک ها حفظ شود به این معنی که باید همیشه بلوک های داخلی که دیرتر باز شده اند زودتر بسته شوند و بلوک های بیرونی که زودتر از همه باز شده اند دیرتر از همه بسته شوند.

برای راحتی کار می توان همچنان که در برنامه های زبان جاوا مصطلح است بلوک های داخلی را کمی داخل تر از بلوک های خارجی نوشت. برای مثال در کد بالا if داخلی کمی فرورفته تر از if خارجی است. با رعایت این قائده کد شما بسیار خواناتر خواهد بود. برای مثال if های تودرتو به کد زیر دقت کنید.

public class Test {

   public static void main(String args[]){
      int x = 30;
      int y = 10;

      if( x == 30 ){
         if( y == 10 ){
             System.out.print("X = 30 and Y = 10");
          }
       }
    }
}

خروجی به شکل زیر خواهد بود:

X = 30 and Y = 10

آموزش استفاده از شرط switch

اگر یک متغیر چندین حالت داشته باشد و حالت های رخ دهنده آن متغیر برای ما مشخص باشد می توان از شرط switch برای بررسی ان استفاده کرد. هر مقداری که ممکن است برای متغیر پیش بیاید یک case نامیده می شود و مقدار کنونی متغیر با کیس های گوناگون بررسی خواهد شد

و اگر با یک کیس تناسب داشت کدهای متناظر با آن کیس اجرا خواهد شد. دقت کنید که همان طور که در توضیح break در بخش حلقه ها توضیح دادیم انتهای هر case یک break خواهیم داشت. البته اگر در انتهای case از break استفاده نکنیم با case بعدی هم متغیر بررسی خواهد شد و اگر مناسب باشد کد آن case هم اجرا خواهد شد. شکل نوشتاری ان شرط به شکل زیر است:

switch(expression){
    case value :
       //Statements
       break; //optional
    case value :
       //Statements
       break; //optional
    //You can have any number of case statements.
    default : //Optional
       //Statements
}

برای استفاده از switch قواعد زیر وجود دارد.

  1. متغیر های قابل استفاده در داخل switch فقط می تواند اعداد، کاراکتر ها و Enum ها باشد
  2. هر تعداد case که بخواهید می توانید در یک switch استفاده کنید. بعد از کلمه کلیدی case و مقدار متغیر باید از علامت دونقطه(:) استفاده کنید.
  3. نوع داده مقداری که به هر case می دهیم باید با نوع داده متغیری که برای switch استفاده کرده ایم یکی باشد. همچنین مقداری که برای case در نظر می گیریم باید ثابت باشد یا مقدار باشد و نمی توان یک مقدار نامعلوم در آن قرار داد.
  4. وقتی که یک مقدار متغیر switch با مقدار یکی از case ها برابر بود کد آن case تا رسیدن به خط break اجرا خواهد شد.
  5. وقتی که برنامه در حال اجرا به خط break برسد باید از کل بلوک switch خارجی می شود.
  6. گذاشتن break برای هر case اختیاری است ولی اگر پس از کد case break گذاشته نشود case بعدی هم بررسی خواهد شد و در صورت تطبیق ان نیزاجرا خواهد شد تا وقتی که به یک break برسد و از بلوک switch خارج شود.
  7. هر شرط switch می تواند یک بخش به نام default داشته باشد. این بخش در انتهای بلوک case می آید. دلیل استفاده از این بخش این است که اگر هیچکدام از case ها اجرا نشود این قسمت اجرا خواهد شد.

شکل دیاگرام این شرط به شکل زیر خواهد بود:

با سلام به همه دوستان و همراهان Itpro. در بخش های قبل گفتیم که برنامه های جاوا خط به خط از بالا به پایین اجرا می شوند. در قسمت قبل گفتیم که حلقه ها نحوه اجرا را تغییر می دهند و باعث می شوند که قسمتی از کد چند بار اجرا شود. در این بخش شرط ها توضیح داده می شوند. شرط ها به گونه ای هستند که تصمیم می گیریم قسمتی از کد اجرا بشود یا خیر. شرط ها یک یا چند شرط را بررسی می کنند و اگر شرط درست بود کد متناظر با آن شرط را اجرا می کنند. شکل زیر دیاگرام شرط ها را نشان می دهد.
||http://tosinso.com/files/get/8433dc6e-247b-49b7-a337-8fd04e78fe6b||
زبان جاوا عبارات شرطی زیر را فراهم می آورد که آنها را شرح خواهیم داد.

!!عبارات شرطی if
یک عبارت شرطی if از یک شرط و یک یا چند عبارت اجرایی تشکیل شده است. شکل نوشتاری آن مانند کد زیر است.
<java>
if(Boolean_expression)
{
   //Statements will execute if the Boolean expression is true
}
<java>
اگر شرط موجود در قسمت Boolean expression نتیجه true دهد پس بلوک کد داخل if اجرا می شود اما اگر مقدار شرط false باشد قسمت کد داخل بلوک if اجرا نمی شود و خط بعد از بلوک if اجرا خواهد شد. دیاگرام این شرط به شکل زیر خواهد بود.
||http://tosinso.com/files/get/bbbdaaed-ae50-42fb-9185-4ecc41dd6c41||
مثال زیر نحوه استفاده از این شرط را نشان می دهد.
<java>
public class Test {

   public static void main(String args[]){
      int x = 10;

      if( x < 20 ){
         System.out.print(This is if statement);
      }
   }
}
<java>
که خروجی کد به شکل زیر خواهد بود:
<text>
This is if statement
<text>

!!شرط if-else
یک شرط if می تواند با یک else  همراه باشد. که نحوه ی این شرط به این شکل است که اگر شرط مورد نظر درست باشد دستور خود if و اگر شرط غلط باشد دستور else اجرا خواهد شد. نحوه نوشتاری این شرط به شکل زیر است:
<java>
if(Boolean_expression){
   //Executes when the Boolean expression is true
}else{
   //Executes when the Boolean expression is false
}
<java>
همانطور ک گفته شد اگر مقدار Boolean expression برابر true باشد بلوک if اجرا می شود و اگر این مقدار false باشد بلوک else اجرا خواهد شد. دیاگرام این شرط به شکل زیر خواهد بود 
||http://tosinso.com/files/get/1cdfc9e9-1107-4d4f-b09f-81c7da38893d||
برای مثال به کد زیر توجه کنید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 30;

      if( x < 20 ){
         System.out.print(This is if statement);
      }else{
         System.out.print(This is else statement);
      }
   }
}
<java>
که نتیجه آن به شکل زیر خواهد بود 
<text>
This is else statement
<text>

!!شرط if… else if … else  
یک شرط if می تواند با یک یا چند else if همراه باشد. این حالت زمانی استفاده می شود که بخواهیم حالت های مختلف شرط را بررسی کنیم. برای استفاده از این شرط باید به نکات زیر دقت کنید:
# اگر پس از if از هر چند تا else if استفاده کنید اما بهتر است که در انتهای آن از یک بلوک  else استفاده کنید. 
# هیچگاه نمی توان بعد از بلوک else  از else if استفاده کرد. 
# اگر یک else if اجرا شود بقیه else if ها و else ها اجرا نخواهند شد.
نحوه نوشتن این شرط به شکل زیر خواهد بود:
<java>
if(Boolean_expression 1){
   //Executes when the Boolean expression 1 is true
}else if(Boolean_expression 2){
   //Executes when the Boolean expression 2 is true
}else if(Boolean_expression 3){
   //Executes when the Boolean expression 3 is true
}else {
   //Executes when the none of the above condition is true.
}
<java>
اگر مقدار Boolean expression 1 درست باشد بلوک if اجرا خواهد شد و اگر Boolean expression2 درست باشد بلوک else if اجرا خواهد شد و اگر شرط Boolean expression3 درست باشد else if دوم اجرا خواهد شد. اگر هیچکدام از شرط های گفته شده درست نباشند بلوک else اجرا می شود. برای مثال به کد زیر توجه کنید:
<java>
public class Test {

   public static void main(String args[]){
      int x = 30;

      if( x == 10 ){
         System.out.print(Value of X is 10);
      }else if( x == 20 ){
         System.out.print(Value of X is 20);
      }else if( x == 30 ){
         System.out.print(Value of X is 30);
      }else{
         System.out.print(This is else statement);
      }
   }
}
<java>
خروجی این کد به شکل زیر خواهد بود:
<text>
Value of X is 30
<text>

!!دستورات if تودرتو
در داخل هر سه شکل if که گفته شد می توان از دستوارت if به شکل های گفته شده به صورت تو در تو استفاده کرد. برای درک بهتر به مثال زیر توجه کنید:
<java>
if(Boolean_expression 1){
   //Executes when the Boolean expression 1 is true
   if(Boolean_expression 2){
      //Executes when the Boolean expression 2 is true
   }
}
<java>
فقط توجه داشته باشید که برای دستورات چند خطی می توان از {} برای ساخت بلوک دستور استفاده کرد ولی اگر دستور مورد نظر یک خطی باشد نیازی به استفاده از این علائم نیست. همچنین برای if های تو در تو باید قانون تقدم و تاخر بلوک ها حفظ شود به این معنی که باید همیشه بلوک های داخلی که دیرتر باز شده اند زودتر بسته شوند و بلوک های بیرونی که زودتر از همه باز شده اند دیرتر از همه بسته شوند. برای راحتی کار می توان همچنان که در برنامه های زبان جاوا مصطلح است بلوک های داخلی را کمی داخل تر از بلوک های خارجی نوشت. برای مثال در کد بالا if داخلی کمی فرورفته تر از if خارجی است. با رعایت این قائده کد شما بسیار خواناتر خواهد بود. برای مثال if های تودرتو به کد زیر دقت کنید.
<java>
public class Test {

   public static void main(String args[]){
      int x = 30;
      int y = 10;

      if( x == 30 ){
         if( y == 10 ){
             System.out.print(X = 30 and Y = 10);
          }
       }
    }
}
<java>
خروجی به شکل زیر خواهد بود:
<text>
X = 30 and Y = 10
<text>

!!شرط switch
اگر یک متغیر چندین حالت داشته باشد و حالت های رخ دهنده آن متغیر برای ما مشخص باشد می توان از شرط switch برای بررسی ان استفاده کرد. هر مقداری که ممکن است برای متغیر پیش بیاید یک case نامیده می شود و مقدار کنونی متغیر با کیس های گوناگون بررسی خواهد شد و اگر با یک کیس تناسب داشت کدهای متناظر با آن کیس اجرا خواهد شد. دقت کنید که همان طور که در توضیح break در بخش حلقه ها توضیح دادیم انتهای هر case یک break خواهیم داشت. البته اگر در انتهای case از break استفاده نکنیم با case بعدی هم متغیر بررسی خواهد شد و اگر مناسب باشد کد آن case هم اجرا خواهد شد. شکل نوشتاری ان شرط به شکل زیر است:
<java>
switch(expression){
    case value :
       //Statements
       break; //optional
    case value :
       //Statements
       break; //optional
    //You can have any number of case statements.
    default : //Optional
       //Statements
}
<java>
برای استفاده از switch قواعد زیر وجود دارد.
# متغیر های قابل استفاده در داخل switch فقط می تواند اعداد، کاراکتر ها و Enum ها باشد
# هر تعداد case که بخواهید می توانید در یک switch استفاده کنید. بعد از کلمه کلیدی case و مقدار متغیر باید از علامت دونقطه(:) استفاده کنید.
# نوع داده مقداری که به هر case می دهیم باید با نوع داده متغیری که برای switch استفاده کرده ایم یکی باشد. همچنین مقداری که برای case در نظر می گیریم باید ثابت باشد یا مقدار باشد و نمی توان یک مقدار نامعلوم در آن قرار داد.
# وقتی که یک مقدار متغیر switch با مقدار یکی از case ها برابر بود کد آن case تا رسیدن به خط break اجرا خواهد شد.
# وقتی که برنامه در حال اجرا به خط break برسد باید از کل بلوک switch  خارجی می شود.
# گذاشتن break برای هر case اختیاری است ولی اگر پس از کد case break گذاشته نشود case بعدی هم بررسی خواهد شد و در صورت تطبیق ان نیزاجرا خواهد شد تا وقتی که به یک break برسد و از بلوک switch خارج شود.
# هر شرط switch می تواند یک بخش به نام default داشته باشد. این بخش در انتهای بلوک case می آید. دلیل استفاده از این بخش این است که اگر هیچکدام از case ها اجرا نشود این قسمت اجرا خواهد شد.
شکل دیاگرام این شرط به شکل زیر خواهد بود:
||http://tosinso.com/files/get/e31e81ee-cbf5-4102-9609-ddaaf5bce1c5||
کد زیر مثالی از استفاده بلوک switch می باشد.
<java>
public class Test {

   public static void main(String args[]){
      //char grade = args[0].charAt(0);
      char grade = 'C';

      switch(grade)
      {
         case 'A' :
            System.out.println(Excellent!); 
            break;
         case 'B' :
         case 'C' :
            System.out.println(Well done);
            break;
         case 'D' :
            System.out.println(You passed);
         case 'F' :
            System.out.println(Better try again);
            break;
         default :
            System.out.println(Invalid grade);
      }
      System.out.println(Your grade is  + grade);
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
Well done
Your grade is a C
<text>
اگر یک شرط if-else ساده داشته باشیم می توانیم آن را با استفاده از عملگر ?: پیاده سازی کنیم. این عملگر را قبلا در بخش عملگر ها توضیح داده ایم. که شکل کلی آن به صورت زیر است:
<java>
Exp1 ? Exp2 : Exp3;
<java>
اگر شرط موجود در Expr1 درست باشد آنگاه مقدار Expr2 اجرا می شود و اگر غلط باشد کد Expr3 اجرا خواهد شد. دقت داشته باشید که بین Expr2 و Expr3 از علامت دونقطه استفاده کرده ایم. از این عملگر می توان برای مقدار دهی یک متغیر نیز استفاده کرد که اگر expr1 درست باشد مقدار متغیر برابر expr2 بوده و اگر غلط باشد مقدار متغیر برابر expr3 خواهد بود. شرط ها جزء اصلی برنامه نویسی می باشند. پس بهتر است که در استفاده از آنها تسلط پیدا کیند. *Itpro باشید*

نویسنده: مهدی عادلی فر
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

کد زیر مثالی از استفاده بلوک switch می باشد.

public class Test {

   public static void main(String args[]){
      //char grade = args[0].charAt(0);
      char grade = 'C';

      switch(grade)
      {
         case 'A' :
            System.out.println("Excellent!"); 
            break;
         case 'B' :
         case 'C' :
            System.out.println("Well done");
            break;
         case 'D' :
            System.out.println("You passed");
         case 'F' :
            System.out.println("Better try again");
            break;
         default :
            System.out.println("Invalid grade");
      }
      System.out.println("Your grade is " + grade);
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

Well done
Your grade is a C

اگر یک شرط if-else ساده داشته باشیم می توانیم آن را با استفاده از عملگر ?: پیاده سازی کنیم. این عملگر را قبلا در بخش عملگر ها توضیح داده ایم. که شکل کلی آن به صورت زیر است:

Exp1 ? Exp2 : Exp3;

اگر شرط موجود در Expr1 درست باشد آنگاه مقدار Expr2 اجرا می شود و اگر غلط باشد کد Expr3 اجرا خواهد شد. دقت داشته باشید که بین Expr2 و Expr3 از علامت دونقطه استفاده کرده ایم. از این عملگر می توان برای مقدار دهی یک متغیر نیز استفاده کرد که اگر expr1 درست باشد مقدار متغیر برابر expr2 بوده و اگر غلط باشد مقدار متغیر برابر expr3 خواهد بود. شرط ها جزء اصلی برنامه نویسی می باشند. پس بهتر است که در استفاده از آنها تسلط پیدا کنید

کلاس Wrapper اعداد

اعداد ویژگی های متعددی در زبان جاوا دارند که در این بخش به بحث در مورد اعداد در جاوا می پردازیم. وقتی که شما از اعداد در جاوا استفاده می کنید به این معنی است که شما از انواع داده های اولیه در جاوا مثل byte,int, long, double , … استفاده می نمایید. برای مثال به کد زیر توجه کنید:

int i = 5000;
float gpa = 13.65;
byte mask = 0xaf;

در زمان برنامه نویسی ممکن است وضعیتی پیش بیاید که ما به جای انواع داده اولیه از اشیاء استفاده کنیم. جاوا این امر را با استفاده از کلاس های wrapper میسر می سازد. در جاوا کلاس هایی وجود دارد که متناظر با انواع داده اولیه هستند و در این کلاس ها مجموعه متدهایی تعریف شده است که می تواند در برنامه نویسی بسیار مورد استفاده قرار بگیرد. همه ی کلاس های wrapper از کلاس Number ارث برده اند. شکل زیر انواع این کلاس ها را نشان می دهد.

با سلام به همه دوستان وهمراهان Itpro. اعداد ویژگی های متعددی در زبان جاوا دارند که در این بخش به بحث در مورد اعداد در جاوا می پردازیم. وقتی که شما از اعداد در جاوا استفاده می کنید به این معنی است که شما از انواع داده های اولیه در جاوا مثل byte,int, long, double , … استفاده می نمایید. برای مثال به کد زیر توجه کنید:
<java>
int i = 5000;
float gpa = 13.65;
byte mask = 0xaf;
<java>
در زمان برنامه نویسی ممکن است وضعیتی پیش بیاید که ما به جای انواع داده اولیه از اشیاء استفاده کنیم. جاوا این امر را با استفاده از کلاس های wrapper میسر می سازد. در جاوا کلاس هایی وجود دارد که متناظر با انواع داده اولیه هستند و در این کلاس ها مجموعه متدهایی تعریف شده است که می تواند در برنامه نویسی بسیار مورد استفاده قرار بگیرد. همه ی کلاس های wrapper از کلاس Number ارث برده اند. شکل زیر انواع این کلاس ها را نشان می دهد.
||http://tosinso.com/files/get/b50adeb8-eb87-4479-8527-96c38511d451||
اشیائی که از کلاس wrapper ساخته می شود می تواند یک مقدار از نوع داده مورد نظر را درخود ذخیره کند. تبدیل نوع داده واقعی به یک شی را boxing می گویند و این عمل توسط کامپایلر انجام می شود. بنابراین زمانی که یک شی از کلاس wrapper می سازیم باید در constructor آن یک مقدار از نوع داده متناسب آن قرار دهیم. تبدیل شئی از کلاس wrapper به نوع داده اولیه را unboxing می گویند. کلاس Number در پکیج java.lang قرار دارد. در کد زیر مثالی از boxing و unboxing آورده شده است.
<java>
public class Test{

   public static void main(String args[]){
      Integer x = 5; // boxes int to an Integer object
      x =  x + 10;   // unboxes the Integer to a int
      System.out.println(x); 
   }
}
<java>
نتیجه اجرای کد بالا 15 خواهد بود. وقتی که یک شی از کلاس Integer ساخته می شود و نام آن را x می گذاریم. وقتی که یک مقدار عدد صحیح به این شئ انتساب می دهیم کامپایلر عمل boxing را انجام می دهد و آن را در داخل یک شئ می ریزد. اما در خط بعد که عمل جمع کردن عدد انجام می شود کامپایلر باید x را تبدیل به نوع اصلی int بکند تا بتواند با عدد10 جمع کند و در این حالت عمل unboxing انجام می شود.

!!متدهای کلاس Number
در ادامه به لیستی از متدهای موجود در کلاس های ارث برده از کلاس Number آورده شده است و هرکدام توضیح داده شده اند. کلاس های wrapper که گفته شد همه از کلاس Number ارث برده اند.
* تابع [datatype]Value این تابع عمل تبدیل نوع داده شده را به نوع خواسته شده انجام می دهد. مقدار datatype در اول این تابع می تواندبا نام انواع داده های عددی جایگزین شود توابع این متد به شکل زیر هستند:
<java>
byte byteValue()
short shortValue()
int intValue()
long longValue()
float floatValue()
double doubleValue()
<java>
توابع گفته شده متدهای پیش فرض هستند و هیچ پارامتری ندارند و مقدار بازگشتی آنها همان مقدار [datatype] است. برای درک بهتر به کد زیر توجه کنید:
<java>
public class Test{ 

   public static void main(String args[]){
      Integer x = 5;
      // داده بایت برمی گرداند
      System.out.println( x.byteValue() );

      // نوع داده دابل برمیگرداند
      System.out.println(x.doubleValue());

      // نوع داده لانگ برمی گرداند
      System.out.println( x.longValue() );      
   }
}
<java>
نتیجه اجرای کد بالا به شکل زیر خواهد بود.
<text>
5
5.0
5
<text>
* متد compareTo: این متد عدد شی صدا زننده را با عددی که به عنوان آرگومان به متد داده شده را مقایسه می کند. با استفاده از این تابع می توان اعداد از انواع متفاوت را با هم مقایسه کرد ولی باید دقت داشت که هر دو عدد از یک نوع باشند و نمی توان تابع compareTo مربوط به یک نوع byte را با ورودی long صدا زد. این عمل باعث خطا می شود. شکل نوشتاری این متد مانند خط زیر است:
<java>
public int compareTo( NumberSubClass referenceName )
<java>
همانگونه که گفته شد پارامتر ورودی این متد یک شی از کلاس wrapper متناظر می باشد. مقدار بازگشتی این متد یک عدد صحیح از نوع int است که می تواند یا 0 یا 1 و یا -1 باشد. که به شرح این اعدا می پردازیم. اگر دو عدد با یکدیگر برابر باشند در نتیجه متد عدد 0 را بازمی گرداند و اگر عدد از آرگومان خودش کوچکتر باشد عدد -1 و اگر عدد از آرگومان خود بزرگتر باشد عدد 1 به عنوان نتیجه بازگشت داده می شود. برای مثال به کد زیر دقت کنید:
<java>
public class Test{ 

   public static void main(String args[]){
      Integer x = 5;
      System.out.println(x.compareTo(3));
      System.out.println(x.compareTo(5));
      System.out.println(x.compareTo(8));            
     }
}
<java>
و نتایج کدهای بالا به شکل زیر است:
<text>
1
0
-1
<text>
* متد equals: این متد مشخص می‌کند که دو عدد با هم برابر هستند یا خیر. کار این متد به این شکل است توسط شئی صدا زده می‌شود و یک عدد به آن داده می‌شود اگر عدد داده شده برابر با مقدار خود شئ باشد مقدار true و اگر برابر نباشد مقدار إfalse برگردانده می‌شود.شکل تعریف شده این تابع به شکل زیر است:
<java>
public boolean equals(Object o)
<java>
چیزی که این متد به عنوان پارامتر ورودی می‌گیرید می‌تواند هر نوع شیئی باشد.
مقدار بازگشتی این متد همانطور که گفته شد یک مقدار boolean است که اگر ورودی متد با خود شئ برابر باشند true برگردانده می شود. در ادامه مثالی برای این متد آورده شده است:
<java>
public class Test{ 

   public static void main(String args[]){
      Integer x = 5;
      Integer y = 10;
      Integer z =5;
      Short a = 5;

      System.out.println(x.equals(y));  
      System.out.println(x.equals(z)); 
      System.out.println(x.equals(a));
     }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود
<text>
false
true
false
<text>
* متد valeuOf: این متد مقدار عددی موجود در یک شئ وارد شده را بر‌می‌گرداند. آرگومان ورودی می‌تواند نوع داده اصلی یا String و مانند این‌ها باشد.
این یک متد استاتیک است. این متد می‌تواند ۲ آرگومان ورودی داشته باشد که آرگومان اولی یک رشته و آرگومان دوم مبنای عدد مورد نظر باشد. به این شکل که اگر بخواهیم عدد موجود در رشته را به یک عدد در مبنای ۱۶(هگزادسیمال) تبدیل شود آرگومان دوم را ۱۶ قرار دهیم. شکل‌های استفاده از این تابع در کد زیر آمده است:
<java>
static Integer valueOf(int i)
static Integer valueOf(String s)
static Integer valueOf(String s, int radix)
<java>
پارامتر ورودی در خط اول کد بالا برای یک عدد int است که وارد می‌شود و می‌توان این عدد را  با استفاده از این متد به انواع داده عددی مختلف تبدیل کرد. در خط دوم یک رشته به متد داده می‌شود که دارای اعداد در داخل رشته است که با استفاده از این متد می‌توان آن را تبدیل به عدد کرد. در خط سوم نیز یک رشته دارای عدد به عنوان پارامتر ورودی اولی می‌باشد و پارامتر دوم نیز مبنای عدد است. خروجی این تابع یک عدد است که در مثال زیر استفاده از این متد آورده شده است.
<java>
public class Test{ 

   public static void main(String args[]){
      
      Integer x =Integer.valueOf(9);
      Double c = Double.valueOf(5);
      Float a = Float.valueOf(80);               

      Integer b = Integer.valueOf(444,16);

      System.out.println(x); 
      System.out.println(c);
      System.out.println(a);
      System.out.println(b);
   }
}
<java>
خروجی کد به شکل زیر خواهد بود:
<text>
9
5.0
80.0
1092
<text>
* متد toString این متد مقدار هر شی را تبدیل به رشته می‌کند و بازمی گرداند. این متد می‌تواند یک ورودی عددی داشته باشد که آن را به رشته تبدیل کرده و بازمی گرداند. این متد برای همه اشیاء درجاوا وجود دارد. انواع مختلف این متد به شکل‌های زیر است:
<java>
String toString()
static String toString(int i)
<java>
مثال‌هایی از این متد در کد زیر نشان داده شده است:
<java>
public class Test{ 

   public static void main(String args[]){
      Integer x = 5;

      System.out.println(x.toString());  
      System.out.println(Integer.toString(12)); 
   }
}
<java>
خروجی کد به شکل زیر خواهد بود:
<text>
5
12
<text>
در این بخش به معرفی کلاس های wrapper مربوط به اعداد پرداختیم و متدهای آن را معرفی کردیم. در مطالب بعدی به ادامه معرفی متدهای این کلاس ها خواهیم پرداخت *Itpro باشید*



نویسنده: مهدی عادلی فر
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

اشیائی که از کلاس wrapper ساخته می شود می تواند یک مقدار از نوع داده مورد نظر را درخود ذخیره کند. تبدیل نوع داده واقعی به یک شی را boxing می گویند و این عمل توسط کامپایلر انجام می شود. بنابراین زمانی که یک شی از کلاس wrapper می سازیم باید در constructor آن یک مقدار از نوع داده متناسب آن قرار دهیم. تبدیل شئی از کلاس wrapper به نوع داده اولیه را unboxing می گویند. کلاس Number در پکیج java.lang قرار دارد. در کد زیر مثالی از boxing و unboxing آورده شده است.

public class Test{

   public static void main(String args[]){
      Integer x = 5; // boxes int to an Integer object
      x =  x + 10;   // unboxes the Integer to a int
      System.out.println(x); 
   }
}

نتیجه اجرای کد بالا 15 خواهد بود. وقتی که یک شی از کلاس Integer ساخته می شود و نام آن را x می گذاریم. وقتی که یک مقدار عدد صحیح به این شئ انتساب می دهیم کامپایلر عمل boxing را انجام می دهد و آن را در داخل یک شئ می ریزد. اما در خط بعد که عمل جمع کردن عدد انجام می شود کامپایلر باید x را تبدیل به نوع اصلی int بکند تا بتواند با عدد10 جمع کند و در این حالت عمل unboxing انجام می شود.

آموزش استفاده از متدهای کلاس Number

در ادامه به لیستی از متدهای موجود در کلاس های ارث برده از کلاس Number آورده شده است و هرکدام توضیح داده شده اند. کلاس های wrapper که گفته شد همه از کلاس Number ارث برده اند.

  • تابع [datatype]Value این تابع عمل تبدیل نوع داده شده را به نوع خواسته شده انجام می دهد. مقدار datatype در اول این تابع می تواندبا نام انواع داده های عددی جایگزین شود توابع این متد به شکل زیر هستند:
byte byteValue()
short shortValue()
int intValue()
long longValue()
float floatValue()
double doubleValue()

توابع گفته شده متدهای پیش فرض هستند و هیچ پارامتری ندارند و مقدار بازگشتی آنها همان مقدار [datatype] است. برای درک بهتر به کد زیر توجه کنید:

public class Test{ 

   public static void main(String args[]){
      Integer x = 5;
      // داده بایت برمی گرداند
      System.out.println( x.byteValue() );

      // نوع داده دابل برمیگرداند
      System.out.println(x.doubleValue());

      // نوع داده لانگ برمی گرداند
      System.out.println( x.longValue() );      
   }
}

نتیجه اجرای کد بالا به شکل زیر خواهد بود.

5
5.0
5
  • متد compareTo: این متد عدد شی صدا زننده را با عددی که به عنوان آرگومان به متد داده شده را مقایسه می کند. با استفاده از این تابع می توان اعداد از انواع متفاوت را با هم مقایسه کرد ولی باید دقت داشت که هر دو عدد از یک نوع باشند و نمی توان تابع compareTo مربوط به یک نوع byte را با ورودی long صدا زد. این عمل باعث خطا می شود. شکل نوشتاری این متد مانند خط زیر است:
public int compareTo( NumberSubClass referenceName )

همانگونه که گفته شد پارامتر ورودی این متد یک شی از کلاس wrapper متناظر می باشد. مقدار بازگشتی این متد یک عدد صحیح از نوع int است که می تواند یا 0 یا 1 و یا -1 باشد. که به شرح این اعدا می پردازیم. اگر دو عدد با یکدیگر برابر باشند در نتیجه متد عدد 0 را بازمی گرداند و اگر عدد از آرگومان خودش کوچکتر باشد عدد -1 و اگر عدد از آرگومان خود بزرگتر باشد عدد 1 به عنوان نتیجه بازگشت داده می شود. برای مثال به کد زیر دقت کنید:

public class Test{ 

   public static void main(String args[]){
      Integer x = 5;
      System.out.println(x.compareTo(3));
      System.out.println(x.compareTo(5));
      System.out.println(x.compareTo(8));            
     }
}

و نتایج کدهای بالا به شکل زیر است:

1
0
-1
  • متد equals: این متد مشخص می‌کند که دو عدد با هم برابر هستند یا خیر. کار این متد به این شکل است توسط شئی صدا زده می‌شود و یک عدد به آن داده می‌شود اگر عدد داده شده برابر با مقدار خود شئ باشد مقدار true و اگر برابر نباشد مقدار إfalse برگردانده می‌شود.شکل تعریف شده این تابع به شکل زیر است:
public boolean equals(Object o)

چیزی که این متد به عنوان پارامتر ورودی می‌گیرید می‌تواند هر نوع شیئی باشد.

مقدار بازگشتی این متد همانطور که گفته شد یک مقدار boolean است که اگر ورودی متد با خود شئ برابر باشند true برگردانده می شود. در ادامه مثالی برای این متد آورده شده است:

public class Test{ 

   public static void main(String args[]){
      Integer x = 5;
      Integer y = 10;
      Integer z =5;
      Short a = 5;

      System.out.println(x.equals(y));  
      System.out.println(x.equals(z)); 
      System.out.println(x.equals(a));
     }
}

خروجی کد بالا به شکل زیر خواهد بود

false
true
false
  • متد valeuOf: این متد مقدار عددی موجود در یک شئ وارد شده را بر‌می‌گرداند. آرگومان ورودی می‌تواند نوع داده اصلی یا String و مانند این‌ها باشد.

این یک متد استاتیک است. این متد می‌تواند ۲ آرگومان ورودی داشته باشد که آرگومان اولی یک رشته و آرگومان دوم مبنای عدد مورد نظر باشد. به این شکل که اگر بخواهیم عدد موجود در رشته را به یک عدد در مبنای ۱۶(هگزادسیمال) تبدیل شود آرگومان دوم را ۱۶ قرار دهیم. شکل‌های استفاده از این تابع در کد زیر آمده است:

static Integer valueOf(int i)
static Integer valueOf(String s)
static Integer valueOf(String s, int radix)

پارامتر ورودی در خط اول کد بالا برای یک عدد int است که وارد می‌شود و می‌توان این عدد را با استفاده از این متد به انواع داده عددی مختلف تبدیل کرد. در خط دوم یک رشته به متد داده می‌شود که دارای اعداد در داخل رشته است که با استفاده از این متد می‌توان آن را تبدیل به عدد کرد. در خط سوم نیز یک رشته دارای عدد به عنوان پارامتر ورودی اولی می‌باشد و پارامتر دوم نیز مبنای عدد است. خروجی این تابع یک عدد است که در مثال زیر استفاده از این متد آورده شده است.

public class Test{ 

   public static void main(String args[]){
      
      Integer x =Integer.valueOf(9);
      Double c = Double.valueOf(5);
      Float a = Float.valueOf("80");               

      Integer b = Integer.valueOf("444",16);

      System.out.println(x); 
      System.out.println(c);
      System.out.println(a);
      System.out.println(b);
   }
}

خروجی کد به شکل زیر خواهد بود:

9
5.0
80.0
1092
    • متد toString این متد مقدار هر شی را تبدیل به رشته می‌کند و بازمی گرداند. این متد می‌تواند یک ورودی عددی داشته باشد که آن را به رشته تبدیل کرده و بازمی گرداند. این متد برای همه اشیاء درجاوا وجود دارد. انواع مختلف این متد به شکل‌های زیر است:
String toString()
static String toString(int i)

مثال‌هایی از این متد در کد زیر نشان داده شده است:

public class Test{ 

   public static void main(String args[]){
      Integer x = 5;

      System.out.println(x.toString());  
      System.out.println(Integer.toString(12)); 
   }
}

خروجی کد به شکل زیر خواهد بود:

5
12

در این بخش به معرفی کلاس های wrapper مربوط به اعداد پرداختیم و متدهای آن را معرفی کردیم. در مطالب بعدی به ادامه معرفی متدهای این کلاس ها خواهیم پرداخت

کلاس Wrapper اعداد

در مطلب قبلی به تعریف توابع موجود در کلاس Number پرداختیم و گفتیم که کلاس های wrapper مربوط به انواع داده اولیه در جاوا از آن ارث بری می نماید پس کلاس های wrapper هم این متدها را دارند. در ادامه به توضیح ادامه توابع موجود در این کلاس ها خواهیم پرداخت

بررسی مفهوم parseint در جاوا

این متدر برای تبدیل رشته به نوع داده عددی استفاده می شود و به شکل های parseInt و parseDouble و یا سایر انواع داده استفاده می شود. این متد می تواند یک یا دو پارامتر ورودی داشته باشد که پارامتر اول برای رشته ورودی است و پارامتر دوم برای مبنای عددی است که مشخص می کند مبنای عدد مورد نظر چند است. شکل نوشتاری این متد به صورت زیر است:

static int parseInt(String s)
static int parseInt(String s, int radix)

مقدار بازگشتی این متد همیشه یک عدد می باشد. از این متد می توان برای تبدیل مبناها هم استفاده کرد. برای مثالی از این متد به کد زیر توجه کنید:

public class Test{ 

   public static void main(String args[]){
      int x =Integer.parseInt("9");
      double c = Double.parseDouble("5");
      int b = Integer.parseInt("444",16);

      System.out.println(x);
      System.out.println(c);
      System.out.println(b);
   }
}

خروجی کد به شکل زیر خواهد بود

9
5.0
1092

تا به این قسمت از مطالب در مورد متدهای کلاس های wrapper توضیح دادیم حال در ادامه به بررسی متد های موجود در کلاس Math خواهیم پرداخت که بر روی اعداد عملیات خاصی انجام می دهند.

 معرفی کاربرد متد abs در جاوا

این متد قدر مطلق عدد داده شده را باز می گرداند. آرگومان ورودی این متد می تواند از نوع int, long , float, double, short, byte باشد. نحوه استفاده از این متد در کد زیر آورده شده است:

 public static  void main(String[] args){
        int a=-8;
        double b=100;
        float f=-90f;
        int resultA=Math.abs(a);
        double resultB=Math.abs(b);
        float resultF=Math.abs(f);
        System.out.println(resultA);
        System.out.println(resultB);
        System.out.println(resultF);

    }

خروجی کد بالا به شکل زیر خواهد بود:

8
100.0
90.0

 معرفی کاربرد متد ceil در جاوا

این متد مقدار اعشاری عدد را حذف کرده و مقدار صحیح آن را بر می گرداند. ورودی این متد یک عدد float و یا double بوده و مقدار بازگشتی آن یک عدد double است که کوچکترین عدد صحیص را برمی گرداند. این متد شبیه به متد floor است. البته برای اعداد مثبت متد floor و ceil مانند یکدیگر هستند ولی برای اعداد منفی عملکرد متفاوتی دارند. متد floor از نظر مقدار بازگشتی و آرگومان ورودی مانند Ceil است. برای مثال به کد زیر توجه کنید:

public class Test{ 

   public static void main(String args[]){
      double d = -100.675;
      float f = -90;    

      System.out.println(Math.ceil(d));
      System.out.println(Math.ceil(f)); 
					 
      System.out.println(Math.floor(d));
      System.out.println(Math.floor(f)); 
   }
}

خروجی این کد به شکل زیر خواهد بود:

-100.0
-90.0
-101.0
-90.0

 معرفی کاربرد متد rint در جاوا

این متد یک عدد double گرفته و آن را به نزدیکترین عدد صحیح روند می کند. به این معنی که عدد double را گرفته و نزدیکتری عدد صحیح به آن را برمی گرداند. خروجی این متد از نوع double خواهد بود با این که مقدار اعشاری هم ندارد.برای مثال از این متد به کد زیر دقت کنید:

public class Test{ 

   public static void main(String args[]){
      double d = 100.675;
      double e = 100.500;
      double f = 100.200;

      System.out.println(Math.rint(d));
      System.out.println(Math.rint(e)); 
      System.out.println(Math.rint(f)); 
   }
}

خروجی کد به شکل زیر است:

101.0
100.0
100.0

 معرفی کاربرد متد round در جاوا

این متد یک عدد float و یا double را گرفته و مقداری از نوع int بازگردانی می کنند. تفاوت این متد با rint در این است که متد rint فقط double می گرفت و فقط double برمی گرداند ولی متد round هم می تواند ورودی float داشته باشد و هم double و مقدار بازگشتی آن int و long است.

به این معنی که اگر ورودی اش double باشد خروجی long و اگر ورودی float داشته باشد خروجی int دارد. تفاوت دیگر این متد با rint در عملکرد آن در حالی که مقدار اعشاری 0.5 باشد. این متد به سمت بالا روند می کند و rint به سمت پایین روند می کند. مثالی از این متد در کد زیر آورده شده است.

101
101
100
90

 معرفی کاربرد متد های min, max در جاوا

این متد ها دو عدد ورودی از هر نوع داده عددی دریافت کرده و عدد بزرگتر یا کوچکتر را برمی گردانند. به این معنی که min عدد کوچکتر و max عدد بزرگتر را برمی گرداند. این دو متد برای انواع داده های عددی به کار می روند. که در خط زیر نشان داده شده است.

double min(double arg1, double arg2)
float min(float arg1, float arg2)
int min(int arg1, int arg2)
long min(long arg1, long arg2)

مثالی از این متدها در کد زیر آورده شده است.

public class Test{ 

   public static void main(String args[]){
      System.out.println(Math.min(12.123, 12.456));      
      System.out.println(Math.min(23.12, 23.0));  
	  System.out.println(Math.max(12.123, 12.456));      
      System.out.println(Math.max(23.12, 23.0));
   }
}

خروجی کد بالا به شکل زیر است:

12.123
23.0
12.456
23.12

 معرفی کاربرد متد exp در جاوا

در ریاضیات و مخصوصا قسمت لگاریتم ها عدد e بسیار کاربرد دارد. حال در جاوا نیز برای استفاده از این عدد و اعمال لگاریتمی امکاناتی فراهم شده است. یکی از این امکانات متد exp می باشد. این متد یک ورودی گرفته و در نتیجه e به توان عدد وارد شده را برمی گردانند.

عدد e یک عدد با اعشار طولانی است که می توانید مقدار آن را با استفاده از Math.E به دست آورید. اگر نام ورودی متد exp را x بگذاریم خروجی این متد e^x خواهد بود. ورودی و خروجی این متد از نوع double خواهد بود. برای مثال به کد زیر توجه کنید:

public class Test{ 

   public static void main(String args[]){
      double x = 11.635;
      double y = 2.76;

      System.out.printf("The value of e is %.4f%n", Math.E);
      System.out.printf("exp(%.3f) is %.3f%n", x, Math.exp(x));  
   }
}

در این کد برای چاپ کردن مقادیر برای اولین بار از متد printf استفاده شده است. با استفاده از این متد می توان متن خروجی را فرمت بندی کرد. به این شکل که اگر دقت کنید در خط اولی که متد printf به کار برده شده است در داخل متن عبارت "%.4f" به کار برده شده است

و در انتها یک عبارت عددی به عنوان ورودی به متد داده شده است که در اینجا عبارت عددی Math.E می باشد. معنی این خط این است که یک عبارت اعشاری با 4 رقم اعشار به جای "%4f" قرار می گیرد که آن عدد به عنوان ورودی داده شده است. در خط دوم printf نیز دو عدد با 3 رقم اعشار در داخل متن قرار گرفته است. خروجی کد بالا به شرح زیر خواهد بود:

The value of e is 2.7183
exp(11.635) is 112983.831

 معرفی کاربرد متد log در جاوا

این متد برخلاف اسمش مقدار لگاریتم طبیعی عدد ورودی را برمی گرداند به عبارت دیگر این متد ln یک عدد را محاسبه می کند. ورودی و خروجی این متد عدد double است. مثالی از این متد در کد زیر آورده شده است. دقت کنید که در این کد نیز از متد printf نیز استفاده شده است.

public class Test{ 

   public static void main(String args[]){
      double x = 11.635;
      double y = 2.76;

      System.out.printf("The value of e is %.4f%n", Math.E);
      System.out.printf("log(%.3f) is %.3f%n", x, Math.log(x));
   }
}

خروجی کد به شکل زیر است:

The value of e is 2.7183
log(11.635) is 2.454

 معرفی کاربرد متد pow در جاوا

این متد متد به توان رساندن می باشد. کار این متد به این شکل است که عدد ورودی اولی را به عنوان پایه توان در نظر گرفته و عدد دومی را به عنوان مقدار توان در نظر می گیرد. بنابراین عدد اول را به توان عدد دوم می رساند. نوع داده ورودی و خروجی این متد همه از نوع double هستند. برای مثال به کد زیر دقت کنید:

public class Test{ 

   public static void main(String args[]){
      double x = 11.635;
      double y = 2.76;

      System.out.printf("The value of e is %.4f%n", Math.E);
      System.out.printf("pow(%.3f, %.3f) is %.3f%n", x, y, Math.pow(x, y));

   }
}

کد بالا خروجی زیر را خواهد داشت:

The value of e is 2.7183
pow(11.635, 2.760) is 874.008

 معرفی کاربرد متد sqrt در جاوا

این متد جذر عدد داده شده را برمی گرداند به عبارت دیگر این متد همان متد pow است با این تفاوت که آرگومان ورودی آن 0.5 می باشد. اعداد ورودی و خروجی این متد double می باشد. کد زیر یک مثال از این متد می باشد.

public class Test{ 

   public static void main(String args[]){
      double x = 11.635;

           System.out.printf("sqrt(%.3f) is %.3f%n", x, Math.sqrt(x));
   }
}

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

sqrt(11.635) is 3.411

 معرفی کاربرد متدهای sin, cos, tan در جاوا

این متدها برای محاسبه نسبت های مثلثاتی سینوس و کسینوس و تانژانت یک زاویه به کار برده می شوند. این متد ها هرکدام یک ورودی و یک خروجی دارند که ورودی متد همان زاویه است. نوع داده ورودی و خروجی متدها از نوع double می باشد. زاویه ورودی این متد ها باید به واحد رادیان باشد و درجه قبول نیست. در کد زیر مثالی از این متد ها آورده شده است:

public class Test{ 

   public static void main(String args[]){
     double degrees = 45.0;
     double radians = Math.toRadians(degrees);
 System.out.format("The value of pi is %.4f%n", Math.PI);
     System.out.format("The sine of %.1f degrees is %.4f%n", degrees, Math.sin(radians));
	 System.out.format("The cosine of %.1f degrees is %.4f%n", degrees, Math.cos(radians));
	  System.out.format("The tangent of %.1f degrees is %.4f%n", degrees, Math.tan(radians));
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

The value of pi is 3.1416
The sine of 45.0 degrees is 0.7071
The cosine of 45.0 degrees is 0.7071
The tangent of 45.0 degrees is 1.0000

 معرفی کاربرد متدهای asin, acos, atan در جاوا

این متدها برخلاف سه متدی که قبلا گفته شد مقدار نسبت مثلثاتی را گرفته و زاویه آن را محاسبه می نمایند. مقدار ورودی و بازگشتی این متدها از نوع double می باشد. مثال این متدها در زیر آمده است:

public class Test{ 

   public static void main(String args[]){
   
     double degrees = 45.0;
     double radians = Math.toRadians(degrees);

     System.out.format("The value of pi is %.4f%n", Math.PI);
     System.out.format("The arcsine of %.4f is %.4f degrees %n", Math.sin(radians), Math.toDegrees(Math.asin(Math.sin(radians))));
	 System.out.format("The arccosine of %.4f is %.4f degrees %n", Math.cos(radians), Math.toDegrees(Math.acos(Math.sin(radians))));
	 System.out.format("The arctangent of %.4f is %.4f degrees %n", Math.cos(radians), Math.toDegrees(Math.atan(Math.sin(radians))));

   }
}

خروجی کد بالا به شکل زیر خواهد بود:

The value of pi is 3.1416
The arcsine of 0.7071 is 45.0000 degrees
The arccosine of 0.7071 is 45.0000 degrees
The arctangent of 1.0000 is 45.0000 degrees

همان گونه که در کد بالا مشاهده می کنید از متدهایی به نام های toRadians و toDegrees در این برنامه استفاده شده است. این دو متد برای تبدیل زاویه از واحد درجه به رادیان و از رادیان به درجه به کار می روند. به شکلی که متد toDegrees زاویه رادیان را گرفته و به درجه تبدیل می کند و متد toRadins عکس این عمل را انجام می دهد. دقت داشته باشید که ورودی و خروجی این دو متد از نوع double می باشد.

 معرفی کاربرد متد random در جاوا

این متد برای ساخت اعداد تصادفی بین 0.0 تا 1.0 به کار می رود. حال اگر بخواهید که عددی در رنج خاصی تولید کنید باید از این متد استفاده کنید و مقدار تولید شده را ضرب کنید. مقدار بازگشتی این متد double خواهد بود. این متد آرگومان ورودی ندارد. برای مثالی از این متد به کد زیر توجه کنید.

public class Test{ 

   public static void main(String args[]){
     System.out.println( Math.random() );
     System.out.println( Math.random() );
   }
}

خروجی کد به شکل زیر خواهد بود:

0.16763945061451657
0.400551253762343

هربار که متد random فراخوانی شود یک عدد تصادفی جدید تولید خواهد شد. تا به این بخش از مطالب به بررسی کلاس های wrapper و همچنین کلاس استاتیک Math پرداختیم در این قسمت همه ی اعمال بر روی اعداد بود و متدهایی که با اعداد سرو کار داشتند توضیح داده شد. در بخش های آنیده به بررسی کاراکتر ها و رشته ها خواهیم پرداخت.

کلاس Wrapper کاراکترها

در مطلب قبلی به بررسی اعداد و کلاس های wrapper برای اعداد پرداختیم و گفتیم که کلاس wrapper برای اعداد دارای یک سری متدها می باشد که بر روی اعداد اعمال خاصی انجام می دهد. حال در این مطلب به بررسی کلاس wrapper برای کاراکتر ها می پردازیم. همچنین متدهای موجود در کلاس wrapper مربوط به کاراکتر ها را توضیح می دهیم. برای کار با کاراکتر ها باید از نوع داده char استفاده کنیم. در کد زیر چند حالت استفاده از کاراکتر ها آورده شده است.

char ch = 'a';

// استفاده از کد یونیکد برای ظاهر شدن کاراکتر
char uniChar = '\u039A'; 

// کاراکتر ها در آرایه
char[] charArray ={ 'a', 'b', 'c', 'd', 'e' };

در استفاده از نوع داده کاراکتر مانند انواع داده عددی که ما دارای کلاس های wrapper بودیم برای نوع داده char هم کلاس wrapper داریم. نام کلاس wrapper نوع کاراکتر Character می باشد. کلاس Character چندین متد مفید برای کار با کاراکتر ها ارائه می دهد. شما می توانید یک شئ از کلاس Character را به شکل زیر بسازید:

Character ch = new Character('a');

همچنین ممکن است که تحت شرایط خاصی کامپایلر نوع داده اولیه کاراکتر را تبدیل به شئ نماید. برای مثال فرض کنید یک نوع ورودی یک تابع از نوع شئ Character باشد ولی ما به آن یک نوع داده اولیه کاراکتر را می دهیم. در این حالت کامپایلر نوع داده را تبدیل به شئ می نماید به این عمل autoboxing گفته می شود و اگر عکس این عمل انجام شود به این عمل unboxing گفته می شود. برای مثال از این دو عمل به کد زیر دقت کنید.

public class Main {

    public static void main(String[] args) {
        //      autoboxing
        char c='m';
        printChar(c);


        //    unboxing
        Character character=new Character('r');
        char c2=character;
        printChar(c2);
    }
    public static void printChar(Character ch){
        System.out.println(ch);
    }
}

بررس کاربرد کاراکترهای مخصوص در جاوا

برخی از کاراکتر ها در جاوا وجود دارند که معنی و مفهوم خاصی برای کامپایلر دارند. اغلب این کاراکتر ها با علامت backsash(\) شروع می شوند. برای مثال اگر بخواهیم متنی را چاپ کنیم و قسمتی از متن در خط بعدی چاپ شود در این حالت از قسمتی که می خواهیم در خط بعدی چاپ شود باید از علامت (n\) استفاده کنید. این کاراکتر ها در ادامه آورده شده اند و معنی آنها نیز آورده شده است.

  • (t\) این علامت برای این است که در خروجی کلید tab را بزنیم. علامت tab فاصله ای به اندازه 8 کاراکتر فاصله است.
  • (b\) این علامت نشان دهنده ی backspace می باشد.
  • (n\) نشان دهنده رفتن به خط جدید و زدن کلید enter است.
  • (r\) به این معنی است که مکان نما (محل نوشتن متن) به ابتدای خط می رود.
  • ('\) برای چاپ تک کوتیشن می باشد
  • ("\) برای چاپ دابل کوتیشن به کار می رود
  • (\\) برای چاپ علامت backslash به کار می رود.

وقتی که یک کاراکتر مخصوص در متد print ظاهر شود کامپایلر آن را تفسیر می کند و کاراکتر مورد نظر آن را به جای آن قرار خواهد داد. برای مثال به کد زیر توجه کنید. در مثال زیر قصد بر این بوده است که علامت دابل کوتیشن چاپ شود.

public class Test {

   public static void main(String args[]) {
      System.out.println("She said \"Hello!\" to me.");
   }
}

خروجی کد بالا به شکل زیر خواهد بود

She said "Hello!" to me.

معرفی متدهای موجود در کلاس Character

در ادامه به بیان متد هایی که در کلاس wrapper کاراکتر وجود دارد می پردازیم.

    1. متد isLetter این متد مشخص می کند که کاراکتری که به عنوان ورودی به آن داده می شود حرفی از حروف الفبا می باشد یا خیر اگر کاراکتر ورودی این متد یک حرف از الفبا باشد مقدار true و در غیر این صورت مقدار false برمی گرداند. منظور از حرف الفبا حروف انگلیسی می باشد.
    2. متد isDigit این متد یک ورودی کاراکتری دارد که اگر کاراکتر ورودی یکی از اعداد 0 تا 9 باشد مقدار true و در غیر این صورت مقدار false برمی گرداند.
    3. متد isWhitespace: در جاوا علامت های فاصله و tab و اینتر به عنوان whitespace یا فضای خالی شناخته می شود. در متد isWhitespace اگر آرگومان ورودی علامت های گفته شده باشد مقدار true و در غیر این صورت مقدار false برمی گرداند.
    4. متد isUpperCase: این متد مشخص می کند که کاراکتر ورودی اش به شکل علامت بزرگ انگلیسی نوشته شده است یا خیر. اگر آرگومان ورودی حرف بزرگ باشد مقدار true و در غیر این صورت false برمی گرداند.
    5. متد isLowerCase این متد برخلاف قبلی می باشد. یعنی اگر کارکتر ورودی با حروف کوچک نوشته شده باشد مقدار true و اگر بزرگ نوشته شده باشد مقدار false بر می گرداند. دقت داشته باشید که این متد برای حروف الفبایی است.
    6. متد toUpperCase این متد یک کاراکتر الفبایی را گرفته و شکل حرف بزرگ آن را برمی گرداند.
    7. متد toLowerCase این متد عکس عمل قبلی را انجام می دهد. یعنی یک کاراکتر الفبایی را گرفته و شکل حروف کوچک آن را برمی گرداند.
    8. متد toString: این متد یک کاراکتر می گیرد و یک شئ String بر می گرداند. کلاس String برای نگهداری رشته ها در جاوا می باشد. مثال متدهای گفته شده در کد زیر آورده شده است.
public class Main {

    public static void main(String[] args) {
        //      isLetter
        System.out.println(Character.isLetter('c'));
        System.out.println(Character.isLetter('5'));

        //isDigit
        System.out.print('\n');
        System.out.println(Character.isDigit('c'));
        System.out.println(Character.isDigit('5'));

        //isWhitespace
        System.out.print('\n');
        System.out.println(Character.isWhitespace('c'));
        System.out.println(Character.isWhitespace(' '));
        System.out.println(Character.isWhitespace('\n'));
        System.out.println(Character.isWhitespace('\t'));

        //isUpperCase
        System.out.print('\n');
        System.out.println( Character.isUpperCase('c'));
        System.out.println( Character.isUpperCase('C'));
        System.out.println( Character.isUpperCase('\n'));
        System.out.println( Character.isUpperCase('\t'));

        //isLowerCase
        System.out.print('\n');
        System.out.println(Character.isLowerCase('c'));
        System.out.println(Character.isLowerCase('C'));
        System.out.println(Character.isLowerCase('\n'));
        System.out.println(Character.isLowerCase('\t'));

        //toUpperCase
        System.out.print('\n');
        System.out.println(Character.toUpperCase('c'));
        System.out.println(Character.toUpperCase('C'));

        //toLowerCase
        System.out.print('\n');
        System.out.println(Character.toLowerCase('c'));
        System.out.println(Character.toLowerCase('C'));
        
        //toString
        System.out.print('\n');
        System.out.println(Character.toString('c'));
        System.out.println(Character.toString('C'));
    }

}

خروجی کد بالا به شکل زیر خواهد بود

true
false

false
true

false
true
true
true

false
true
false
false

true
false
false
false

C
C

c
c

c
C

در این بخش به بررسی متدهای موجود در کاراکتر ها پرداختیم. و شکل انواع کاراکتر های مخصوص را نیز توصیف کردیم. یک مثال از کاراکتر های مخصوص در کد بالا آورده شده است. می بینید که به خاطر استفاده از کاراکتر (n\) بین خطوط خروجی فاصله افتاده است. در ادامه به بررسی رشته ها که ترکیبی از کاراکتر ها می باشد خواهیم پرداخت

کلاس String و کار با رشته قسمت یک

در ادامه مطالب مربوط به آموزش جاوا به بررسی کلاس String خواهیم پرداخت. اشیائی که از این کلاس ساخته می شوند برای نگهداری رشته ها به کار می روند. رشته به مجموعه ای از کاراکتر های گفته می شود. برای مثال کلمات و جملات فارسی یا انگلیسی در کامپیوتر به عنوان رشته شناخته می شوند. برای ساخت یک شئ از نوع رشته و مقدار دهی آن باید به شکل زیر عمل کنیم.

String greeting = "Hello world!";

همان گونه که در داخل کد نشان داده شده است مقدار رشته باید در داخل علامت های دابل کوتیشن(") قرار بگیرد. در کد بالا یک شئ از کلاس String ساخته شده است که مقدار آن Hello world! می باشد. البته ما در مطالب قبلی گفتیم که برای ساخت اشیا از کلمه کلیدی new استفاده می شود. حال برای ساخت رشته نیز می توان از این کلمه کلیدی استفاده کرد. برای مثال به کد زیر توجه کنید:

public class StringDemo{

   public static void main(String args[]){
      char[] helloArray = { 'h', 'e', 'l', 'l', 'o', '.'};
      String helloString = new String(helloArray);  
      System.out.println( helloString );
   }
}

که خروجی کد بالا به شکل زیر خواهد بود:

Hello.

در کد بالا یک آرایه کاراکتری به یک شی رشته ای تبدیل شده است.

آموزش به دست آوردن طول رشته در جاوا

متدهایی در جاوا تعریف شده اند که بتوانند برخی اطلاعات در مورد یک شئ را به ما بدهند. به این متد ها متد های accessor گفته می شود. ایشاء کلاس String هم دارای متدهای accessor متعددی هستند. یکی از این متد ها متد length() می باشد که این متد طول رشته داده شده را بر می گرداند. منظور از طول رشته تعداد کاراکترهای به کار رفته در یک رشته است. مثالی از متد length در ادامه آورده شده است:

public class StringDemo {

   public static void main(String args[]) {
      String palindrome = "Dot saw I was Tod";
      int len = palindrome.length();
      System.out.println( "String Length is : " + len );
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

String Length is : 17

آموزش الحاق دو رشته به یکدیگر

اگر بخواهیم دو رشته را به یکدیگر الحاق کنیم یا به عبارت ساده تر دو رشته را به یکدیگر بچسبانیم، از متد concat استفاده می کنیم و نحوه نوشتن این متد به شکل زیر است:

string1.concat(string2);

این متد یک شئ رشته ای جدید برمی گرداند که مقدار آن الحاق دو رشته String1 و string2 می باشد. همچنین شما می توانید از متد concat در مقدار یک رشته نیز استفاده کنید. مانند شکل زیر:

"My site is ".concat("Itpro");

همچنین می توان عمل الحاق دو رشته را بدون متد و فقط با استفاده از عملگر + نیز انجام داد این روش در شکل زیر آورده شده است:

"Our" +" Website"+" is"+" Itpro"

برای درک بهتر این عمل به مثال زیر دقت کنید.

public class StringDemo {

   public static void main(String args[]) {
      String string1 = "saw I was ";
      System.out.println("Dot " + string1 + "Tod");
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

Dot saw I was Tod

آموزش فرمت دادن به رشته

همان گونه که در آموزش های قبل هم نشان داده شد می توان هنگام استفاده از متد printf از رشته فرمت بندی شده استفاده کرد. اگر بخواهید متنی را فرمت بندی کنید که در قسمت هایی از آنها مقادیر مشخصی قرار گیرد می توانید از دو متد printf و format استفاده کرد.

این دو متد یک رشته و تعدادی شئ دریافت می کنند که رشته وارد شده فرمت بندی شده است. خروجی این متد ها از نوع string می باشد یعنی خروجی این متدها یک شئ رشته ای است. تفاوت printf با format این است که printf رشته را فرمت بندی کرده و در همان حال آن را چاپ می کند بنابر این ما نمی توانیم که رشته تولید شده را در داخل یک متغیر ریخته و چند بار از آن استفاده کنیم. اما با استفاده از متد format این کار شدنی است. بنابر این می توان به جای استفاده از کد زیر :

System.out.printf("The value of the float variable is " +
                  "%f, while the value of the integer " +
                  "variable is %d, and the string " +
                  "is %s", floatVar, intVar, stringVar);

دقت داشته باشید که متغیر های floatVar, intVar, stringVar از قبل تعریف و مقداردهی شده اند. حال به جای استفاده از کد بالا می توان از کد زیر استفاده کرد.

String fs;
fs = String.format("The value of the float variable is " +
                   "%f, while the value of the integer " +
                   "variable is %d, and the string " +
                   "is %s", floatVar, intVar, stringVar);
System.out.println(fs);

خروجی کد بالا اگر floatVar=5.2, intVar=45, stringVar="MehdiAdeli" باشد برابر مقدار زیر خواهد بود:

The value of the float variable is 5.200000, while the value of the integer variable is 45, and the string is MehdiAdeli

معرفی متدهای کلاس String

متد charAt : این متد کاراکتری را که با عدد اندیس آن مشخص شده است را برمی گرداند. به این معنی که یک ورودی عددی به عنوان اندیس گرفته می شود و کاراکتر آن اندیس را برمی گرداند. دقت کنید که در جاوا اندیس ها از صفر شروع می شوند. برای مثال به کد زیر توجه کنید:

public class Test {

   public static void main(String args[]) {
      String s = "Strings are immutable";
      char result = s.charAt(8);
      System.out.println(result);
   }
}

خروجی این کد حرف a خواهد بود. به این دلیل که کاراکتر اندیس 8 کاراکتر a در ابتدای کلمه are می باشد.

 معرفی کاربرد متد compareTo

وظیفه این متد مقایسه می باشد. این متد دو نوع مقایسه را انجام می دهد. اول یک رشته را با یک شئ دیگر مقایسه می کند و دوم دو رشته را با یکدیگر مقایسه می نماید. خروجی این متد یک عدد int می باشد که اگر 0 باشد به این معنی است که دو رشته باهم کاملا مساوی هستند و اگر خروجی متد کمتر از 0 باشد ورودی متد از خود رشته صدا زننده متد از لحاظ کاراکتری کوچکتر می باشد و اگر خروجی بزرگتر از 0 باشد به این معنی است که از لحاظ کد اسکی کاراکتر ها خود رشته بزرگتر از آرگومان ورودی اش می باشد. برای مثال به کد زیر دقت کنید:

public class Test {

   public static void main(String args[]) {
      String str1 = "Strings are immutable";
	  String str2 = "Strings are immutable";
      String str3 = "Integers are not immutable";

      int result = str1.compareTo( str2 );
      System.out.println(result);
	  
      result = str2.compareTo( str3 );
      System.out.println(result);
	 
      result = str3.compareTo( str1 );
      System.out.println(result);
   }
}

خروجی کد بالا به شکل زیر خواهد بود

0
10
-10

 معرفی کاربرد متد compareToIgnoreCase

اگر در حالت کلی از متد compareTo استفاده کنیم جاوا بین حروف بزرگ و کوچک تفاوت قایل خواهد شد. به این معنی که اگر از compareTo استفاده کنیم کلمات Hello و hello با هم فرق خواهند داشت. حال اگر بخواهیم که جاوا بین حروف بزرگ و کوچک فرقی نگذارد از متد compareToIgnoreCase استفاده می کنیم. این متد همانند متد compareTo بوده و خروجی های آن نیز شبیه به همان متد است. برای مثالی از این متد به کد زیر توجه نمایید:

public class Test {

   public static void main(String args[]) {
String str1 = "Strings are immutable";
        String str2 = "STrings Are Immutable";
        String str3 = "Integers are not immutable";

        int result = str1.compareToIgnoreCase( str2 );
        System.out.println(result);

        result = str2.compareToIgnoreCase( str3 );
        System.out.println(result);

        result = str3.compareToIgnoreCase( str1 );
        System.out.println(result);
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

0
10
-10

 معرفی کاربرد متد contentEquals

وظیفه این متد هم مقایسه دو رشته با یکدیگر می باشد با این تفاوت که آرگومان ورودی این متد یک شئ از نوع StringBuffer می باشد. خروجی این متد یک مقدار Boolean می باشد به این شکل که اگر مقدار ورودی با رشته صدا زننده برابر باشد نتیجه true و در غیر این صورت نتیجه false خواهد بود. برای مثال به کد زیر توجه نمایید:

public class Test {

   public static void main(String args[]) {
      String str1 = "Not immutable";
      String str2 = "Strings are immutable";
      StringBuffer str3 = new StringBuffer( "Not immutable");

      boolean  result = str1.contentEquals( str3 );
      System.out.println(result);
	  
      result = str2.contentEquals( str3 );
      System.out.println(result);
   }
}

خروجی کد بالا به شکل زیر خواهد بود

true
false

دقت داشته باشید که این متد نیز برای بزرگ و کوچک بودن حروف تفاوت قایل خواهد شد. تا به این قسمت از مطالب به بررسی کلاس String پرداخته شد در بخش های بعدی به ادامه بررسی در باره ی متدهای این کلاس می پردازیم

کلاس String و کار با رشته قسمت دو

در مطلب قبلی در مورد رشته ها و کلاس String در جاوا صحبت کردیم. در این مطلب به ادامه بحث قبلی خواهیم پرداخت و متدهای موجود در کلاس String را معرفی خواهیم کرد.

 معرفی کاربرد متد copyValueOf

این متد برای تبدیل یک آرایه کاراکتری به یک شئ String به کار می رود. به این معنی که یک آرایه کاراکتری که در هر خانه آن یک کاراکتر وجود دارد را به هم چسبانده و همه را تبدیل به یک رشته می کند. این متد دو شکل استفاده دارد. در یکی از شکل های استفاده از این متد فقط یک آرایه کارکتری به عنوان ورودی گرفته شده و رشته متناظر با آن برگردانده می شود.

ولی در روش دوم تبدیل کل آرایه به رشته مد نظر نیست و می خواهیم قسمتی از آرایه را به رشته تبدیل کنیم. برای این کار در روش دوم علاوه بر این که در آرگومان ورودی آرایه کاراکتری را دریافت می کنیم خانه ای که از آن خانه باید شروع کنیم و تعداد خانه هایی که باید انتخاب شوند و به رشته تبدیل شوند نیز باید به عنوان ورودی داده شود. برای مثالی از این متد به کد زیر توجه کنید:

public class Test {

   public static void main(String args[]) {
      char[] Str1 = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
      String Str2 = "";

      Str2 = Str2.copyValueOf( Str1 );
      System.out.println("Returned String: " + Str2);

      Str2 = Str2.copyValueOf( Str1, 2, 6 );
      System.out.println("Returned String: " + Str2);
   }
}

خروجی اجرای کد بالا به شکل زیر خواهد بود:

Returned String: hello world
Returned String: llo wo

همان گونه که دیده می شوددر قسمت اول کد ما کل آرایه را به رشته تبدیل کردیم ولی در بخش دوم گفته ایم که از اندیس شماره 2 به اندازه 6 خانه انتخاب کن که خروجی را مشاهده می کنید.

 معرفی کاربرد متد endsWith

این متد یک آرگومان ورودی دارد که مشخص می کند که انتهای رشته با آرگومان ورودی یکی است یا خیر. اگر قسمت انتهایی رشته با آرگومان ورودی یکی بود پس مقدار true و در غیر این صورت مقدار false برمی گرداند. اگر آرگومان ورودی رشته خالی باشد یا با رشته صدا زننده هم برابر باشد این متد جواب true خواهد داد. کد زیر مثالی از این متد را نمایش می دهد.

public class Test{

   public static void main(String args[]){
      String Str = new String("This is really not immutable!!");
      boolean retVal;

      retVal = Str.endsWith( "immutable!!" );
      System.out.println("Returned Value = " + retVal );

      retVal = Str.endsWith( "immu" );
      System.out.println("Returned Value = " + retVal );
   }
}

اگر کد بالا را اجرا کنیم نتیجه به صورت زیر خواهد بود:

Returned Value = true
Returned Value = false

 معرفی کاربرد متد equals

وظیفه این متد مقایسه است. به شکلی که رشته داده شده را با آرگومان ورودی مقایسه می کند. زبان برنامه نویسی جاوا برای هرشئ از هر نوعی می توان یک hashcode تولید کند. حال متد equals اگر مقدار hashcode دو شئ با هم برابر باشد آن دو را با هم برابر در نظر می گیرد و مقدار true را برمی گرداند

و در غیر این صورت مقدار false برمی گرداند. به عبارت دیگر اگر دو رشته با هم برابر باشند این متد مقدار true و اگر برابر نباشند این متد مقدار False برمی گرداند. آرگومان ورودی این متد می تواند هر شئی باشد. و مقدار بازگشتی آن یک مقدار Boolean است. برای مثال به کد زیر توجه کنید:

public class Test {

   public static void main(String args[]) {
      String Str1 = new String("This is really not immutable!!");
      String Str2 = Str1;
      String Str3 = new String("This is really not immutable!!");
      boolean retVal;

      retVal = Str1.equals( Str2 );
      System.out.println("Returned Value = " + retVal );

      retVal = Str1.equals( Str3 );
      System.out.println("Returned Value = " + retVal );
   }
}

اگر این کد را اجرا کنیم نتیجه آن به شکل زیر خواهدبود

Returned Value = true
Returned Value = true

متد مشابه دیگری نیز وجود دارد که equalsIgnoreCase نام دارد. این متد نیز عمل مقایسه را انجام داده و مشخص می کند که مقدار آرگومان ورودی با رشته مورد نظر برابر است یا خیر اما دو تفاوت بین این متد و متد equals وجود دارد یکی این که آرگومان ورودی باید از نوع String باشد و نمی تواند هر شئی باشد و دوم این که این متد بین حروف و بزرگ و کوچک تفاوت قایل نمی شود. مثالی از این متد در کد زیر آورده شده است.

public class Test {

   public static void main(String args[]) {
      String Str1 = new String("This is really not immutable!!");
      String Str2 = Str1;
      String Str3 = new String("This is really not immutable!!");
      String Str4 = new String("This IS REALLY NOT IMMUTABLE!!");
      boolean retVal;

      retVal = Str1.equals( Str2 );
      System.out.println("Returned Value = " + retVal );

      retVal = Str1.equals( Str3 );
      System.out.println("Returned Value = " + retVal );

      retVal = Str1.equalsIgnoreCase( Str4 );
      System.out.println("Returned Value = " + retVal );
   }
}

خروجی اجرای کد بالا به شکل زیر خواهد بود:

Returned Value = true
Returned Value = true
Returned Value = true

 معرفی کاربرد متد getBytes

این متد دو شکل گوناگون دارد. شکل اول از این متد به آرگومانی ندارد و شکل دوم آن یک آرگومان ورودی دارد. کار این متد این است که رشته را به یک سری بایت ها کدگذاری می کند. خروجی این متد آرایه ای از بایت ها می باشد. برای مثال به کد زیر توجه کنید:

import java.io.*;

public class Test{

   public static void main(String args[]){
      String Str1 = new String("Welcome to Tutorialspoint.com");

      try{
         byte[] Str2 = Str1.getBytes();
         System.out.println("Returned  Value " + Str2 );

         Str2 = Str1.getBytes( "UTF-8" );
         System.out.println("Returned  Value " + Str2 );

         Str2 = Str1.getBytes( "ISO-8859-1" );
         System.out.println("Returned  Value " + Str2 );
      }catch( UnsupportedEncodingException e){
         System.out.println("Unsupported character set");
      }
   }
}

خروجی کد گفته شده به شکل زیر خواهد بود

Returned  Value [B@192d342
Returned  Value [B@15ff48b
Returned  Value [B@1b90b39

 معرفی کاربرد متد getChars

این متد کاراکتر های رشته را به داخل یک آرایه از کاراکتر ها میریزد. به شکلی می توان گفت که کاراکترهای رشته را جدا می کند. این متد هیچ مقدار بازگشتی ندارد. ولی آرایه ی کاراکترهایی که باید پر شود را به شکل آرگومان ورودی باید به آن داد. آرگومان های ورودی این متد به ترتیب به شکل زیر می باشند:

  1. srcBegin: اندیس اولین کاراکتر از رشته مورد نظر که انتخاب کاراکتر ها از آن اندیس شروع می شوند. این آرگومان عددی است.
  2. srcEnd اندیس آخرین کاراکتر از رشته که انتخاب کاراکترها تا آن اندیس ادامه می یابد و در آن اندیس ختم می شود این آرگومان عددی است.
  3. dst نام آرایه مقصد را که کاراکتر ها در آن ریخته می شود را در این قسمت قرار می دهیم.
  4. dstBegin این آرگومان مشخص می کند که از کدام اندیس ارایه مقصد شروع به ریختن کاراکتر ها کنیم.

برای مثالی از این متد به کد زیر توجه کنید:

import java.io.*;

public class Test{
   public static void main(String args[]){
      String Str1 = new String("Welcome to Itpro.ir");
      char[] Str2 = new char[7];

      try{
         Str1.getChars(2, 9, Str2, 0);
         System.out.print("Copied Value = " );
         System.out.println(Str2 );

      }catch( Exception ex){
         System.out.println("Raised exception...");
      }
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

Copied Value = lcome t

 معرفی کاربرد متد hashCode

این متد یک کد به ازای برای رشته تولید می کند که به آن hashCode گفته می شود. این hashCode برای اشیا Stringی به شکل زیر محاسبه می شود:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

در فرمول بالا s[i] کاراکترهای رشته می باشد، n طول رشته می باشد و ^ علامت توان می باشد. مقدار hashCode برای رشته خالی صفر است. این متد هیچ آرگومان ورودی ندارد. خروجی این متد یک عدد int می باشد. مثالی از این متد در کد زیر آورده شده است:

import java.io.*;

public class Test{
   public static void main(String args[]){
      String Str = new String("Welcome to Tutorialspoint.com");
      System.out.println("Hashcode for Str :" + Str.hashCode() );
   }
}

خروجی اجرای کد بالا به شکل زیر است:

Hashcode for Str :1186874997

 معرفی کاربرد متد indexOf

این متد دارای 4 شکل مختلف می باشد. وظیفه این متد جستجو در داخل رشته و پیدا کردن محل آن است. خروجی این متد یک عدد int می باشد که محل شروع رشته یا کاراکتر می باشد. این متد می تواند یک کاراکتر یا یک رشته را در داخل رشته اصلی جستجو کند. اگر کاراکتر یا رشته مورد جستجو در رشته اصلی وجود نداشته باشد مقدار -1 بازگشت داده می شود. اشکال مختلف این متد عبارتست از:

  1. indexOf(int ch) یک کاراکتر را جستجو کرده و اندیس آن را برمی گرداند.
  2. indexOf(int ch, int fromIndex) یک کاراکتر را از اندیس مشخص شده جستجو می کند.
  3. indexOf(String str) یک رشته را در داخل رشته اصلی جستجو می کند و سپس نقطه شروع آن را برمی گرداند.
  4. indexOf(String str, int fromIndex) یک رشته را در داخل رشته اصلی از اندیس مشخص شده جستجو می کند و محل آن را برمی گرداند.

مثال این متد در کد زیر آورده شده است:

import java.io.*;

public class Test {

   public static void main(String args[]) {
      String Str = new String("Welcome to Itpro.ir");
      String SubStr1 = new String("Itpro");
      String SubStr2 = new String("Sutorials");

      System.out.print("Found Index :" );
      System.out.println(Str.indexOf( 'o' ));
      System.out.print("Found Index :" );
      System.out.println(Str.indexOf( 'o', 5 ));
      System.out.print("Found Index :" );
      System.out.println( Str.indexOf( SubStr1 ));
      System.out.print("Found Index :" );
      System.out.println( Str.indexOf( SubStr1, 15 ));
      System.out.print("Found Index :" );
      System.out.println(Str.indexOf( SubStr2 ));
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

Found Index :4
Found Index :9
Found Index :11
Found Index :-1
Found Index :-1

به دلیل اهمیت متدهای کلاس String در این مطلب به ادامه متدهای کلاس String پرداخته شد. در مطالب آینده نیز به توضیح ادامه متدها می پردازیم.

کلاس String و کار با رشته قسمت سه

در مطلب قبلی به بررسی متدهای کلاس String پرداخته شد. در مطلب قبلی گفته شد که کلاس String دارای اهمیت زیادی است. در این مطلب نیز به ادامه توضیح در مورد متدهای کلاس String می پردازیم.

 معرفی کاربرد متد lastIndexOf

این متد همانند متد indexOf عمل جستجو را انجام می دهد و شکل های این متد مانند شکل های متد indexOf می باشد. تنها تفاوتی که بین این دو متد وجود دارد این است که اگر کاراکتر یا رشته مورد جستجو یک بار در متن آمده باشد پس نتایج هردو یکی خواهد بود.

ولی زمانی که کاراکتر یا رشته مورد جستجو بیش از یک بار در متن آمده باشد متد indexOf اولین جایی را که کاراکتر یا رشته مورد نظر وجود دارد را برمی گرداند ولی متد lastIndexOf آخرین مکانی از متن را که کاراکتر یا رشته مورد نظر در آن قرار دارد را برمی گرداند. در هر دو متد اگر کاراکتر یا رشته مورد نظر پیدا نشود عدد -1 بازگردانده خواهد شد. مثالی از این متد در کد زیر آورده شده است. از هر 4 شکل این متد استفاده شده است.

import java.io.*;

public class Test {

   public static void main(String args[]) {
      String Str = new String("Welcome to Itpro.ir");
      String SubStr1 = new String("Itpro" );
      String SubStr2 = new String("Sutorials" );

      System.out.print("Found Last Index :" );
      System.out.println(Str.lastIndexOf( 'o' ));
      System.out.print("Found Last Index :" );
      System.out.println(Str.lastIndexOf( 'o', 5 ));
      System.out.print("Found Last Index :" );
      System.out.println( Str.lastIndexOf( SubStr1 ));
      System.out.print("Found Last Index :" );
      System.out.println( Str.lastIndexOf( SubStr1, 15 ));
      System.out.print("Found Last Index :" );
      System.out.println(Str.lastIndexOf( SubStr2 ));
   }
}

خروجی کد بالا به شکل زیر خواهد بود

Found Last Index :4
Found Last Index :11
Found Last Index :11
Found Last Index :-1

 معرفی کاربرد متد length

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

import java.io.*;

public class Test{
   public static void main(String args[]){
      String Str1 = new String("Welcome to Itpro.ir");
      String Str2 = new String("Itpro" );

      System.out.print("String Length :" );
      System.out.println(Str1.length());

      System.out.print("String Length :" );
      System.out.println(Str2.length());
   }
}

خروجی کد بالا به شکل زیر خواهد بود

String Length :19
String Length :5

 معرفی کاربرد متد matches

این متد در آرگومان ورودی یک regular expression دریافت کرده و مشخص می کند که رشته مورد نظر با این regular expression همخوانی دارد یا خیر. کار این متد دقیقا شبیه به عمل

Pattern.matches(regex, str)

می باشد. خروجی این متد یک مقدار Boolean می باشد که اگر رشته با regular expression همخوانی داشته باشد مقدار true و اگر رشته همخوانی نداشته باشد مقدار false برگردانده می شود. مفاهیم regular expression در مطالب بعدی به صورت کامل شرح داده خواهد شد ولی برای آشنایی اولیه با این متد به مثال زیر توجه نمایید:

import java.io.*;

public class Test{
   public static void main(String args[]){
      String Str = new String("Welcome to Itpro.ir");

      System.out.print("Return Value :" );
      System.out.println(Str.matches("(.*)Itpro(.*)"));

      System.out.print("Return Value :" );
      System.out.println(Str.matches("Tutorials"));

      System.out.print("Return Value :" );
      System.out.println(Str.matches("Welcome(.*)"));
   }
}

خروجی کد بالا به شرح زیر خواهد بود

Return Value :true
Return Value :false
Return Value :true

 معرفی کاربرد متد regionMatches

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

public boolean regionMatches(int toffset,
                             String other,
                             int ooffset,
                             int len)

or

public boolean regionMatches(boolean ignoreCase,
                             int toffset,
                             String other,
                             int ooffset,
                             int len)

پارامترهای ورودی این متد به شرح زیر خواهد بود:

  1. toffset: نقطه شروع از متن که متن ورودی را از آنجا چک می کنیم
  2. other رشته ای که قرار است با متن اصلی چک شود
  3. ooffset نقطه شروع رشته ای که می خواهیم در متن اصلی آن را چک کنیم.
  4. len طول کاراکترهایی که باید با هم چک شوند.
  5. ignoreCase اگر این آرگومان true باشد در چک کردن به حروف بزرگ و کوچک تفاوت قایل نمی شود در غیر این صورت حروف و بزرگ و کوچک با هم تفاوت دارند.

مقدار خروجی این متد یک مقدار Boolean است که اگر متن داده شده و متن اصلی در قسمت مشخص شده و با طول گفته شده برابر باشند مقدار true و در غیر این صورت مقدار false برمی گردانند. برای مثال و درک بهتر این متد به کد زیر توجه کنید.

import java.io.*;

public class Test{
   public static void main(String args[]){
      String Str1 = new String("Welcome to Itpro.ir");
      String Str2 = new String("Itpro");
      String Str3 = new String("ITPRO");

      System.out.print("Return Value :" );
      System.out.println(Str1.regionMatches(11, Str2, 0, 5));

      System.out.print("Return Value :" );
      System.out.println(Str1.regionMatches(11, Str3, 0, 5));

      System.out.print("Return Value :" );
      System.out.println(Str1.regionMatches(true, 11, Str3, 0, 5));
   }
}

خروجی کد بالا به شکل زیر خواهد بود. دقت کنید که تفاوت بین دو مورد چاپ شده آخر به این علت است که از ورودی ignoreCase استفاده شده است:

Return Value :true
Return Value :false
Return Value :true

 معرفی کاربرد متد replace

این متد دو کاراکتر را به عنوان ورودی می گیرد و در کل متن هر جا که کاراکتر ورودی اول باشد را با کاراکتر ورودی دوم جایگزین می کند. خروجی این کد به متنی است که همه کاراکترهای مورد نظر آن جایگزین شده باشند. برای مثال به کد آورده شده دقت کنید:

import java.io.*;

public class Test{
   public static void main(String args[]){
      String Str = new String("Welcome to Itpro.ir");

      System.out.print("Return Value :" );
      System.out.println(Str.replace('o', 'T'));

      System.out.print("Return Value :" );
      System.out.println(Str.replace('l', 'D'));
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

Return Value :WelcTme tT ItprT.ir
Return Value :WeDcome to Itpro.ir

البته قابلیت دیگری که متد replace دارد این است که می تواند یک رشته را جایگزین رشته دیگر کند. نحوه استفاده از این متد برای رشته ها هم همانند استفاده هنگام کاراکتر ها می باشد.

 معرفی کاربرد متد replaceAll

این متد یک regular expression و یک رشته را می گیرد و در داخل متن هر قسمت که با regular expression مورد نظر همخوانی داشته باشد با رشته داده شده جایگزین می کند. این متد یک خروجی از نوع String دارد و متن اصلی پس از جایگزینی را برمی گرداند. چنانچه گفتیم مفهوم regular expression را در مطالب بعدی توضیح خواهیم داد. برای مثال این متد به کد زیر توجه کنید

import java.io.*;

public class Test{
   public static void main(String args[]){
      String Str = new String("Welcome to Itpro.com please visit programming.itpro.com");

      System.out.print("Return Value :" );
      System.out.println(Str.replaceAll(".com",
                         ".ir" ));
   }
}

خروجی کد بالا به شکل زیر خواهد بود

Return Value :We.ire to Itpro.ir please visit programming.tosinso.com

حال اگر بخواهیم که عمل جایگزینی فقط برای اولین مورد از رشته گفته شده انجام شود و بقیه نادیده گرفته شود از متد replaceFirst استفاده می کنیم. اگر در کد بالا به جای استفاده از replaceAll از متد replaceFirst استفاده کنیم خروجی به شکل زیر خواهد بود:

Return Value :We.ire to Itpro.com please visit programming.itpro.com

کلاس String و کار با رشته قسمت چهار

در ادامه مطالب در مورد کلاس String زبان برنامه نویسی جاوا به ادامه توضیحات متدهای موجود در این کلاس می پردازیم.

 معرفی کاربرد متد Split

یک متن را در نظر بگیرید که می خواهیم کلمات را پیدا کنیم. به شکلی که متن را با تعداد کاراکتر های فاصله ای که گذاشته شده جدا کنیم و در قالب یک آرایه نشان دهیم. برای این کار از متد split استفاده می کنیم. این متد دارای دو شکل است که شکل های آن در کد زیر آورده شده است:

public String[] split(String regex, int limit)

or

public String[] split(String regex)

آرگومان های ورودی این متد یک regular expression می باشد که تعیین می کند که متن را طبق چه کاراکتر یا کاراکترهایی تجزیه کنیم.برای مثال اگر شما بخواهید متن را توسط علامت فاصله جدا کنیم در این قسمت علامت فاصله خواهیم گذاشت. آرگومان limit برای این است که تعداد رشته های تجزیه شده را نشان بدهد. خروجی این متد یک آرایه رشته ای می باشد که رشته های تجزیه شده را در داخل آن آرایه می ریزد. برای درک راحت تر این متد به کد زیر توجه کنید:

import java.io.*;

public class Test{
   public static void main(String args[]){
       String Str = new String("Welcome to Itpro.ir");

        System.out.println("Return Value :" );
        for (String retval: Str.split(" ", 2)){
            System.out.println(retval);
        }
        System.out.println("");
        System.out.println("Return Value :" );
        for (String retval: Str.split(" ", 3)){
            System.out.println(retval);
        }
        System.out.println("");
        System.out.println("Return Value :" );
        for (String retval: Str.split(" ", 1)){
            System.out.println(retval);
        }
        System.out.println("");
        System.out.println("Return Value :" );
        for (String retval: Str.split(" ")) {
            System.out.println(retval);
        }
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

Return Value :
Welcome
to Itpro.ir

Return Value :
Welcome
to
Itpro.ir

Return Value :
Welcome to Itpro.ir

Return Value :
Welcome
to
Itpro.ir

 معرفی کاربرد متد startsWith

این متد کاری خلاف متد endsWith انجام می دهد. به این معنی که بررسی می کند که آیا متن با رشته خاصی شروع شده است یا خیر. این متد دارای دو شکل است که در شکل اولیه مشخص می کند که ابتدای متن با رشته خاصی شروع شده است

یا نه و در شکل دوم مشخص می کند که آیا از اندیس مشخص شده به بعد متن با رشته مورد نظر شروع شده است یا خیر. خروجی این متد یک مقدار Boolean است که اگر متن با رشته گفته شده شروع شده باشد مقدار true و در غیر این صورت مقدار false دارد. شکل های متفاوت این متد به شرح زیر است:

public boolean startsWith(String prefix, int toffset)

or

public boolean startsWith(String prefix)

آرگومان ورودی prefix همان رشته ای است که می خواهیم بدانیم که متن با آن رشته شروع شده است یا خیر و آرگومان ورودی toffset همان اندیس شروع است. که از آن نقطه می خواهیم بررسی کنیم که رشته از آن قسمت شروع شده است یا خیر. برای مثال و درک بهتر این متد به کد زیر توجه کنید:

import java.io.*;

public class Test{
   public static void main(String args[]){
      String Str = new String("Welcome to Itpro.ir");

      System.out.print("Return Value :" );
      System.out.println(Str.startsWith("Welcome") );

      System.out.print("Return Value :" );
      System.out.println(Str.startsWith("Itpro") );

      System.out.print("Return Value :" );
      System.out.println(Str.startsWith("Itpro", 11) );
   }
}

خروجی کد بالا مانند خط های زیر خواهد بود:

Return Value :true
Return Value :false
Return Value :true

 معرفی کاربرد متد subsequence

این متد یک زیر مجموعه از متن را به صورت دنباله ای از کاراکتر های را برمی گرداند. این متد دو پارامتر ورودی دارد که اندیس شروع و اندیس پایان دنباله ای که باید انتخاب شود را مشخص می کند و مقدار بازگشتی آن یک شئ از کلاس CharSequence می باشد. به عبارت دیگر این متد یک زیر رشته از متن را برمی گرداند ولی نوع بازگشتی آن کلاس CharSequence می باشد. برای درک بهتر این متد به کد زیر توجه کنید.

import java.io.*;

public class Test{
   public static void main(String args[]){
      String Str = new String("Welcome to Itpro.ir");

      System.out.print("Return Value :" );
      System.out.println(Str.subSequence(0, 10) );

      System.out.print("Return Value :" );
      System.out.println(Str.subSequence(10, 15) );
   }
}

خروجی کد بالا به شکل زیر خواهد بود

Return Value :Welcome to
Return Value : Itpr

 معرفی کاربرد متد substring

وظیفه این متد نیز بازگرداندن یک زیررشته از داخل متن است. این متد دارای دو شکل است در شکل اول یک آرگومان ورودی وجود دارد که اندیس شروع را از کاربر می گیرد و از آن قسمت تا انتهای رشته را برمی گرداند. در شکل دوم این متد هم اندیس شروع و هم اندیس پایان را از کاربر می گیرد. تفاوت این متد با متد subsequence این است که خروجی این متد از نوع String می باشد. کد زیر این متد را نشان می دهد:

import java.io.*;

public class Test{
   public static void main(String args[]){
      String Str = new String("Welcome to Itpro.ir");

      System.out.print("Return Value :" );
      System.out.println(Str.substring(10) );

      System.out.print("Return Value :" );
      System.out.println(Str.substring(10, 15) );
   }
}

نتیجه این کد به شکل زیر خواهد بود

Return Value : Itpro.ir
Return Value : Itpr

 معرفی کاربرد متد toCharArray

این متد متن را تبدیل به یک آرایه کاراکتری می کند. از آنجایی که هر متن یک شئ String است و یک مجموعه کاراکتر می باشد. این متد متن را به همان مجموعه کاراکتر به صورت آرایه تبدیل می کند. این متد ورودی نداشته و خروجی آن یک آرایه کاراکتری می باشد. کد زیر نحوه استفاده از این متد را نشان می دهد.

import java.io.*;

public class Test{
   public static void main(String args[]){
      String Str = new String("Welcome to Itpro.ir");

        System.out.print("Return Value :" );
        System.out.println(Str.toCharArray() );
        System.out.println(Str.toCharArray().length);
   }
}

خروجی کد بالا به شکل زیر خواهد بود

Return Value :Welcome to Itpro.ir
19

 معرفی کاربرد متد toLowerCase, toUpperCase

این دو متد اعمالی شبیه به هم انجام می دهند. هرکدام از این متدها دارای دو شکل می باشد یکی بدون آرگومان ورودی و یکی با یک آرگومان ورودی دارد. وظیفه متد toLowerCase این است که همه ی کاراکترهای متن را به حروف کوچک انگلیسی تبدیل می کند و وظیفه toUpperCase کاراکترهای متن را به حروف بزرگ تبدیل می کند.

وظیفه آرگومان ورودی این است که نوع زبان و نوشتار را مشخص می کند که یک enum به نام Locale است. اگر از آرگومان ورودی استفاده نشود نوشتار و زبان پیش فرض انتخاب خواهد شد که این کار توسط Locale.getDefault انجام می شود. کد زیر مثالی از متدهای گفته شده است.

import java.io.*;

public class Test{
   public static void main(String args[]){
     String Str = new String("Welcome to Itpro.ir");

        System.out.print("lower case is :");
        System.out.println(Str.toLowerCase());
        System.out.print("UPPER CASE IS: ");
        System.out.println(Str.toUpperCase());
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

lower case is :welcome to tosinso.com
UPPER CASE IS: WELCOME TO ITPRO.IR

 معرفی کاربرد متد trim

این متد آرگومان ورودی نداشته و خروجی آن یک شئ String است. وظیفه این متد این است که فاصله های خالی را از ابتدا و انتهای متن حذف می کند برای مثال به کد زیر توجه کنید:

import java.io.*;

public class Test{
   public static void main(String args[]){
      String Str = new String("   Welcome to Itpro.ir   ");

      System.out.print("Return Value :" );
      System.out.println(Str.trim() );
   }
}

همان گونه که دیده می شود در متن Str در ابتدا و انتهای آن فاصله خالی وجود دارد ولی خروجی متد trim به گونه ای است که این فواصل از ابتدا و انتها حذف شده اند. خروجی کد به شکل زیر است:

Return Value :Welcome to Itpro.ir

 معرفی کاربرد متد valueOf

این متد یک آرگومان ورودی می گیرد که از نوع داده اصلی جاوا است که مقدار وارد شده را تبدیل به رشته می کند و بازمی گرداند. شکل های گوناگون این متد عبارتست از :

static String valueOf(boolean b) 

or 

static String valueOf(char c) 

or

static String valueOf(char[] data) 

or

static String valueOf(char[] data, int offset, int count) 

or

static String valueOf(double d) 

or

static String valueOf(float f) 

or

static String valueOf(int i)

or

static String valueOf(long l)

or

static String valueOf(Object obj)

مثالی از این کد در ادامه آورده شده است.

import java.io.*;

public class Test{
   public static void main(String args[]){
      double d = 102939939.939;
      boolean b = true;
      long l = 1232874;
      char[] arr = {'a', 'b', 'c', 'd', 'e', 'f','g' };

      System.out.println("Return Value : " + String.valueOf(d) );
      System.out.println("Return Value : " + String.valueOf(b) );
      System.out.println("Return Value : " + String.valueOf(l) );
      System.out.println("Return Value : " + String.valueOf(arr) );
   }
}

نتیجه اجرای کد بالا به شکل زیر خواهد بود:

Return Value : 1.02939939939E8
Return Value : true
Return Value : 1232874
Return Value : abcdefg

تا به این قسمت از مطالب معرفی و توضیح متدهای کلاس String به پایان رسید. در ادامه مطالب آموزش جاوا به بررسی سایر ویژگی های این زبان مانند آرایه ها خواهیم پرداخت

آموزش جاوا (Java) قسمت 19 : StringBuilder و StringBuffer 

در این مطلب قصد داریم که دو کلاس از جاوا را معرفی کنیم که در نوع خود کلاس های مهمی هستند. این کلاس ها برای کار با رشته ها به کار می روند. البته می توان بدون استفاده از این کلاس ها نیز کار خود را پیش برد ولی اهمیت این کلاس ها وقتی مشخص می شود که در حد زیاد و پردازش های بزرگ بخواهید با رشته ها کار کنید می بینید که استفاده کردن از این کلاس ها تا چه حد performance و سرعت اجرای برنامه را بالا می برد و استفاده از منابعی مانند حافظه و cpu را کم می کند.

این کلاس ها StringBuffer و StringBuilder می باشند. این کلاس ها زمانی استفاده می شوند که لازم است که روی رشته های اعمال بسیار زیادی انجام شود. کلاس String به گونه ای است که وقتی از آن استفاده می کنید ممکن است اشیا بسیار زیادی ساخته شود که بسیاری از آن ها بی استفاده و غیر مفید است. ولی اشیائی که از این دو کلاس ساخته می شود این گونه نیست و به همین دلیل استفاده از آن می تواند performance را افزایش دهد. مثلا در کد زیر سه شئ String ساخته می شود. که دو عدد از آن ها بی استفاده هستند.

String str="hi";
Str=str+" Itpro"+" website";

کلاس StringBuilder با جاوای 5 معرفی شد. تفاوت بین StringBuffer و StringBuilder در این است که متدهای موجود در کلاس StringBuilder ویژگی tread Safe بودن را ندارند به عبارت دیگر متدهای این کلاس باهم سنکرون نیستند. اما باید گفت که کلاس StringBuilder سرعت بیشتری دارد. پس تا حد امکان از این کلاس استفاده کنید. اما اگر سنکرون بودن و tread safe بودن برایتان اهمیت دارد از کلاس StringBuffer استفاده کنید. روش استفاده از این کلاس ها برای الحاق رشته ها با هم یا concat کردن رشته ها به شکل کد زیر است:

public class Test{

    public static void main(String args[]){
       StringBuffer sBuffer = new StringBuffer(" test");
       sBuffer.append(" String Buffer");
       System.out.println(sBuffer);  
   }
}

خروجی کد بالا به شکل زیر خواهد بود

test String Buffer

متدهای کلاس StringBuffer عبارتند از:

 معرفی کاربرد StringBuffer append(String s)

این متد برای افزودن یک رشته به انتهای رشته موجود در شی ساخته شده از کلاس StringBuffer به کار برده می شود. این متد می تواند همه ی انواع داده اصلی و Stringو هر شئی از هر نوعی را به عنوان ورودی دریافت کند. این متد حتی می تواند یک شئ از کلاس Stringbuffer را نیز به عنوان ورودی بگیرد. شکل های مختلف این متد در کد زیر آورده شده است:

public StringBuffer append(boolean b)
public StringBuffer append(char c) 
public StringBuffer append(char[] str) 
public StringBuffer append(char[] str, int offset, int len) 
public StringBuffer append(double d) 
public StringBuffer append(float f)
public StringBuffer append(int i) 
public StringBuffer append(long l) 
public StringBuffer append(Object obj) 
public StringBuffer append(StringBuffer sb) 
public StringBuffer append(String str)

کد زیر مثالی از این متد را نشان می دهد.

public class Test {

   public static void main(String args[]) {
      StringBuffer sb = new StringBuffer("Test");
      sb.append(" String Buffer");
      System.out.println(sb); 
   }  
}

خروجی کد بالا به شکل زیر است:

Test String Buffer

 معرفی کاربرد متد public StringBuffer reverse()

این متد رشته ای را که در داخل شی StringBuffer وجود دارد را برعکس می کند. برعکس کردن رشته به این صورت است که کاراکتر انتهایی رشته در اول می آید و کاراکتر یکی قبل از انتهایی به عنوان کاراکتر دوم ظاهر می شود و به همین ترتیب تا کاراکتر اولی رشته قبلی به عنوان کاراکتر آخر رشته جدید نشان داده می شود. کد زیر نحوه یک مثال از این متد را نشان می دهد.

public class Test {

    public static void main(String args[]) {
       StringBuffer buffer = new StringBuffer("Game Plan");
       buffer.reverse();
       System.out.println(buffer);
   }  
}

خروجی کد بالا به شکل زیر خواهد بود:

nalP emaG

 معرفی کاربرد StringBuffer delete(int start, int end)

این متد قسمتی از رشته ای که در شئی که کلاس StringBuffer قرار دارد را حذف می کند. این متد یک اندیس شروع و یک اندیس پایان از کاربر می گیرد و کاراکتر های بین اندیس شروع تا پایان را حذف می کند. البته این نکته را بدانید که کاراکتر با شماره اندیس پایان را حذف نمی کند. یک مثالی از این متد در کد زیر آورده شده است.

public class Test {

   public static void main(String args[]) {
      StringBuffer sb = new StringBuffer("abcdefghijk");
      sb.delete(3,7); 
      System.out.println(sb); 
   }  
}

خروجی این کد به شکل زیر خواهد بود:

abchijk

 معرفی کاربرد متد insert

این متد یک مقداری را در داخل متن StringBuffer درج می کند. شکل این متد به این گونه است که دو عدد آرگومان ورودی از کاربر دریافت می کند. اولی اندیسی است که مقداری باید در آن درج شود و آرگومان ورودی دوم همان مقداری است که باید درج شود. این متد دارای شکل های متفاوتی است که در کد زیر آورده شده است.

public StringBuffer insert(int offset, boolean b)
public StringBuffer insert(int offset, char c)
public insert(int offset, char[] str)
public StringBuffer insert(int index, char[] str, 
                           int offset, int len)
public StringBuffer insert(int offset, float f)  
public StringBuffer insert(int offset, int i)
public StringBuffer insert(int offset, long l) 
public StringBuffer insert(int offset, Object obj) 
public StringBuffer insert(int offset, String str)

این به این معنی است که در آرگومان دوم می توان هر نوع داده یا شیئی استفاده کرد. برای مثال در کد زیر ما یک رشته در قسمت مورد نظر اضافه کرده ایم:

public class Test {

   public static void main(String args[]) {
      StringBuffer sb = new StringBuffer("abcdefghijk");
      sb.insert(3,"123");
      System.out.println(sb); 
   }  
}

خروجی کد بالا به شکل زیر خواهد بود

abc123defghijk

اگر برای اندیس مقدار -1 قرار داده شود مقدار در آخر رشته ثبت می شود

 معرفی کاربرد متد replace

این متد قسمتی از متن موجود در شئ StringBuffer را با متن داده شده جایگزین می کند. این متد سه آرگومان ورودی دارد که ابتدا و انتهای رشته انتخابی و رشته جایگزین شونده را مشخص می کند. در کد زیر یک مثال از این متد آورده شده است.

public class Test {

   public static void main(String args[]) {
      StringBuffer sb = new StringBuffer("abcdefghijk");
      sb.replace(3, 8, "ZARA");
      System.out.println(sb); 
   }  
}

خروجی این کد متن زیر خواهد بود

abcZARAijk

تا به این بخش متدهایی که مخصوص کلاس های StringBuffer و StringBuilder بود گفته شد. متد های گفته شده در هردو کلاس وجود دارند. یک سری متدهایی هم وجود دارند که همانند متد های موجود در کلاس String هستند که به علت این که کاربرد آنها دقیقا همان کاربرد متدهای موجود در کلاس String است و آنها را شرح داده ایم از توضیح آنها خودداری می کنیم. به یاد داشته باشید که می توان بدون استفاده از این کلاس ها کارهای گفته شده را انجام داد ولی استفاده از این کلاس ها باعث می شود سرعت اجرای برنامه شما در پردازش رشته ها به طرز چشمگیری بالا برود

استفاده از آرایه ها

در برنامه نویسی بسیاری از مواقع پیش می آید که یک مجموعه ای از داده ها وجود دارد که همه از یک نوع یا یک کلاس می باشند. اگر بخواهیم هرکدام از این داده ها را در یک متغیر ذخیره کنیم ممکن است که چندصد متغیر داشته باشیم که همه از یک نوع می باشند.

در این حالت با انبوهی از متغیرها مواجه هستیم که به علت زیاد بودن کار با آنها بسیار مشکل خواهد بود. برای حل این مشکل در زبان های برنامه نویسی یک ساختار داده به نام آرایه وجود دارد. آرایه یک مجموعه ای از داده های هم نوع می باشد که داده ها را در حافظه پشت سرهم ذخیره می کند.

آرایه یک نام دارد و هرکدام از داده ها را در یک خانه ذخیره می کند که این خانه با یک اندیس مشخص می شود. اندازه آرایه در جاوا ثابت است. برای مثال برای ذخیره 100 عدد باید 100 عدد متغیر تعریف کرد مانند num1, num2, …..,num100 در حالی که وقتی از آرایه استفاده می کنیم می توانیم یک آرایه 100 تایی معرفی کنیم و برای دسترسی به هرکدام از اندیس آن استفاده کنیم مثل num[0], num[1], num[2],….,num[99]. دقت داشته باشید که اولین خانه آرایه از0 شروع می شود و برای یک آرایه 100 تایی خانه آخر خانه 99 است یعنی یکی کمتر.

معرفی آرایه و کاربردش در جاوا

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

dataType[] arrayRefVar;   // روش توصیه شده

or

dataType arrayRefVar[];  //  کار می کند ولی توصیه نمی شود

در روش های گفته شده در بالا روش توصیه شده روش خود جاوا است و روشی که توصیه نمی شود روشی است که در زبان های مانند c , c++ مورد استفاده قرار می گیرد و از آنجا که سینتکس جاوا برپایه سینتکس c++ ساخته شده است این روش نوشتاری نیز در جاوا آورده شده است که برای کاربران c++ نیز قابل استفاده باشد.هنگام تعریف باید در قسمت datatype نوع داده یا کلاسی که می خواهیم از آن آرایه بسازیم رای می آوریم و همچنین به جای arrayRefVar نیز باید نام آرایه را قرار داد. مانند کد زیر:

double[] myArray;         // روش توصیه شده

or

double myArray[];         // کار می کند ولی توصیه نمی شود

آموزش ساخت آرایه

با استفاده از کلمه کلیدی new می توان یک آرایه جدید ساخت. شکل کلی ساخت آرایه مانند زیر است:

arrayRefVar = new dataType[arraySize];

می توان معرفی کردن و ساختن یک آرایه جدید رادر یک خط باهم انجام داد که کد آن به شکل زیر خواهد بود:

dataType[] arrayRefVar = new dataType[arraySize];

روش دیگری که برای معرفی و ساخت آرایه مورد استفاده قرار می گیرد به این شکل است که مقادیری را که قرار است داخل آرایه ذخیره گردد در همان زمان ساخت آرایه درون آن قرار دهیم که این روش در کد زیر آورده شده است.

dataType[] arrayRefVar = {value0, value1, ..., valuek};

عناصر آرایه همانطور که گفته شد با استفاده از اندیس قابل دسترس هستند که اندیس از 0 شروع می شود.در کد زیر یک آرایه double به نام myList ساخته شده است که 10 خانه دارد.

double[] myList = new double[10];

شکل زیر ساختار آرایه myList را نشان می دهد که مقادیر double در داخل آن ریخته شده است.

با سلام به همه دوستان و همراهان Itpro. در برنامه نویسی بسیاری از مواقع پیش می آید که یک مجموعه ای از داده ها وجود دارد که همه از یک نوع یا یک کلاس می باشند. اگر بخواهیم هرکدام از این داده ها را در یک متغیر ذخیره کنیم ممکن است که چندصد متغیر داشته باشیم که همه از یک نوع می باشند. در این حالت با انبوهی از متغیرها مواجه هستیم که به علت زیاد بودن کار با آنها بسیار مشکل خواهد بود. برای حل این مشکل در زبان های برنامه نویسی یک ساختار داده به نام آرایه وجود دارد. آرایه یک مجموعه ای از داده های هم نوع می باشد که داده ها را در حافظه پشت سرهم ذخیره می کند. آرایه یک نام دارد و هرکدام از داده ها را در یک خانه ذخیره می کند که این خانه با یک اندیس مشخص می شود. اندازه آرایه در جاوا ثابت است. برای مثال برای ذخیره 100 عدد باید 100 عدد متغیر تعریف کرد مانند num1, num2, …..,num100 در حالی که وقتی از آرایه استفاده می کنیم می توانیم یک آرایه 100 تایی معرفی کنیم و برای دسترسی به هرکدام از اندیس آن استفاده کنیم مثل num[0], num[1], num[2],….,num[99]. دقت داشته باشید که اولین خانه آرایه از0 شروع می شود و برای یک آرایه 100 تایی خانه آخر خانه 99 است یعنی یکی کمتر.

!!معرفی آرایه
برای استفاده از یک آرایه باید آن را ابتدا معرفی کرد. در هنگام معرفی آرایه نوع آرایه و اندازه آن مشخص می شود. در شکل زیر نحوه معرفی آرایه نشان داده شده است:
<java>
dataType[] arrayRefVar;   // روش توصیه شده

or

dataType arrayRefVar[];  //  کار می کند ولی توصیه نمی شود
<java>
در روش های گفته شده در بالا روش توصیه شده روش خود جاوا است و روشی که توصیه نمی شود روشی است که در زبان های مانند c , c++ مورد استفاده قرار می گیرد و از آنجا که سینتکس جاوا برپایه سینتکس c++ ساخته شده است این روش نوشتاری نیز در جاوا آورده شده است که برای کاربران c++ نیز قابل استفاده باشد.هنگام تعریف باید در قسمت datatype نوع داده یا کلاسی که می خواهیم از آن آرایه بسازیم رای می آوریم و همچنین به جای arrayRefVar نیز باید نام آرایه را قرار داد. مانند کد زیر:
<java>
double[] myArray;         // روش توصیه شده

or

double myArray[];         // کار می کند ولی توصیه نمی شود
<java>

!!ساخت آرایه
با استفاده از کلمه کلیدی new می توان یک آرایه جدید ساخت. شکل کلی ساخت آرایه مانند زیر است:
<java>
arrayRefVar = new dataType[arraySize];
<java>
می توان معرفی کردن و ساختن یک آرایه جدید رادر یک خط باهم انجام داد که کد آن به شکل زیر خواهد بود:
<java>
dataType[] arrayRefVar = new dataType[arraySize];
<java>
روش دیگری که برای معرفی و ساخت آرایه مورد استفاده قرار می گیرد به این شکل است که مقادیری را که قرار است داخل آرایه ذخیره گردد در همان زمان ساخت آرایه درون آن قرار دهیم که این روش در کد زیر آورده شده است.
<java>
dataType[] arrayRefVar = {value0, value1, ..., valuek};
<java>
عناصر آرایه همانطور که گفته شد با استفاده از اندیس قابل دسترس هستند که اندیس از 0 شروع می شود.
در کد زیر یک آرایه double به نام myList ساخته شده است که 10 خانه دارد.
<java>
double[] myList = new double[10];
<java>
شکل زیر ساختار آرایه myList را نشان می دهد که مقادیر double در داخل آن ریخته شده است.
||http://tosinso.com/files/get/ecd60b26-5bd1-44d5-8747-69d452d74ea7||

!!پردازش آرایه ها
برای پیمایش آرایه و پردازش هرکدام از خانه های آرایه از حلقه های for و foreach استفاده می شود. زیرا که اندازه آرایه از قبل مشخص است و اندازه آرایه را می دانیم. در کد زیر مثالی برای ساخت و استفاده و پردازش آرایه آورده شده است به آن توجه نمایید:
<java>
public class TestArray {

   public static void main(String[] args) {
      double[] myList = {1.9, 2.9, 3.4, 3.5};

      // Print all the array elements
      for (int i = 0; i < myList.length; i++) {
         System.out.println(myList[i] +  );
      }
      // Summing all elements
      double total = 0;
      for (int i = 0; i < myList.length; i++) {
         total += myList[i];
      }
      System.out.println(Total is  + total);
      // Finding the largest element
      double max = myList[0];
      for (int i = 1; i < myList.length; i++) {
         if (myList[i] > max) max = myList[i];
      }
      System.out.println(Max is  + max);
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
1.9
2.9
3.4
3.5
Total is 11.7
ax is 3.5
<text>

!!حلقه foreach
در زمان jdk 1.5 حلقه foreach معرفی شد تا بتواند حلقه for را بهبود دهد. در این نوع از حلقه می توان کل آرایه را بدون این که اندیس ها را دانست پیمایش کرد. برای مثال به کد زیر توجه نمایید:
<java>
public class TestArray {

   public static void main(String[] args) {
      double[] myList = {1.9, 2.9, 3.4, 3.5};

      // Print all the array elements
      for (double element: myList) {
         System.out.println(element);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
1.9
2.9
3.4
3.5
<text>

!! ارسال آرایه به متدها
همانگونه که می توان انواع اولیه داده را به عنوان آرگومان ورودی به متد ها فرستاد می توان آرایه را نیز به عنوان آرگومان به متدها ارسال نمود. برای مثال متد زیر عناصر موجود در آرایه را در خروجی چاپ می نماید.
<java>
public static void printArray(int[] array) {
  for (int i = 0; i < array.length; i++) {
    System.out.print(array[i] +  );
  }
}
<java>
با استفاده از تابع بالا شما می توانید عناصر هر آرایه ای را که از نوع int ساخته شده است را به متد ارسال کرده و متد عناصر آن را چاپ می کند.

!!بازگرداندن آرایه به عنوان مقدار بازگشتی متد
یک متد ممکن است که یک آرایه را به عنوان خروجی بازگرداند. برای مثال متدی که در کد زیر آورده شده است یک آرایه را که برعکس شده آرایه ورودی است را بازمی گرداند.
<java>
public static int[] reverse(int[] list) {
  int[] result = new int[list.length];

  for (int i = 0, j = result.length - 1; i < list.length; i++, j--) {
    result[j] = list[i];
  }
  return result;
}
<java>

!!کلاس Array
این کلاس در پکیج java.util قرار دارد که شامل متدهای برای مرتب سازی آرایه و یا جستجو و مقایسه آرایه ها و پر کردن خانه های آرایه می باشد. این متدها برای انواع داده های اصلی می تواند قابل اعمال باشد. در ادامه به چند عدد از مهمترین این متدها پرداخته ایم
*متد binarySearch* یک ارایه می گیرد و یک مقدار و مقدار مورد نظر را به روش جستجوی دودویی در داخل آرایه جستجو می کند و اگر پیدا شود محل قرارگیری آرایه را برمی گرداند. برای این متد آرایه باید از قبل مرتب شده باشد. شکل نوشتاری این ارایه به شکل زیر است
<java>
public static int binarySearch(Object[] a, Object key)
<java>
*متد equals* این متد دو آرایه را با یکدیگر مقایسه می کند. دو آرایه زمانی با هم مساوی هستند که تعداد خانه های آنها با هم برابر بوده و همچنین هر جفت خانه آرایه ها با هم برابر باشند. اگر دو آرایه با هم برابر باشد این متد مقدار true را برمی گرداند. شکل نوشتاری این متد مانند کد زیر است:
<java>
public static boolean equals(long[] a, long[] a2)  
<java>
*متد fill* این متد یک مقدار و یک آرایه می گیرد و همه ی خانه های آرایه را با آن مقدار پر می کند. این متد به شکل زیر نوشته می شود:
<java>
public static void fill(int[] a, int val)
<java>
*متد sort* این متد یک آرایه را دریافت می کند و عناصر داخل آن را مرتب می کند. دقت داشته باشید که این متد و متد fill هیچ خروجی ندارند و همه تغییرات پرکردن و مرتب کردن بر روی آرایه ورودی انجام می شود و بر روی آن نیز اعمال می گردد. شکل نوشتاری این متد به شکل زیر است:
<java>
public static void sort(Object[] a)
<java>
همه ی اعمال گفته شده در کلاس Array بر روی همه ی انواع اولیه قابل اعمال می باشد.*Itpro باشید*

نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

آموزش پردازش آرایه ها

برای پیمایش آرایه و پردازش هرکدام از خانه های آرایه از حلقه های for و foreach استفاده می شود. زیرا که اندازه آرایه از قبل مشخص است و اندازه آرایه را می دانیم. در کد زیر مثالی برای ساخت و استفاده و پردازش آرایه آورده شده است به آن توجه نمایید:

public class TestArray {

   public static void main(String[] args) {
      double[] myList = {1.9, 2.9, 3.4, 3.5};

      // Print all the array elements
      for (int i = 0; i < myList.length; i++) {
         System.out.println(myList[i] + " ");
      }
      // Summing all elements
      double total = 0;
      for (int i = 0; i < myList.length; i++) {
         total += myList[i];
      }
      System.out.println("Total is " + total);
      // Finding the largest element
      double max = myList[0];
      for (int i = 1; i < myList.length; i++) {
         if (myList[i] > max) max = myList[i];
      }
      System.out.println("Max is " + max);
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

1.9
2.9
3.4
3.5
Total is 11.7
ax is 3.5

آموزش استفاده از حلقه foreach

در زمان jdk 1.5 حلقه foreach معرفی شد تا بتواند حلقه for را بهبود دهد. در این نوع از حلقه می توان کل آرایه را بدون این که اندیس ها را دانست پیمایش کرد. برای مثال به کد زیر توجه نمایید:

public class TestArray {

   public static void main(String[] args) {
      double[] myList = {1.9, 2.9, 3.4, 3.5};

      // Print all the array elements
      for (double element: myList) {
         System.out.println(element);
      }
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

1.9
2.9
3.4
3.5

آموزش ارسال آرایه به متدها

همانگونه که می توان انواع اولیه داده را به عنوان آرگومان ورودی به متد ها فرستاد می توان آرایه را نیز به عنوان آرگومان به متدها ارسال نمود. برای مثال متد زیر عناصر موجود در آرایه را در خروجی چاپ می نماید.

public static void printArray(int[] array) {
  for (int i = 0; i < array.length; i++) {
    System.out.print(array[i] + " ");
  }
}

با استفاده از تابع بالا شما می توانید عناصر هر آرایه ای را که از نوع int ساخته شده است را به متد ارسال کرده و متد عناصر آن را چاپ می کند.

آموزش بازگرداندن آرایه به عنوان مقدار بازگشتی متد

یک متد ممکن است که یک آرایه را به عنوان خروجی بازگرداند. برای مثال متدی که در کد زیر آورده شده است یک آرایه را که برعکس شده آرایه ورودی است را بازمی گرداند.

public static int[] reverse(int[] list) {
  int[] result = new int[list.length];

  for (int i = 0, j = result.length - 1; i < list.length; i++, j--) {
    result[j] = list[i];
  }
  return result;
}

آموزش استفاده از کلاس Array

این کلاس در پکیج java.util قرار دارد که شامل متدهای برای مرتب سازی آرایه و یا جستجو و مقایسه آرایه ها و پر کردن خانه های آرایه می باشد. این متدها برای انواع داده های اصلی می تواند قابل اعمال باشد. در ادامه به چند عدد از مهمترین این متدها پرداخته ایم

متد binarySearch یک ارایه می گیرد و یک مقدار و مقدار مورد نظر را به روش جستجوی دودویی در داخل آرایه جستجو می کند و اگر پیدا شود محل قرارگیری آرایه را برمی گرداند. برای این متد آرایه باید از قبل مرتب شده باشد. شکل نوشتاری این ارایه به شکل زیر است

public static int binarySearch(Object[] a, Object key)

متد equals این متد دو آرایه را با یکدیگر مقایسه می کند. دو آرایه زمانی با هم مساوی هستند که تعداد خانه های آنها با هم برابر بوده و همچنین هر جفت خانه آرایه ها با هم برابر باشند. اگر دو آرایه با هم برابر باشد این متد مقدار true را برمی گرداند. شکل نوشتاری این متد مانند کد زیر است:

public static boolean equals(long[] a, long[] a2)  

متد fill این متد یک مقدار و یک آرایه می گیرد و همه ی خانه های آرایه را با آن مقدار پر می کند. این متد به شکل زیر نوشته می شود:

public static void fill(int[] a, int val)

متد sort این متد یک آرایه را دریافت می کند و عناصر داخل آن را مرتب می کند. دقت داشته باشید که این متد و متد fill هیچ خروجی ندارند و همه تغییرات پرکردن و مرتب کردن بر روی آرایه ورودی انجام می شود و بر روی آن نیز اعمال می گردد. شکل نوشتاری این متد به شکل زیر است:

public static void sort(Object[] a)

همه ی اعمال گفته شده در کلاس Array بر روی همه ی انواع اولیه قابل اعمال می باشد

آموزش کار با تاریخ

به طور معمول در کار با همه برنامه های تجاری به نوعی با تاریخ و ساعت و زمان سرو کار خواهیم داشت. بنابراین اگر زبان برنامه نویسی پشتیبانی مناسبی از تاریخ و زمان داشته باشد می تواند برای برنامه نویسی و تولید نرم افزار بسیار مفید باشد. زبان جاوا کلاس Date را برای کار با تاریخ و زمان فراهم کرده است.

این کلاس در پکیج java.util می باشد. کلاس Date دارای دو constructor می باشد که در یکی آرگومان ورودی وجود ندارد و در دیگری یک آرگومان ورودی وجود دارد. اگر از constructor ی استفاده شود که آرگومان ورودی ندارد، در شئی که ساخته می شود تاریخ کنونی سیستم قرار داده می شود.

در شکل دوم constructor کلاس Date یک مقدار long دریافت می کند که این عدد تعداد میلی ثانیه هایی است که از روز 1 ژانويه سال 1970 می گذرد. اگر از این constructor استفاده کنیم زمانی که میلی ثانیه های مشخص شده گفته اند در داخل شئ مورد نظر ریخته می شود.

معرفی متدهای موجود در کلاس Date

متد after این متد یک ورودی از کلاس Date میگیرد. وظیفه این متد این است که مشخص می کند که تاریخ شئ صدا زننده بعد از تاریخ ورودی است یا خیر. اگر تاریخ شئ صدا زننده بعد از تاریخ ورودی باشد مقدار true برمی گرداند و در غیر این صورت مقدار false برمی گرداند. شکل نوشتاری این متد به شکل زیر است

boolean after(Date date)

متد before این متد برعکس متن قبلی است و اگر تاریخ شئ صدا زننده قبل از تاریخ ورودی باشد مقدار true برمی گرداند. شکل نوشتاری این متد دقیقا شبیه به متد بالا است.

متد clone شئ تاریخ مورد نظر را به همراه داده های درونی اش کپی می کند و شکل نوشتاری آن مانند کد زیر است:

Object clone( )

متد compareTo این متد یک شئ تاریخ به عنوان ورودی می گیرد و با تاریخ شئ صدا زننده متد مقایسه می کند. اگر دو تاریخ با هم برابر بودند مقدار 0 را برمی گرداند و اگر تاریخ شئ صدا زننده قبل از تاریخ ورودی باشد یک مقدار منفی و اگر تاریخ شئ صدا زننده متد بعد از تاریخ ورودی باشد یک مقدار مثبت برمی گرداند. شکل نوشتاری این متد به شکل زیر است:

int compareTo(Date date)

به متد compareTo می توان یک شئ دیگر به عنوان ورودی داد که کامپایلر سعی می کند آن را به کلاس Date تبدیل کند که اگر تبدیل شد تاریخ ها را با هم مقایسه می کند و اگر عمل تبدیل موفقیت آمیز نباشد یک exception از نوع ClassCastException رخ می دهد.

متد equals این متد یک شئ به عنوان ورودی دریافت کرده و اگر دو مقدار از نظر تاریخ و زمان باهم مساوی بودند مقدار true برمی گرداند.

متد getTime این متد اختلاف زمانی تاریخ شئ داده شده را نسبت به 1 ژانویه 1970 محاسبه کرده و به تعداد میلی ثانیه برمی گرداند. شکل نوشتاری این متد در ادامه آورده شده است:

long getTime( )

متد setTime این متد یک آرگومان ورودی می گیرد که یک عدد است که تعداد میلی ثانیه هایی را که از زمان اول ژانویه 1970 می گذرد است و تاریخ مطابق آن را در شئ ذخیره می کند. فرم این متد به شکل زیر است:

void setTime(long time)

برای این که تاریخ یک شئ را به صورت متن دربیاوریم از متد toString استفاده می کنیم که این متد در مطالب قبلی توضیح داده شده است.

آموزش پیدا کردن و نمایش تاریخ کنونی

یک راه آسان برای پیدا کردن تاریخ و زمان جاری در جاوا وجود دارد و آن استفاده از یک شئ Date و استفاده از متد toString می باشد که شکل آن در کد زیر آورده شده است:

import java.util.Date;
  
public class DateDemo {
   public static void main(String args[]) {
       // ساخت شئ
       Date date = new Date();
        
       //نمایش تاریخ
       System.out.println(date.toString());
   }
}

خروجی کد بالا به شکل زیر خواهد بود

Tue Feb 23 16:51:10 IRST 2016

آموزش مقایسه دو تاریخ با هم

سه راه برای مقایسه دو مقدار تاریخ در جاوا وجود دارد که آن ها را شرح می دهیم.

    1. شما می توانید تعداد میلی ثانیه های هرکدام از تاریخ ها را با استفاده از متد getTime به دست آورید و سپس دو مقدار عدد را با هم مقایسه کنید و هرکدام که بیشتر بودند به این معنی است که تاریخ آن بعد تر است.
    2. شما می توانید از متد های before و after و equals برای مقایسه استفاده کنید. برای مثال روز سوم قبل از روز نهم می آید پس اگر در این مثال از متد before استفاده کنیم مقدار true برمی گرداند. برای مثال نتیجه کد زیر مقدار true خواهد بود
System.out.println(new Date(2016,2,23).before(new Date(2016,2,29)));
  1. می توانید از متد compareTo استفاد کنید.

آموزش قالب بندی تاریخ در جاوا

هنگامی که می خواهیم تاریخ را در خروجی نمایش دهیم می توانیم آن را به شکل های گوناگون نمایش دهیم. برای نمایش تاریخ فرمت ها و قالب بندی های گوناگونی در جاوا وجود دارد که با استفاده از کلاس SimpleDateFormat می توان این قالب ها را اعمال کرد. با استفاده از این کلاس می توان قالب های مختلفی برای نمایش تاریخ داشت. برای مثال و درک بهتر به کد زیر دقت کنید:

import java.util.*;
import java.text.*;

public class DateDemo {
   public static void main(String args[]) {

      Date dNow = new Date( );
      SimpleDateFormat ft = 
      new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");

      System.out.println("Current Date: " + ft.format(dNow));
   }
}

خروجی این کد به شکل زیر خواهد بود

Current Date: Sun 2004.07.18 at 04:14:09 PM PDT

همانطور که در کد بالا دیده می شود در متغیر ft یک فرمت تعریف شده است که این فرمت بر روی تاریخ اعمال شده است. همانطور که در کد دیده می شود از علائم و کاراکترهای متنوعی برای فرمت دهی برای تاریخ و زمان به کار رفته است. حال می خواهیم ببینیم که از چه حروفی برای قالب بندی تاریخ می توان استفاده کرد و هر کدام از این حروف چه معنی و مفهومی دارند. در جدول زیر کاراکتر ها به همراه معنی و مفهوم به همراه یک مثال برای هرکدام آورده شده است:

با سلام به همه دوستان وهمراهان Itpro. به طور معمول در کار با همه برنامه های تجاری به نوعی با تاریخ و ساعت و زمان سرو کار خواهیم داشت. بنابراین اگر زبان برنامه نویسی پشتیبانی مناسبی از تاریخ و زمان داشته باشد می تواند برای برنامه نویسی و تولید نرم افزار بسیار مفید باشد. زبان جاوا کلاس Date را برای کار با تاریخ و زمان فراهم کرده است. این کلاس در پکیج java.util می باشد. کلاس Date دارای دو constructor می باشد که در یکی آرگومان ورودی وجود ندارد و در دیگری یک آرگومان ورودی وجود دارد. اگر از constructor ی استفاده شود که آرگومان ورودی ندارد، در شئی که ساخته می شود تاریخ کنونی سیستم قرار داده می شود. در شکل دوم constructor کلاس Date یک مقدار long دریافت می کند که این عدد تعداد میلی ثانیه هایی است که از روز 1 ژانويه سال 1970 می گذرد. اگر از این constructor استفاده کنیم زمانی که میلی ثانیه های مشخص شده گفته اند در داخل شئ مورد نظر ریخته می شود.

!!متدهای موجود در کلاس Date
*متد after* این متد یک ورودی از کلاس Date میگیرد. وظیفه این متد این است که مشخص می کند که تاریخ شئ صدا زننده بعد از تاریخ ورودی است یا خیر. اگر تاریخ شئ صدا زننده بعد از تاریخ ورودی باشد مقدار true برمی گرداند و در غیر این صورت مقدار false برمی گرداند. شکل نوشتاری این متد به شکل زیر است
<java>
boolean after(Date date)
<java>
*متد before* این متد برعکس متن قبلی است و اگر تاریخ شئ صدا زننده قبل از تاریخ ورودی باشد مقدار true برمی گرداند. شکل نوشتاری این متد دقیقا شبیه به متد بالا است.
*متد clone* شئ تاریخ مورد نظر را به همراه داده های درونی اش کپی می کند و شکل نوشتاری آن مانند کد زیر است:
<java>
Object clone( )
<java>
*متد compareTo* این متد یک شئ تاریخ به عنوان ورودی می گیرد و با تاریخ شئ صدا زننده متد مقایسه می کند. اگر دو تاریخ با هم برابر بودند مقدار 0 را برمی گرداند و اگر تاریخ شئ صدا زننده قبل از تاریخ ورودی باشد یک مقدار منفی و اگر تاریخ شئ صدا زننده متد بعد از تاریخ ورودی باشد یک مقدار مثبت برمی گرداند. شکل نوشتاری این متد به شکل زیر است:
<java>
int compareTo(Date date)
<java>
به متد compareTo می توان یک شئ دیگر به عنوان ورودی داد که کامپایلر سعی می کند آن را به کلاس Date تبدیل کند که اگر تبدیل شد تاریخ ها را با هم مقایسه می کند و اگر عمل تبدیل موفقیت آمیز نباشد یک exception  از نوع ClassCastException رخ می دهد.
*متد equals* این متد یک شئ به عنوان ورودی دریافت کرده و اگر دو مقدار از نظر تاریخ و زمان باهم مساوی بودند مقدار true برمی گرداند.
*متد getTime* این متد اختلاف زمانی تاریخ شئ داده شده را نسبت به 1 ژانویه 1970 محاسبه کرده و به تعداد میلی ثانیه برمی گرداند. شکل نوشتاری این متد در ادامه آورده شده است:
<java>
long getTime( )
<java>
*متد setTime* این متد یک آرگومان ورودی می گیرد که یک عدد است که تعداد میلی ثانیه هایی را که از زمان اول ژانویه 1970 می گذرد است و تاریخ مطابق آن را در شئ ذخیره می کند. فرم این متد به شکل زیر است:
<java>
void setTime(long time)
<java>
برای این که تاریخ یک شئ را به صورت متن دربیاوریم از متد toString استفاده می کنیم که این متد در مطالب قبلی توضیح داده شده است.

!!پیدا کردن و نمایش تاریخ کنونی
یک راه آسان برای پیدا کردن تاریخ و زمان جاری در جاوا وجود دارد و آن استفاده از یک شئ Date و استفاده از متد toString می باشد که شکل آن در کد زیر آورده شده است:
<java>
import java.util.Date;
  
public class DateDemo {
   public static void main(String args[]) {
       // ساخت شئ
       Date date = new Date();
        
       //نمایش تاریخ
       System.out.println(date.toString());
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود
<text>
Tue Feb 23 16:51:10 IRST 2016
<text>

!!مقایسه دو تاریخ با هم 
سه راه برای مقایسه دو مقدار تاریخ در جاوا وجود دارد که آن ها را شرح می دهیم.
# شما می توانید تعداد میلی ثانیه های هرکدام از تاریخ ها را با استفاده از متد getTime به دست آورید و سپس دو مقدار عدد را با هم مقایسه کنید و هرکدام که بیشتر بودند به این معنی است که تاریخ آن بعد تر است.
# شما می توانید از متد های before و after و equals برای مقایسه استفاده کنید. برای مثال روز سوم قبل از روز نهم می آید پس اگر در این مثال از متد before استفاده کنیم مقدار true برمی گرداند. برای مثال نتیجه کد زیر مقدار true خواهد بود
<java>
System.out.println(new Date(2016,2,23).before(new Date(2016,2,29)));
<java>
# می توانید از متد compareTo استفاد کنید.

!!قالب بندی تاریخ
هنگامی که می خواهیم تاریخ را در خروجی نمایش دهیم می توانیم آن را به شکل های گوناگون نمایش دهیم. برای نمایش تاریخ فرمت ها و قالب بندی های گوناگونی در جاوا وجود دارد که با استفاده از کلاس SimpleDateFormat  می توان این قالب ها را اعمال کرد. با استفاده از این کلاس می توان قالب های مختلفی برای نمایش تاریخ داشت. برای مثال و درک بهتر به کد زیر دقت کنید:
<java>
import java.util.*;
import java.text.*;

public class DateDemo {
   public static void main(String args[]) {

      Date dNow = new Date( );
      SimpleDateFormat ft = 
      new SimpleDateFormat (E yyyy.MM.dd 'at' hh:mm:ss a zzz);

      System.out.println(Current Date:  + ft.format(dNow));
   }
}
<java>
خروجی این کد به شکل زیر خواهد بود
<text>
Current Date: Sun 2004.07.18 at 04:14:09 PM PDT
<text>
همانطور که در کد بالا دیده می شود در متغیر ft یک فرمت تعریف شده است که این فرمت بر روی تاریخ اعمال شده است. همانطور که در کد دیده می شود از علائم و کاراکترهای متنوعی برای فرمت دهی برای تاریخ و زمان به کار رفته است. حال می خواهیم ببینیم که از چه حروفی برای قالب بندی تاریخ می توان استفاده کرد و هر کدام از این حروف چه معنی و مفهومی دارند. در جدول زیر کاراکتر ها به همراه معنی و مفهوم به همراه یک مثال برای هرکدام آورده شده است:
||http://tosinso.com/files/get/fea6288f-8c57-4d8d-8b76-6e9704e95ba5||

!!قالب بندی داده ها با printf
با استفاده از printf نیز می توان داده ها را در خروجی قالب بندی کرد. با استفاده از این متد برای مشخص کردن نوع قالب بندی از دو حرف استفاده می کنیم که حرف اول آن t می باشد. این حرف به همراه مثال و تعریف در جدول زیر آمده اند.
||http://tosinso.com/files/get/a5658e48-85c3-4a66-a62b-d95df3442cc8||
مثالی از قالب بندی با استفاده از printf در کد زیر آمده است.
<java>
import java.util.Date;

public class DateDemo {

  public static void main(String args[]) {
     // Instantiate a Date object
     Date date = new Date();

     // display time and date using toString()
     String str = String.format(Current Date/Time : %tc, date );

     System.out.printf(str);
  }
}
<java>
خروجی این کد به شکل زیر خواهد بود:
<text>
Current Date/Time : Sat Dec 15 16:37:57 MST 2012
<text>
این قابلیت هم وجود دارد که با استفاده از متد printf تاریخ را جزء به جزء قالب بندی کنیم. برای این کار باید هر جزء با اندیس مشخص شود که قبل از اندیس علامت % و بعد از اندیس علامت $ قرار می گیرد. برای مثال به کد زیر دقت کنید
<java>
import java.util.Date;
  
public class DateDemo {

   public static void main(String args[]) {
       // Instantiate a Date object
       Date date = new Date();
        
       // display time and date using toString()
       System.out.printf(%1$s %2$tB %2$td, %2$tY, 
                         Due date:, date);
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
Due date: February 09, 2004
<text>
کتاب خانه های دیگری هم در مورد تاریخ در جاوا وجود دارند که از آوردن آنها صرف نظر کرده ایم.

!!تبدیل رشته به تاریخ
کلاس SimpleDateFormat متدهایی مانند parse دارد که متن را به تاریخی با فرمت داده شده تبدیل می کند. برای مثال به کد زیر دقت کنید:
<java>
import java.util.*;
import java.text.*;
  
public class DateDemo {

   public static void main(String args[]) {
      SimpleDateFormat ft = new SimpleDateFormat (yyyy-MM-dd); 

      String input = args.length == 0 ? 1818-11-11 : args[0]; 

      System.out.print(input +  Parses as ); 

      Date t; 

      try { 
          t = ft.parse(input); 
          System.out.println(t); 
      } catch (ParseException e) { 
          System.out.println(Unparseable using  + ft); 
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818
<text>
البته دقت داشته باشید که اگر به فرمت داده شده تاریخ را وارد نکنید برنامه به شما خطا خواهد داد.

!!متوقف کردن برنامه برای مدتی
برنامه جاوا که در حال اجرا است را می توان برای مدتی متوقف کرد. برای مثال برنامه زیر به مدت 10 ثانیه متوقف می شود.
<java>
import java.util.*;
  
public class SleepDemo {
   public static void main(String args[]) {
      try { 
         System.out.println(new Date( ) + \n); 
         Thread.sleep(5*60*10); 
         System.out.println(new Date( ) + \n); 
      } catch (Exception e) { 
          System.out.println(Got an exception!); 
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
Sun May 03 18:04:41 GMT 2009

Sun May 03 18:04:51 GMT 2009
<text>

!!محاسبه زمان صرف شده
گاهی اوقات می خواهیم بدانیم که اجرای یک قسمت از کد چه مقدار زمان می برد. جاوا می تواند این زمان را در قالب میلی ثانیه برای ما مشخص کند. به این شکل که قبل از کد مورد نظر زمان را ذخیره می کنیم و پس از این که اجرای کد پایان یافت زمان را در نظر می گیریم و اختلاف بین دو زمان رامحاسبه می کنیم. برای درک بهتر به کد زیر که شکل بازنویسی شده کد بالا است توجه کنید:
<java>
import java.util.*;
  
public class DiffDemo {

   public static void main(String args[]) {
      try {
         long start = System.currentTimeMillis( );
         System.out.println(new Date( ) + \n);
         Thread.sleep(5*60*10);
         System.out.println(new Date( ) + \n);
         long end = System.currentTimeMillis( );
         long diff = end - start;
         System.out.println(Difference is :  + diff);
      } catch (Exception e) {
         System.out.println(Got an exception!);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
Sun May 03 18:16:51 GMT 2009

Sun May 03 18:16:57 GMT 2009

Difference is : 5993
<text>
*Itpro باشید*



نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

آموزش قالب بندی داده ها با printf

با استفاده از printf نیز می توان داده ها را در خروجی قالب بندی کرد. با استفاده از این متد برای مشخص کردن نوع قالب بندی از دو حرف استفاده می کنیم که حرف اول آن t می باشد. این حرف به همراه مثال و تعریف در جدول زیر آمده اند.

با سلام به همه دوستان وهمراهان Itpro. به طور معمول در کار با همه برنامه های تجاری به نوعی با تاریخ و ساعت و زمان سرو کار خواهیم داشت. بنابراین اگر زبان برنامه نویسی پشتیبانی مناسبی از تاریخ و زمان داشته باشد می تواند برای برنامه نویسی و تولید نرم افزار بسیار مفید باشد. زبان جاوا کلاس Date را برای کار با تاریخ و زمان فراهم کرده است. این کلاس در پکیج java.util می باشد. کلاس Date دارای دو constructor می باشد که در یکی آرگومان ورودی وجود ندارد و در دیگری یک آرگومان ورودی وجود دارد. اگر از constructor ی استفاده شود که آرگومان ورودی ندارد، در شئی که ساخته می شود تاریخ کنونی سیستم قرار داده می شود. در شکل دوم constructor کلاس Date یک مقدار long دریافت می کند که این عدد تعداد میلی ثانیه هایی است که از روز 1 ژانويه سال 1970 می گذرد. اگر از این constructor استفاده کنیم زمانی که میلی ثانیه های مشخص شده گفته اند در داخل شئ مورد نظر ریخته می شود.

!!متدهای موجود در کلاس Date
*متد after* این متد یک ورودی از کلاس Date میگیرد. وظیفه این متد این است که مشخص می کند که تاریخ شئ صدا زننده بعد از تاریخ ورودی است یا خیر. اگر تاریخ شئ صدا زننده بعد از تاریخ ورودی باشد مقدار true برمی گرداند و در غیر این صورت مقدار false برمی گرداند. شکل نوشتاری این متد به شکل زیر است
<java>
boolean after(Date date)
<java>
*متد before* این متد برعکس متن قبلی است و اگر تاریخ شئ صدا زننده قبل از تاریخ ورودی باشد مقدار true برمی گرداند. شکل نوشتاری این متد دقیقا شبیه به متد بالا است.
*متد clone* شئ تاریخ مورد نظر را به همراه داده های درونی اش کپی می کند و شکل نوشتاری آن مانند کد زیر است:
<java>
Object clone( )
<java>
*متد compareTo* این متد یک شئ تاریخ به عنوان ورودی می گیرد و با تاریخ شئ صدا زننده متد مقایسه می کند. اگر دو تاریخ با هم برابر بودند مقدار 0 را برمی گرداند و اگر تاریخ شئ صدا زننده قبل از تاریخ ورودی باشد یک مقدار منفی و اگر تاریخ شئ صدا زننده متد بعد از تاریخ ورودی باشد یک مقدار مثبت برمی گرداند. شکل نوشتاری این متد به شکل زیر است:
<java>
int compareTo(Date date)
<java>
به متد compareTo می توان یک شئ دیگر به عنوان ورودی داد که کامپایلر سعی می کند آن را به کلاس Date تبدیل کند که اگر تبدیل شد تاریخ ها را با هم مقایسه می کند و اگر عمل تبدیل موفقیت آمیز نباشد یک exception  از نوع ClassCastException رخ می دهد.
*متد equals* این متد یک شئ به عنوان ورودی دریافت کرده و اگر دو مقدار از نظر تاریخ و زمان باهم مساوی بودند مقدار true برمی گرداند.
*متد getTime* این متد اختلاف زمانی تاریخ شئ داده شده را نسبت به 1 ژانویه 1970 محاسبه کرده و به تعداد میلی ثانیه برمی گرداند. شکل نوشتاری این متد در ادامه آورده شده است:
<java>
long getTime( )
<java>
*متد setTime* این متد یک آرگومان ورودی می گیرد که یک عدد است که تعداد میلی ثانیه هایی را که از زمان اول ژانویه 1970 می گذرد است و تاریخ مطابق آن را در شئ ذخیره می کند. فرم این متد به شکل زیر است:
<java>
void setTime(long time)
<java>
برای این که تاریخ یک شئ را به صورت متن دربیاوریم از متد toString استفاده می کنیم که این متد در مطالب قبلی توضیح داده شده است.

!!پیدا کردن و نمایش تاریخ کنونی
یک راه آسان برای پیدا کردن تاریخ و زمان جاری در جاوا وجود دارد و آن استفاده از یک شئ Date و استفاده از متد toString می باشد که شکل آن در کد زیر آورده شده است:
<java>
import java.util.Date;
  
public class DateDemo {
   public static void main(String args[]) {
       // ساخت شئ
       Date date = new Date();
        
       //نمایش تاریخ
       System.out.println(date.toString());
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود
<text>
Tue Feb 23 16:51:10 IRST 2016
<text>

!!مقایسه دو تاریخ با هم 
سه راه برای مقایسه دو مقدار تاریخ در جاوا وجود دارد که آن ها را شرح می دهیم.
# شما می توانید تعداد میلی ثانیه های هرکدام از تاریخ ها را با استفاده از متد getTime به دست آورید و سپس دو مقدار عدد را با هم مقایسه کنید و هرکدام که بیشتر بودند به این معنی است که تاریخ آن بعد تر است.
# شما می توانید از متد های before و after و equals برای مقایسه استفاده کنید. برای مثال روز سوم قبل از روز نهم می آید پس اگر در این مثال از متد before استفاده کنیم مقدار true برمی گرداند. برای مثال نتیجه کد زیر مقدار true خواهد بود
<java>
System.out.println(new Date(2016,2,23).before(new Date(2016,2,29)));
<java>
# می توانید از متد compareTo استفاد کنید.

!!قالب بندی تاریخ
هنگامی که می خواهیم تاریخ را در خروجی نمایش دهیم می توانیم آن را به شکل های گوناگون نمایش دهیم. برای نمایش تاریخ فرمت ها و قالب بندی های گوناگونی در جاوا وجود دارد که با استفاده از کلاس SimpleDateFormat  می توان این قالب ها را اعمال کرد. با استفاده از این کلاس می توان قالب های مختلفی برای نمایش تاریخ داشت. برای مثال و درک بهتر به کد زیر دقت کنید:
<java>
import java.util.*;
import java.text.*;

public class DateDemo {
   public static void main(String args[]) {

      Date dNow = new Date( );
      SimpleDateFormat ft = 
      new SimpleDateFormat (E yyyy.MM.dd 'at' hh:mm:ss a zzz);

      System.out.println(Current Date:  + ft.format(dNow));
   }
}
<java>
خروجی این کد به شکل زیر خواهد بود
<text>
Current Date: Sun 2004.07.18 at 04:14:09 PM PDT
<text>
همانطور که در کد بالا دیده می شود در متغیر ft یک فرمت تعریف شده است که این فرمت بر روی تاریخ اعمال شده است. همانطور که در کد دیده می شود از علائم و کاراکترهای متنوعی برای فرمت دهی برای تاریخ و زمان به کار رفته است. حال می خواهیم ببینیم که از چه حروفی برای قالب بندی تاریخ می توان استفاده کرد و هر کدام از این حروف چه معنی و مفهومی دارند. در جدول زیر کاراکتر ها به همراه معنی و مفهوم به همراه یک مثال برای هرکدام آورده شده است:
||http://tosinso.com/files/get/fea6288f-8c57-4d8d-8b76-6e9704e95ba5||

!!قالب بندی داده ها با printf
با استفاده از printf نیز می توان داده ها را در خروجی قالب بندی کرد. با استفاده از این متد برای مشخص کردن نوع قالب بندی از دو حرف استفاده می کنیم که حرف اول آن t می باشد. این حرف به همراه مثال و تعریف در جدول زیر آمده اند.
||http://tosinso.com/files/get/a5658e48-85c3-4a66-a62b-d95df3442cc8||
مثالی از قالب بندی با استفاده از printf در کد زیر آمده است.
<java>
import java.util.Date;

public class DateDemo {

  public static void main(String args[]) {
     // Instantiate a Date object
     Date date = new Date();

     // display time and date using toString()
     String str = String.format(Current Date/Time : %tc, date );

     System.out.printf(str);
  }
}
<java>
خروجی این کد به شکل زیر خواهد بود:
<text>
Current Date/Time : Sat Dec 15 16:37:57 MST 2012
<text>
این قابلیت هم وجود دارد که با استفاده از متد printf تاریخ را جزء به جزء قالب بندی کنیم. برای این کار باید هر جزء با اندیس مشخص شود که قبل از اندیس علامت % و بعد از اندیس علامت $ قرار می گیرد. برای مثال به کد زیر دقت کنید
<java>
import java.util.Date;
  
public class DateDemo {

   public static void main(String args[]) {
       // Instantiate a Date object
       Date date = new Date();
        
       // display time and date using toString()
       System.out.printf(%1$s %2$tB %2$td, %2$tY, 
                         Due date:, date);
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
Due date: February 09, 2004
<text>
کتاب خانه های دیگری هم در مورد تاریخ در جاوا وجود دارند که از آوردن آنها صرف نظر کرده ایم.

!!تبدیل رشته به تاریخ
کلاس SimpleDateFormat متدهایی مانند parse دارد که متن را به تاریخی با فرمت داده شده تبدیل می کند. برای مثال به کد زیر دقت کنید:
<java>
import java.util.*;
import java.text.*;
  
public class DateDemo {

   public static void main(String args[]) {
      SimpleDateFormat ft = new SimpleDateFormat (yyyy-MM-dd); 

      String input = args.length == 0 ? 1818-11-11 : args[0]; 

      System.out.print(input +  Parses as ); 

      Date t; 

      try { 
          t = ft.parse(input); 
          System.out.println(t); 
      } catch (ParseException e) { 
          System.out.println(Unparseable using  + ft); 
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818
<text>
البته دقت داشته باشید که اگر به فرمت داده شده تاریخ را وارد نکنید برنامه به شما خطا خواهد داد.

!!متوقف کردن برنامه برای مدتی
برنامه جاوا که در حال اجرا است را می توان برای مدتی متوقف کرد. برای مثال برنامه زیر به مدت 10 ثانیه متوقف می شود.
<java>
import java.util.*;
  
public class SleepDemo {
   public static void main(String args[]) {
      try { 
         System.out.println(new Date( ) + \n); 
         Thread.sleep(5*60*10); 
         System.out.println(new Date( ) + \n); 
      } catch (Exception e) { 
          System.out.println(Got an exception!); 
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
Sun May 03 18:04:41 GMT 2009

Sun May 03 18:04:51 GMT 2009
<text>

!!محاسبه زمان صرف شده
گاهی اوقات می خواهیم بدانیم که اجرای یک قسمت از کد چه مقدار زمان می برد. جاوا می تواند این زمان را در قالب میلی ثانیه برای ما مشخص کند. به این شکل که قبل از کد مورد نظر زمان را ذخیره می کنیم و پس از این که اجرای کد پایان یافت زمان را در نظر می گیریم و اختلاف بین دو زمان رامحاسبه می کنیم. برای درک بهتر به کد زیر که شکل بازنویسی شده کد بالا است توجه کنید:
<java>
import java.util.*;
  
public class DiffDemo {

   public static void main(String args[]) {
      try {
         long start = System.currentTimeMillis( );
         System.out.println(new Date( ) + \n);
         Thread.sleep(5*60*10);
         System.out.println(new Date( ) + \n);
         long end = System.currentTimeMillis( );
         long diff = end - start;
         System.out.println(Difference is :  + diff);
      } catch (Exception e) {
         System.out.println(Got an exception!);
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
Sun May 03 18:16:51 GMT 2009

Sun May 03 18:16:57 GMT 2009

Difference is : 5993
<text>
*Itpro باشید*



نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

مثالی از قالب بندی با استفاده از printf در کد زیر آمده است.

import java.util.Date;

public class DateDemo {

  public static void main(String args[]) {
     // Instantiate a Date object
     Date date = new Date();

     // display time and date using toString()
     String str = String.format("Current Date/Time : %tc", date );

     System.out.printf(str);
  }
}

خروجی این کد به شکل زیر خواهد بود:

Current Date/Time : Sat Dec 15 16:37:57 MST 2012

این قابلیت هم وجود دارد که با استفاده از متد printf تاریخ را جزء به جزء قالب بندی کنیم. برای این کار باید هر جزء با اندیس مشخص شود که قبل از اندیس علامت % و بعد از اندیس علامت $ قرار می گیرد. برای مثال به کد زیر دقت کنید

import java.util.Date;
  
public class DateDemo {

   public static void main(String args[]) {
       // Instantiate a Date object
       Date date = new Date();
        
       // display time and date using toString()
       System.out.printf("%1$s %2$tB %2$td, %2$tY", 
                         "Due date:", date);
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

Due date: February 09, 2004

کتاب خانه های دیگری هم در مورد تاریخ در جاوا وجود دارند که از آوردن آنها صرف نظر کرده ایم.

آموزش تبدیل رشته به تاریخ

کلاس SimpleDateFormat متدهایی مانند parse دارد که متن را به تاریخی با فرمت داده شده تبدیل می کند. برای مثال به کد زیر دقت کنید:

import java.util.*;
import java.text.*;
  
public class DateDemo {

   public static void main(String args[]) {
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); 

      String input = args.length == 0 ? "1818-11-11" : args[0]; 

      System.out.print(input + " Parses as "); 

      Date t; 

      try { 
          t = ft.parse(input); 
          System.out.println(t); 
      } catch (ParseException e) { 
          System.out.println("Unparseable using " + ft); 
      }
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818

البته دقت داشته باشید که اگر به فرمت داده شده تاریخ را وارد نکنید برنامه به شما خطا خواهد داد.

آموزش متوقف کردن برنامه برای مدتی

برنامه جاوا که در حال اجرا است را می توان برای مدتی متوقف کرد. برای مثال برنامه زیر به مدت 10 ثانیه متوقف می شود.

import java.util.*;
  
public class SleepDemo {
   public static void main(String args[]) {
      try { 
         System.out.println(new Date( ) + "\n"); 
         Thread.sleep(5*60*10); 
         System.out.println(new Date( ) + "\n"); 
      } catch (Exception e) { 
          System.out.println("Got an exception!"); 
      }
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

Sun May 03 18:04:41 GMT 2009

Sun May 03 18:04:51 GMT 2009

آموزش محاسبه زمان صرف شده

گاهی اوقات می خواهیم بدانیم که اجرای یک قسمت از کد چه مقدار زمان می برد. جاوا می تواند این زمان را در قالب میلی ثانیه برای ما مشخص کند. به این شکل که قبل از کد مورد نظر زمان را ذخیره می کنیم و پس از این که اجرای کد پایان یافت زمان را در نظر می گیریم و اختلاف بین دو زمان رامحاسبه می کنیم. برای درک بهتر به کد زیر که شکل بازنویسی شده کد بالا است توجه کنید:

import java.util.*;
  
public class DiffDemo {

   public static void main(String args[]) {
      try {
         long start = System.currentTimeMillis( );
         System.out.println(new Date( ) + "\n");
         Thread.sleep(5*60*10);
         System.out.println(new Date( ) + "\n");
         long end = System.currentTimeMillis( );
         long diff = end - start;
         System.out.println("Difference is : " + diff);
      } catch (Exception e) {
         System.out.println("Got an exception!");
      }
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

Sun May 03 18:16:51 GMT 2009

Sun May 03 18:16:57 GMT 2009

Difference is : 5993

عبارات منظم (Regular Expression)

تشخیص الگو در متن اهمیت بسیاری دارد. در بسیاری از موارد شما انتظار دارید که متنی که کاربر وارد کرده است در قالب مشخصی باشد. برای مثال وارد کردن ایمیل یا شماره تلفنن باید همیشه با یک فرمت و قالب مشخصی باشد. اگر هربار بخواهیم با استفاده از برنامه نویسی چک کنیم که متن وارد شده درست وارد شده است یا خیر کار سختی است که ممکن است کارایی برنامه را پایین بیاورد.

برای حل این مشکل از عبارات منظم یا regular expression ها استفاده می کنیم. جاوا کتابخانه های regular expression را در پکیج java.util.regex قرار داده است. نحوه استفاده از این کتابخانه مانند برنامه نویسی به زبان پرل است و به راحتی قابل یادگیری است. Regular expression یک ترتیب مخصوص از کاراکتر ها است که کمک می کند که رشته ها را با الگوی مورد نظر تطبیق دهید. از این تکنیک می توان در جستجو و ویرایش رشته ها استفاده کرد. پکیج java.util.regex سه کلاس اصلی دارد که عبارتند از:

معرفی کلاس Pttern

این کلاس constructor خارجی ندارد. نحوه کار این کلاس این است که ابتدا شما باید یک regular expression به آن داده و کامپایل کنید. سپس می توانید از آن و متدهای آن استفاده کنید. برای کامپایل regular expression در این کلاس شما باید از متد compile استفاده کنید.

معرفی کلاس Matcher

یک شئ Matcher یک موتور است که الگو ها را با رشته های ورودی تطبیق می دهد. این کلاس هم مانند کلاس Pattern هیچ constructor عمومی ندارد. شما برای این که شئ matcher خود را مقداردهی کنید باید متد matcher را از کلاس Pattern فراخوانی نمایید.

معرفی کلاس PatternSyntaxException

اشیاء این کلاس مشکلات سینتکسی و نوشتاری را داخل الگوی regular expression مشخص می کند.

بررسی مفهوم پردازش گروه ها

اگر یک دنباله از کارکتر ها را در داخل پرانتز قرار دهیم به عنوان یک گروه شناخته می شود که با گروه ها به عنوان یک واحد رفتار خواهد شد. برای مثال گروه (dog) یک گروه است که از سه کاراکتر d, o, g ساخته شده است. پیدا کردن گروه ها با شمارش پرانتز های باز از سمت چپ به راست انجام می شود. شمارش گروه ها با تعداد پرانتز های باز شده از چپ به راست محاسبه می شود. برای مثال در عبارت زیر 4 گروه را می توان مشخص کرد.

((A)(B(C)))

گروه های به دست آمده از عبارت بالا به شرح زیر است:

((A)(B(C)))
(A)
(B(C))
(C)

برای این که بدانیم یک عبارت چند گروه دارد متد groupCount را از شئ matcher فراخوانی می کنیم. این متد یک عدد صحیح برمی گرداند که تعداد گروه های به موجود در عبارت می باشد. یک گروه گروهی است که کل عبارت را در نظر می گیرد که به آن گروه 0 گفته می شود. این گروه در شمارش گروه ها در متد groupCount نمی آید. در مثال زیر کدی آورده شده است که نحوه استفاده از کلاس های گفته شده را نشان می دهد.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    public static void main( String args[] ){

      // رشته ای که می خواهیم مورد ارزیابی قرار دهیم
      String line = "This order was placed for QT3000! OK?";
	  //الگویی که تعریف می کنیم
      String pattern = "(.*)(\\d+)(.*)";

      // ساخت شئ پترن
      Pattern r = Pattern.compile(pattern);

      // ساخت شی متچر
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
      } else {
         System.out.println("NO MATCH");
      }
   }
}

خروجی کد بالا به شرح زیر است:

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0

در قسمت pattern کد بالا از کاراکتر هایی استفاده شده است که باعث می شود الگوی متن مشخص شود. هرکدام از این کاراکتر ها معنی و مفهوم خاصی دارند که در شکل زیر هرکدام را نشان می دهیم. اگر با نظریه زبان ها و ماشین ها اشنا باشید می بینید که این نوشتار ها بسیار شبیه به عبارات منظم در آن مبحث می باشد.

با سلام به همه دوستان و همراهان itpro. تشخیص الگو در متن اهمیت بسیاری دارد. در بسیاری از موارد شما انتظار دارید که متنی که کاربر وارد کرده است در قالب مشخصی باشد. برای مثال وارد کردن ایمیل یا شماره تلفنن باید همیشه با یک فرمت و قالب مشخصی باشد. اگر هربار بخواهیم با استفاده از برنامه نویسی چک کنیم که متن وارد شده درست وارد شده است یا خیر کار سختی است که ممکن است کارایی برنامه را پایین بیاورد. برای حل این مشکل از عبارات منظم یا regular expression ها استفاده می کنیم. جاوا کتابخانه های regular expression را در پکیج java.util.regex قرار داده است. نحوه استفاده از این کتابخانه مانند برنامه نویسی به زبان پرل است و به راحتی قابل یادگیری است. Regular expression یک ترتیب مخصوص از کاراکتر ها است که کمک می کند که رشته ها را با الگوی مورد نظر تطبیق دهید. از این تکنیک می توان در جستجو و ویرایش رشته ها استفاده کرد. پکیج java.util.regex سه کلاس اصلی دارد که عبارتند از:

!!کلاس Pttern
این کلاس constructor خارجی ندارد. نحوه کار این کلاس این است که ابتدا شما باید یک regular expression به آن داده و کامپایل کنید. سپس می توانید از آن و متدهای آن استفاده کنید. برای کامپایل regular expression در این کلاس شما باید از متد compile استفاده کنید.

!!کلاس Matcher
یک شئ Matcher یک موتور است که الگو ها را با رشته های ورودی تطبیق می دهد. این کلاس هم مانند کلاس Pattern هیچ constructor عمومی ندارد. شما برای این که شئ matcher خود را مقداردهی کنید باید متد matcher را از کلاس Pattern فراخوانی نمایید.

!!کلاس PatternSyntaxException
اشیاء این کلاس مشکلات سینتکسی و نوشتاری را داخل الگوی regular expression مشخص می کند.

!!پردازش گروه ها
اگر یک دنباله از کارکتر ها  را در داخل پرانتز قرار دهیم به عنوان یک گروه شناخته می شود که با گروه ها به عنوان یک واحد رفتار خواهد شد. برای مثال گروه (dog) یک گروه است که از سه کاراکتر d, o, g ساخته شده است. پیدا کردن گروه ها با شمارش پرانتز های باز از سمت چپ به راست انجام می شود. شمارش گروه ها با تعداد پرانتز های باز شده از چپ به راست محاسبه می شود. برای مثال در عبارت زیر 4 گروه را می توان مشخص کرد.
<text>
((A)(B(C)))
<text>
گروه های به دست آمده از عبارت بالا به شرح زیر است:
<text>
((A)(B(C)))
(A)
(B(C))
(C)
<text>
برای این که بدانیم یک عبارت چند گروه دارد متد groupCount را از شئ matcher فراخوانی می کنیم. این متد یک عدد صحیح برمی گرداند که تعداد گروه های به موجود در عبارت می باشد. یک گروه گروهی است که کل عبارت را در نظر می گیرد که به آن گروه 0 گفته می شود. این گروه در شمارش گروه ها در متد groupCount نمی آید. در مثال زیر کدی آورده شده است که نحوه استفاده از کلاس های گفته شده را نشان می دهد.
<java>
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    public static void main( String args[] ){

      // رشته ای که می خواهیم مورد ارزیابی قرار دهیم
      String line = This order was placed for QT3000! OK?;
	  //الگویی که تعریف می کنیم
      String pattern = (.*)(\\d+)(.*);

      // ساخت شئ پترن
      Pattern r = Pattern.compile(pattern);

      // ساخت شی متچر
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println(Found value:  + m.group(0) );
         System.out.println(Found value:  + m.group(1) );
         System.out.println(Found value:  + m.group(2) );
      } else {
         System.out.println(NO MATCH);
      }
   }
}
<java>
خروجی کد بالا به شرح زیر است:
<text>
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0
<text>
در قسمت pattern کد بالا از کاراکتر هایی استفاده شده است که باعث می شود الگوی متن مشخص شود. هرکدام از این کاراکتر ها معنی و مفهوم خاصی دارند که در شکل  زیر هرکدام را نشان می دهیم. اگر با نظریه زبان ها و ماشین ها  اشنا باشید می بینید که این نوشتار ها بسیار شبیه به عبارات منظم در آن مبحث می باشد. 
||http://tosinso.com/files/get/bcc0fee0-07ce-44f0-a4af-9ed117aaabdd||
||http://tosinso.com/files/get/efdbe8a4-68de-4796-8fe1-f9f0a90e227e||
||http://tosinso.com/files/get/d8b50c6d-b40d-4bd8-895f-a5f05346dae0||

!!متدهای مربوط به کلاس Matcher
در ادامه به معرفی متدهای موجود در کلاس Matcher  می پردازیم.

!!متدهای اندیسی
*متد start* این متد اندیس شروع تطبیق الگوی گرفته شده در متن را برمی گرداند. این متد همچنین یک ورودی می گیرد که آن ورودی شماره گروه را مشخص می نماید.
*متد end* این متد آخرین اندیس رشته را که با الگو تطابق دارد به اضافه یک را برمی گرداند. همچنین این متد می تواند یک آرگومان نیز داشته باشد که شماره گروه را می گیرد و اندیس پایانی آن گروه را برمی گرداند برای مثال از متدهای start , end به مثال زیر توجه نمایید در این مثال به شمارش کلمه cat می پردازیم:
<java>
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static final String REGEX = \\bcat\\b;
    private static final String INPUT =
                                    cat cat cat cattie cat;

    public static void main( String args[] ){
       Pattern p = Pattern.compile(REGEX);
       Matcher m = p.matcher(INPUT); // get a matcher object
       int count = 0;

       while(m.find()) {
         count++;
         System.out.println(Match number +count);
         System.out.println(start(): +m.start());
         System.out.println(end(): +m.end());
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22
<text>
در مثال بالا مشاهده می کنید که تعداد کلمات را شناخته و محل شروع و پایان آن ها را نشان می دهد. همانطور که درکد قابل مشاهده است با کلمه cat به شکل سه عدد کاراکتر c , a , t که از هم جدا باشند رفتار نمی شود و به شکل یک واحد یکتا با آن رفتار می شود.

!! متدهای جستجو
*متد lookingAt* این متد مشخص می کند که الگوی مورد نظر در ابتدای متن وجود دارد یا نه که اگر الگوی مورد نظر وجود داشت مقدار true برمی گرداند.
*متد find* این متد نیز کاری مانند متد lookingAt را انجام می دهد با این تفاوت که در صورتی که اگر در متن الگویی تطبیق داشته باشد مقدار start و end به نسبت همان تغییر خواهد کرد و در بار بعدی که این متد فراخوانی می شود الگوی تطبیق شده بعدی در متد start, end  قرار خواهد گرفت.
*متد matches* این متد سعی می کند که کل متن را با کل الگو تطبیق دهد و اگر این کار انجام شد مقدار true برمی گرداند. در ادامه مثالی از متدهای lookingAt و matches آورده شده است که تفاوت این دو را نشان می دهد.
<java>
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static final String REGEX = foo;
    private static final String INPUT = fooooooooooooooooo;
    private static Pattern pattern;
    private static Matcher matcher;

    public static void main( String args[] ){
       pattern = Pattern.compile(REGEX);
       matcher = pattern.matcher(INPUT);

       System.out.println(Current REGEX is: +REGEX);
       System.out.println(Current INPUT is: +INPUT);

       System.out.println(lookingAt(): +matcher.lookingAt());
       System.out.println(matches(): +matcher.matches());
   }
}
<java>
خروجی کد بالا به شکل زیر است:
<text>
Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false
<text>

!!متدهای جایگزینی
*متد appendReplacement* این متد با یک رشته را گرفته و جایگزین محل تطبیق regular expression می کند و مقدار جایگزین شده را به یک شئ StringBuffer اضافه می کند.
*متد appendTail* این متد عمل جایگزینی را انجام نمی دهد بلکه عمل append را از شئ StringBuffer برای متن match شده انجام می دهد. البته از جایی که عمل متد end برمی گرداند به شئ StringBuffer اضافه می کند.
*متد replaceAll* این متد یک رشته به عنوان ورودی می گیرد و هرجایی که الگو تطبیق داشته شده باشد در آن قسمت عمل جایگزینی رشته را انجام می دهد.
*متد replaceFirst* این متد یک رشته را به عنوان ورودی می گیرد و فقط در اولین تطبیق الگو عمل جایگزینی را انجام می دهد.
در کد زیر مثالی از به کاربردن متدهای appendReplacement و appendTail آورده شده است:
<java>
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
   private static String REGEX = a*b;
   private static String INPUT = aabfooaabfooabfoob;
   private static String REPLACE = -;
   public static void main(String[] args) {
      Pattern p = Pattern.compile(REGEX);
      // get a matcher object
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      m.find();
m.appendReplacement(sb,REPLACE);
m.find();
m.appendReplacement(sb,REPLACE);

      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
-foo-fooabfoob
<text>
در ادامه مثالی آورده شده است که کاربرد متدهای replaceFirst, replaceAll را نشان می دهد. این دو متد برای جایگزینی رشته با قسمتی که با الگو تطبیق داده شده است به کار می رود.
<java>
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static String REGEX = dog;
    private static String INPUT = The dog says meow.  +
                                    All dogs say meow.;
    private static String REPLACE = cat;

    public static void main(String[] args) {
       Pattern p = Pattern.compile(REGEX);
       // get a matcher object
       Matcher m = p.matcher(INPUT); 
       INPUT = m.replaceAll(REPLACE);
       System.out.println(INPUT);
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود
<text>
The cat says meow. All cats say meow.
<text>

!!متدهای کلاس PatternSyntaxException
ممکن است هنگامی که از regular expression استفاده می کنیم خطاهای دستوری در الگوهای ما باشد که ما برای آن خطاها فکری نکرده باشیم. تشخیص این خطاها ممکن است کمی سخت باشد. کلاس PatternSyntaxException به ما کمک می کند تا بفهمیم در کدام قسمت از الگو خطا رخ داده است و چه خطایی در آن قسمت رخ داده است. متدهای این کلاس که به ما کمک می کنند عبارتند از: 
# متد getDescription: این متد شرح خطا را برمی گرداند.
# متد getIndex این متد اندیس خطا را نشان می دهد.
# متد getPattern این متد الگویی را که خطا دارد را برمی گرداند.
# متد getMessage این متد یک متن چند خطی را که شامل شرح خطا و اندیس خطا و الگوی خطا دار و یک سری توضیحات دیگر را برمی گرداند.
*Itpro باشید*


نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.
با سلام به همه دوستان و همراهان itpro. تشخیص الگو در متن اهمیت بسیاری دارد. در بسیاری از موارد شما انتظار دارید که متنی که کاربر وارد کرده است در قالب مشخصی باشد. برای مثال وارد کردن ایمیل یا شماره تلفنن باید همیشه با یک فرمت و قالب مشخصی باشد. اگر هربار بخواهیم با استفاده از برنامه نویسی چک کنیم که متن وارد شده درست وارد شده است یا خیر کار سختی است که ممکن است کارایی برنامه را پایین بیاورد. برای حل این مشکل از عبارات منظم یا regular expression ها استفاده می کنیم. جاوا کتابخانه های regular expression را در پکیج java.util.regex قرار داده است. نحوه استفاده از این کتابخانه مانند برنامه نویسی به زبان پرل است و به راحتی قابل یادگیری است. Regular expression یک ترتیب مخصوص از کاراکتر ها است که کمک می کند که رشته ها را با الگوی مورد نظر تطبیق دهید. از این تکنیک می توان در جستجو و ویرایش رشته ها استفاده کرد. پکیج java.util.regex سه کلاس اصلی دارد که عبارتند از:

!!کلاس Pttern
این کلاس constructor خارجی ندارد. نحوه کار این کلاس این است که ابتدا شما باید یک regular expression به آن داده و کامپایل کنید. سپس می توانید از آن و متدهای آن استفاده کنید. برای کامپایل regular expression در این کلاس شما باید از متد compile استفاده کنید.

!!کلاس Matcher
یک شئ Matcher یک موتور است که الگو ها را با رشته های ورودی تطبیق می دهد. این کلاس هم مانند کلاس Pattern هیچ constructor عمومی ندارد. شما برای این که شئ matcher خود را مقداردهی کنید باید متد matcher را از کلاس Pattern فراخوانی نمایید.

!!کلاس PatternSyntaxException
اشیاء این کلاس مشکلات سینتکسی و نوشتاری را داخل الگوی regular expression مشخص می کند.

!!پردازش گروه ها
اگر یک دنباله از کارکتر ها  را در داخل پرانتز قرار دهیم به عنوان یک گروه شناخته می شود که با گروه ها به عنوان یک واحد رفتار خواهد شد. برای مثال گروه (dog) یک گروه است که از سه کاراکتر d, o, g ساخته شده است. پیدا کردن گروه ها با شمارش پرانتز های باز از سمت چپ به راست انجام می شود. شمارش گروه ها با تعداد پرانتز های باز شده از چپ به راست محاسبه می شود. برای مثال در عبارت زیر 4 گروه را می توان مشخص کرد.
<text>
((A)(B(C)))
<text>
گروه های به دست آمده از عبارت بالا به شرح زیر است:
<text>
((A)(B(C)))
(A)
(B(C))
(C)
<text>
برای این که بدانیم یک عبارت چند گروه دارد متد groupCount را از شئ matcher فراخوانی می کنیم. این متد یک عدد صحیح برمی گرداند که تعداد گروه های به موجود در عبارت می باشد. یک گروه گروهی است که کل عبارت را در نظر می گیرد که به آن گروه 0 گفته می شود. این گروه در شمارش گروه ها در متد groupCount نمی آید. در مثال زیر کدی آورده شده است که نحوه استفاده از کلاس های گفته شده را نشان می دهد.
<java>
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    public static void main( String args[] ){

      // رشته ای که می خواهیم مورد ارزیابی قرار دهیم
      String line = This order was placed for QT3000! OK?;
	  //الگویی که تعریف می کنیم
      String pattern = (.*)(\\d+)(.*);

      // ساخت شئ پترن
      Pattern r = Pattern.compile(pattern);

      // ساخت شی متچر
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println(Found value:  + m.group(0) );
         System.out.println(Found value:  + m.group(1) );
         System.out.println(Found value:  + m.group(2) );
      } else {
         System.out.println(NO MATCH);
      }
   }
}
<java>
خروجی کد بالا به شرح زیر است:
<text>
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0
<text>
در قسمت pattern کد بالا از کاراکتر هایی استفاده شده است که باعث می شود الگوی متن مشخص شود. هرکدام از این کاراکتر ها معنی و مفهوم خاصی دارند که در شکل  زیر هرکدام را نشان می دهیم. اگر با نظریه زبان ها و ماشین ها  اشنا باشید می بینید که این نوشتار ها بسیار شبیه به عبارات منظم در آن مبحث می باشد. 
||http://tosinso.com/files/get/bcc0fee0-07ce-44f0-a4af-9ed117aaabdd||
||http://tosinso.com/files/get/efdbe8a4-68de-4796-8fe1-f9f0a90e227e||
||http://tosinso.com/files/get/d8b50c6d-b40d-4bd8-895f-a5f05346dae0||

!!متدهای مربوط به کلاس Matcher
در ادامه به معرفی متدهای موجود در کلاس Matcher  می پردازیم.

!!متدهای اندیسی
*متد start* این متد اندیس شروع تطبیق الگوی گرفته شده در متن را برمی گرداند. این متد همچنین یک ورودی می گیرد که آن ورودی شماره گروه را مشخص می نماید.
*متد end* این متد آخرین اندیس رشته را که با الگو تطابق دارد به اضافه یک را برمی گرداند. همچنین این متد می تواند یک آرگومان نیز داشته باشد که شماره گروه را می گیرد و اندیس پایانی آن گروه را برمی گرداند برای مثال از متدهای start , end به مثال زیر توجه نمایید در این مثال به شمارش کلمه cat می پردازیم:
<java>
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static final String REGEX = \\bcat\\b;
    private static final String INPUT =
                                    cat cat cat cattie cat;

    public static void main( String args[] ){
       Pattern p = Pattern.compile(REGEX);
       Matcher m = p.matcher(INPUT); // get a matcher object
       int count = 0;

       while(m.find()) {
         count++;
         System.out.println(Match number +count);
         System.out.println(start(): +m.start());
         System.out.println(end(): +m.end());
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22
<text>
در مثال بالا مشاهده می کنید که تعداد کلمات را شناخته و محل شروع و پایان آن ها را نشان می دهد. همانطور که درکد قابل مشاهده است با کلمه cat به شکل سه عدد کاراکتر c , a , t که از هم جدا باشند رفتار نمی شود و به شکل یک واحد یکتا با آن رفتار می شود.

!! متدهای جستجو
*متد lookingAt* این متد مشخص می کند که الگوی مورد نظر در ابتدای متن وجود دارد یا نه که اگر الگوی مورد نظر وجود داشت مقدار true برمی گرداند.
*متد find* این متد نیز کاری مانند متد lookingAt را انجام می دهد با این تفاوت که در صورتی که اگر در متن الگویی تطبیق داشته باشد مقدار start و end به نسبت همان تغییر خواهد کرد و در بار بعدی که این متد فراخوانی می شود الگوی تطبیق شده بعدی در متد start, end  قرار خواهد گرفت.
*متد matches* این متد سعی می کند که کل متن را با کل الگو تطبیق دهد و اگر این کار انجام شد مقدار true برمی گرداند. در ادامه مثالی از متدهای lookingAt و matches آورده شده است که تفاوت این دو را نشان می دهد.
<java>
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static final String REGEX = foo;
    private static final String INPUT = fooooooooooooooooo;
    private static Pattern pattern;
    private static Matcher matcher;

    public static void main( String args[] ){
       pattern = Pattern.compile(REGEX);
       matcher = pattern.matcher(INPUT);

       System.out.println(Current REGEX is: +REGEX);
       System.out.println(Current INPUT is: +INPUT);

       System.out.println(lookingAt(): +matcher.lookingAt());
       System.out.println(matches(): +matcher.matches());
   }
}
<java>
خروجی کد بالا به شکل زیر است:
<text>
Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false
<text>

!!متدهای جایگزینی
*متد appendReplacement* این متد با یک رشته را گرفته و جایگزین محل تطبیق regular expression می کند و مقدار جایگزین شده را به یک شئ StringBuffer اضافه می کند.
*متد appendTail* این متد عمل جایگزینی را انجام نمی دهد بلکه عمل append را از شئ StringBuffer برای متن match شده انجام می دهد. البته از جایی که عمل متد end برمی گرداند به شئ StringBuffer اضافه می کند.
*متد replaceAll* این متد یک رشته به عنوان ورودی می گیرد و هرجایی که الگو تطبیق داشته شده باشد در آن قسمت عمل جایگزینی رشته را انجام می دهد.
*متد replaceFirst* این متد یک رشته را به عنوان ورودی می گیرد و فقط در اولین تطبیق الگو عمل جایگزینی را انجام می دهد.
در کد زیر مثالی از به کاربردن متدهای appendReplacement و appendTail آورده شده است:
<java>
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
   private static String REGEX = a*b;
   private static String INPUT = aabfooaabfooabfoob;
   private static String REPLACE = -;
   public static void main(String[] args) {
      Pattern p = Pattern.compile(REGEX);
      // get a matcher object
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      m.find();
m.appendReplacement(sb,REPLACE);
m.find();
m.appendReplacement(sb,REPLACE);

      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
-foo-fooabfoob
<text>
در ادامه مثالی آورده شده است که کاربرد متدهای replaceFirst, replaceAll را نشان می دهد. این دو متد برای جایگزینی رشته با قسمتی که با الگو تطبیق داده شده است به کار می رود.
<java>
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static String REGEX = dog;
    private static String INPUT = The dog says meow.  +
                                    All dogs say meow.;
    private static String REPLACE = cat;

    public static void main(String[] args) {
       Pattern p = Pattern.compile(REGEX);
       // get a matcher object
       Matcher m = p.matcher(INPUT); 
       INPUT = m.replaceAll(REPLACE);
       System.out.println(INPUT);
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود
<text>
The cat says meow. All cats say meow.
<text>

!!متدهای کلاس PatternSyntaxException
ممکن است هنگامی که از regular expression استفاده می کنیم خطاهای دستوری در الگوهای ما باشد که ما برای آن خطاها فکری نکرده باشیم. تشخیص این خطاها ممکن است کمی سخت باشد. کلاس PatternSyntaxException به ما کمک می کند تا بفهمیم در کدام قسمت از الگو خطا رخ داده است و چه خطایی در آن قسمت رخ داده است. متدهای این کلاس که به ما کمک می کنند عبارتند از: 
# متد getDescription: این متد شرح خطا را برمی گرداند.
# متد getIndex این متد اندیس خطا را نشان می دهد.
# متد getPattern این متد الگویی را که خطا دارد را برمی گرداند.
# متد getMessage این متد یک متن چند خطی را که شامل شرح خطا و اندیس خطا و الگوی خطا دار و یک سری توضیحات دیگر را برمی گرداند.
*Itpro باشید*


نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.
با سلام به همه دوستان و همراهان itpro. تشخیص الگو در متن اهمیت بسیاری دارد. در بسیاری از موارد شما انتظار دارید که متنی که کاربر وارد کرده است در قالب مشخصی باشد. برای مثال وارد کردن ایمیل یا شماره تلفنن باید همیشه با یک فرمت و قالب مشخصی باشد. اگر هربار بخواهیم با استفاده از برنامه نویسی چک کنیم که متن وارد شده درست وارد شده است یا خیر کار سختی است که ممکن است کارایی برنامه را پایین بیاورد. برای حل این مشکل از عبارات منظم یا regular expression ها استفاده می کنیم. جاوا کتابخانه های regular expression را در پکیج java.util.regex قرار داده است. نحوه استفاده از این کتابخانه مانند برنامه نویسی به زبان پرل است و به راحتی قابل یادگیری است. Regular expression یک ترتیب مخصوص از کاراکتر ها است که کمک می کند که رشته ها را با الگوی مورد نظر تطبیق دهید. از این تکنیک می توان در جستجو و ویرایش رشته ها استفاده کرد. پکیج java.util.regex سه کلاس اصلی دارد که عبارتند از:

!!کلاس Pttern
این کلاس constructor خارجی ندارد. نحوه کار این کلاس این است که ابتدا شما باید یک regular expression به آن داده و کامپایل کنید. سپس می توانید از آن و متدهای آن استفاده کنید. برای کامپایل regular expression در این کلاس شما باید از متد compile استفاده کنید.

!!کلاس Matcher
یک شئ Matcher یک موتور است که الگو ها را با رشته های ورودی تطبیق می دهد. این کلاس هم مانند کلاس Pattern هیچ constructor عمومی ندارد. شما برای این که شئ matcher خود را مقداردهی کنید باید متد matcher را از کلاس Pattern فراخوانی نمایید.

!!کلاس PatternSyntaxException
اشیاء این کلاس مشکلات سینتکسی و نوشتاری را داخل الگوی regular expression مشخص می کند.

!!پردازش گروه ها
اگر یک دنباله از کارکتر ها  را در داخل پرانتز قرار دهیم به عنوان یک گروه شناخته می شود که با گروه ها به عنوان یک واحد رفتار خواهد شد. برای مثال گروه (dog) یک گروه است که از سه کاراکتر d, o, g ساخته شده است. پیدا کردن گروه ها با شمارش پرانتز های باز از سمت چپ به راست انجام می شود. شمارش گروه ها با تعداد پرانتز های باز شده از چپ به راست محاسبه می شود. برای مثال در عبارت زیر 4 گروه را می توان مشخص کرد.
<text>
((A)(B(C)))
<text>
گروه های به دست آمده از عبارت بالا به شرح زیر است:
<text>
((A)(B(C)))
(A)
(B(C))
(C)
<text>
برای این که بدانیم یک عبارت چند گروه دارد متد groupCount را از شئ matcher فراخوانی می کنیم. این متد یک عدد صحیح برمی گرداند که تعداد گروه های به موجود در عبارت می باشد. یک گروه گروهی است که کل عبارت را در نظر می گیرد که به آن گروه 0 گفته می شود. این گروه در شمارش گروه ها در متد groupCount نمی آید. در مثال زیر کدی آورده شده است که نحوه استفاده از کلاس های گفته شده را نشان می دهد.
<java>
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    public static void main( String args[] ){

      // رشته ای که می خواهیم مورد ارزیابی قرار دهیم
      String line = This order was placed for QT3000! OK?;
	  //الگویی که تعریف می کنیم
      String pattern = (.*)(\\d+)(.*);

      // ساخت شئ پترن
      Pattern r = Pattern.compile(pattern);

      // ساخت شی متچر
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println(Found value:  + m.group(0) );
         System.out.println(Found value:  + m.group(1) );
         System.out.println(Found value:  + m.group(2) );
      } else {
         System.out.println(NO MATCH);
      }
   }
}
<java>
خروجی کد بالا به شرح زیر است:
<text>
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0
<text>
در قسمت pattern کد بالا از کاراکتر هایی استفاده شده است که باعث می شود الگوی متن مشخص شود. هرکدام از این کاراکتر ها معنی و مفهوم خاصی دارند که در شکل  زیر هرکدام را نشان می دهیم. اگر با نظریه زبان ها و ماشین ها  اشنا باشید می بینید که این نوشتار ها بسیار شبیه به عبارات منظم در آن مبحث می باشد. 
||http://tosinso.com/files/get/bcc0fee0-07ce-44f0-a4af-9ed117aaabdd||
||http://tosinso.com/files/get/efdbe8a4-68de-4796-8fe1-f9f0a90e227e||
||http://tosinso.com/files/get/d8b50c6d-b40d-4bd8-895f-a5f05346dae0||

!!متدهای مربوط به کلاس Matcher
در ادامه به معرفی متدهای موجود در کلاس Matcher  می پردازیم.

!!متدهای اندیسی
*متد start* این متد اندیس شروع تطبیق الگوی گرفته شده در متن را برمی گرداند. این متد همچنین یک ورودی می گیرد که آن ورودی شماره گروه را مشخص می نماید.
*متد end* این متد آخرین اندیس رشته را که با الگو تطابق دارد به اضافه یک را برمی گرداند. همچنین این متد می تواند یک آرگومان نیز داشته باشد که شماره گروه را می گیرد و اندیس پایانی آن گروه را برمی گرداند برای مثال از متدهای start , end به مثال زیر توجه نمایید در این مثال به شمارش کلمه cat می پردازیم:
<java>
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static final String REGEX = \\bcat\\b;
    private static final String INPUT =
                                    cat cat cat cattie cat;

    public static void main( String args[] ){
       Pattern p = Pattern.compile(REGEX);
       Matcher m = p.matcher(INPUT); // get a matcher object
       int count = 0;

       while(m.find()) {
         count++;
         System.out.println(Match number +count);
         System.out.println(start(): +m.start());
         System.out.println(end(): +m.end());
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22
<text>
در مثال بالا مشاهده می کنید که تعداد کلمات را شناخته و محل شروع و پایان آن ها را نشان می دهد. همانطور که درکد قابل مشاهده است با کلمه cat به شکل سه عدد کاراکتر c , a , t که از هم جدا باشند رفتار نمی شود و به شکل یک واحد یکتا با آن رفتار می شود.

!! متدهای جستجو
*متد lookingAt* این متد مشخص می کند که الگوی مورد نظر در ابتدای متن وجود دارد یا نه که اگر الگوی مورد نظر وجود داشت مقدار true برمی گرداند.
*متد find* این متد نیز کاری مانند متد lookingAt را انجام می دهد با این تفاوت که در صورتی که اگر در متن الگویی تطبیق داشته باشد مقدار start و end به نسبت همان تغییر خواهد کرد و در بار بعدی که این متد فراخوانی می شود الگوی تطبیق شده بعدی در متد start, end  قرار خواهد گرفت.
*متد matches* این متد سعی می کند که کل متن را با کل الگو تطبیق دهد و اگر این کار انجام شد مقدار true برمی گرداند. در ادامه مثالی از متدهای lookingAt و matches آورده شده است که تفاوت این دو را نشان می دهد.
<java>
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static final String REGEX = foo;
    private static final String INPUT = fooooooooooooooooo;
    private static Pattern pattern;
    private static Matcher matcher;

    public static void main( String args[] ){
       pattern = Pattern.compile(REGEX);
       matcher = pattern.matcher(INPUT);

       System.out.println(Current REGEX is: +REGEX);
       System.out.println(Current INPUT is: +INPUT);

       System.out.println(lookingAt(): +matcher.lookingAt());
       System.out.println(matches(): +matcher.matches());
   }
}
<java>
خروجی کد بالا به شکل زیر است:
<text>
Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false
<text>

!!متدهای جایگزینی
*متد appendReplacement* این متد با یک رشته را گرفته و جایگزین محل تطبیق regular expression می کند و مقدار جایگزین شده را به یک شئ StringBuffer اضافه می کند.
*متد appendTail* این متد عمل جایگزینی را انجام نمی دهد بلکه عمل append را از شئ StringBuffer برای متن match شده انجام می دهد. البته از جایی که عمل متد end برمی گرداند به شئ StringBuffer اضافه می کند.
*متد replaceAll* این متد یک رشته به عنوان ورودی می گیرد و هرجایی که الگو تطبیق داشته شده باشد در آن قسمت عمل جایگزینی رشته را انجام می دهد.
*متد replaceFirst* این متد یک رشته را به عنوان ورودی می گیرد و فقط در اولین تطبیق الگو عمل جایگزینی را انجام می دهد.
در کد زیر مثالی از به کاربردن متدهای appendReplacement و appendTail آورده شده است:
<java>
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
   private static String REGEX = a*b;
   private static String INPUT = aabfooaabfooabfoob;
   private static String REPLACE = -;
   public static void main(String[] args) {
      Pattern p = Pattern.compile(REGEX);
      // get a matcher object
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      m.find();
m.appendReplacement(sb,REPLACE);
m.find();
m.appendReplacement(sb,REPLACE);

      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
-foo-fooabfoob
<text>
در ادامه مثالی آورده شده است که کاربرد متدهای replaceFirst, replaceAll را نشان می دهد. این دو متد برای جایگزینی رشته با قسمتی که با الگو تطبیق داده شده است به کار می رود.
<java>
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static String REGEX = dog;
    private static String INPUT = The dog says meow.  +
                                    All dogs say meow.;
    private static String REPLACE = cat;

    public static void main(String[] args) {
       Pattern p = Pattern.compile(REGEX);
       // get a matcher object
       Matcher m = p.matcher(INPUT); 
       INPUT = m.replaceAll(REPLACE);
       System.out.println(INPUT);
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود
<text>
The cat says meow. All cats say meow.
<text>

!!متدهای کلاس PatternSyntaxException
ممکن است هنگامی که از regular expression استفاده می کنیم خطاهای دستوری در الگوهای ما باشد که ما برای آن خطاها فکری نکرده باشیم. تشخیص این خطاها ممکن است کمی سخت باشد. کلاس PatternSyntaxException به ما کمک می کند تا بفهمیم در کدام قسمت از الگو خطا رخ داده است و چه خطایی در آن قسمت رخ داده است. متدهای این کلاس که به ما کمک می کنند عبارتند از: 
# متد getDescription: این متد شرح خطا را برمی گرداند.
# متد getIndex این متد اندیس خطا را نشان می دهد.
# متد getPattern این متد الگویی را که خطا دارد را برمی گرداند.
# متد getMessage این متد یک متن چند خطی را که شامل شرح خطا و اندیس خطا و الگوی خطا دار و یک سری توضیحات دیگر را برمی گرداند.
*Itpro باشید*


نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

معرفی متدهای مربوط به کلاس Matcher

در ادامه به معرفی متدهای موجود در کلاس Matcher می پردازیم.

متدهای اندیسی چه هستند؟

  • متد start این متد اندیس شروع تطبیق الگوی گرفته شده در متن را برمی گرداند. این متد همچنین یک ورودی می گیرد که آن ورودی شماره گروه را مشخص می نماید.
  • متد end این متد آخرین اندیس رشته را که با الگو تطابق دارد به اضافه یک را برمی گرداند. همچنین این متد می تواند یک آرگومان نیز داشته باشد که شماره گروه را می گیرد و اندیس پایانی آن گروه را برمی گرداند برای مثال از متدهای start , end به مثال زیر توجه نمایید در این مثال به شمارش کلمه cat می پردازیم:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static final String REGEX = "\\bcat\\b";
    private static final String INPUT =
                                    "cat cat cat cattie cat";

    public static void main( String args[] ){
       Pattern p = Pattern.compile(REGEX);
       Matcher m = p.matcher(INPUT); // get a matcher object
       int count = 0;

       while(m.find()) {
         count++;
         System.out.println("Match number "+count);
         System.out.println("start(): "+m.start());
         System.out.println("end(): "+m.end());
      }
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22

در مثال بالا مشاهده می کنید که تعداد کلمات را شناخته و محل شروع و پایان آن ها را نشان می دهد. همانطور که درکد قابل مشاهده است با کلمه cat به شکل سه عدد کاراکتر c , a , t که از هم جدا باشند رفتار نمی شود و به شکل یک واحد یکتا با آن رفتار می شود.

متدهای جستجو چه هستند؟

  • متد lookingAt این متد مشخص می کند که الگوی مورد نظر در ابتدای متن وجود دارد یا نه که اگر الگوی مورد نظر وجود داشت مقدار true برمی گرداند.
  • متد find این متد نیز کاری مانند متد lookingAt را انجام می دهد با این تفاوت که در صورتی که اگر در متن الگویی تطبیق داشته باشد مقدار start و end به نسبت همان تغییر خواهد کرد و در بار بعدی که این متد فراخوانی می شود الگوی تطبیق شده بعدی در متد start, end قرار خواهد گرفت.
  • متد matches این متد سعی می کند که کل متن را با کل الگو تطبیق دهد و اگر این کار انجام شد مقدار true برمی گرداند. در ادامه مثالی از متدهای lookingAt و matches آورده شده است که تفاوت این دو را نشان می دهد.
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static final String REGEX = "foo";
    private static final String INPUT = "fooooooooooooooooo";
    private static Pattern pattern;
    private static Matcher matcher;

    public static void main( String args[] ){
       pattern = Pattern.compile(REGEX);
       matcher = pattern.matcher(INPUT);

       System.out.println("Current REGEX is: "+REGEX);
       System.out.println("Current INPUT is: "+INPUT);

       System.out.println("lookingAt(): "+matcher.lookingAt());
       System.out.println("matches(): "+matcher.matches());
   }
}

خروجی کد بالا به شکل زیر است:

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false

بررسی متدهای جایگزینی

  • متد appendReplacement این متد با یک رشته را گرفته و جایگزین محل تطبیق regular expression می کند و مقدار جایگزین شده را به یک شئ StringBuffer اضافه می کند.
  • متد appendTail این متد عمل جایگزینی را انجام نمی دهد بلکه عمل append را از شئ StringBuffer برای متن match شده انجام می دهد. البته از جایی که عمل متد end برمی گرداند به شئ StringBuffer اضافه می کند.
  • متد replaceAll این متد یک رشته به عنوان ورودی می گیرد و هرجایی که الگو تطبیق داشته شده باشد در آن قسمت عمل جایگزینی رشته را انجام می دهد.
  • متد replaceFirst این متد یک رشته را به عنوان ورودی می گیرد و فقط در اولین تطبیق الگو عمل جایگزینی را انجام می دهد.

در کد زیر مثالی از به کاربردن متدهای appendReplacement و appendTail آورده شده است:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
   private static String REGEX = "a*b";
   private static String INPUT = "aabfooaabfooabfoob";
   private static String REPLACE = "-";
   public static void main(String[] args) {
      Pattern p = Pattern.compile(REGEX);
      // get a matcher object
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      m.find();
m.appendReplacement(sb,REPLACE);
m.find();
m.appendReplacement(sb,REPLACE);

      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

-foo-fooabfoob

در ادامه مثالی آورده شده است که کاربرد متدهای replaceFirst, replaceAll را نشان می دهد. این دو متد برای جایگزینی رشته با قسمتی که با الگو تطبیق داده شده است به کار می رود.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static String REGEX = "dog";
    private static String INPUT = "The dog says meow. " +
                                    "All dogs say meow.";
    private static String REPLACE = "cat";

    public static void main(String[] args) {
       Pattern p = Pattern.compile(REGEX);
       // get a matcher object
       Matcher m = p.matcher(INPUT); 
       INPUT = m.replaceAll(REPLACE);
       System.out.println(INPUT);
   }
}

خروجی کد بالا به شکل زیر خواهد بود

The cat says meow. All cats say meow.

بررسی کاربرد متدهای کلاس PatternSyntaxException

ممکن است هنگامی که از regular expression استفاده می کنیم خطاهای دستوری در الگوهای ما باشد که ما برای آن خطاها فکری نکرده باشیم. تشخیص این خطاها ممکن است کمی سخت باشد. کلاس PatternSyntaxException به ما کمک می کند تا بفهمیم در کدام قسمت از الگو خطا رخ داده است و چه خطایی در آن قسمت رخ داده است. متدهای این کلاس که به ما کمک می کنند عبارتند از:

  1. متد getDescription: این متد شرح خطا را برمی گرداند.
  2. متد getIndex این متد اندیس خطا را نشان می دهد.
  3. متد getPattern این متد الگویی را که خطا دارد را برمی گرداند.
  4. متد getMessage این متد یک متن چند خطی را که شامل شرح خطا و اندیس خطا و الگوی خطا دار و یک سری توضیحات دیگر را برمی گرداند.

تعریف و استفاده از متدها قسمت یک

در ادامه مباحث جاوا به یکی از مهمترین بخش های برنامه نویسی جاوا می رسیم. اگر شما بخواهید هر برنامه ای بنویسید مجبور هستید از متدها استفاده کنید. برای مثال وقتی که برنامه ای شروع می کنید دستورات خود را در داخل متدی به نام main می نویسید و برای چاپ اطلاعات خود در صفحه نمایش از متد دیگری به نام println استفاده می کنید.

در این مطلب قصد داریم که نحوه تعریف متد ها و انواع آنها و نحوه استفاده از آنها را شرح دهیم. متدها در جاوا مجموعه دستورالعمل هایی هستند که برای اجرای یک عملیات خاص در یک گروه کنار هم نوشته شده اند. برای مثال وقتی که ما متد System.out.println() را فراخوانی می کنیم در واقع چندین دستور اجرا می شود تا یک پیام در صفحه نمایش نشان داده شود. در این مطلب نشان خواهیم داد که چگونه می توان یک متد ساخت که یک مقدار برگرداند و یا هیچ مقداری برنگرداند یا آرگومان ورودی داشته باشد یا نداشته باشد.

آموزش ساخت متد در جاوا

شکل کلی ساخت یک متد مانند کد زیر است که در ادامه هرکدام از بخش های آن را توضیح خواهیم داد:

public static int methodName(int a, int b) {
  // body
}

در کد بالا کلمه های public , static دو modifier هستند که modifier ها را در معرفی Modifierها در جاوا توضیح دادیم. سپس نوع داده int آورده شده است. این نوع داده مشخص می کند که نوع داده بازگشتی متد از چه نوعی می باشد. methodName نام متد می باشد که این نام متد از قواعد نامگذاری متغیر ها که قبلا توضیح داده شد پیروی می کند.

a,b پارامترهای ورودی هستند که باید هنگام تعریف متد مشخص کنیم از چه نوعی هستند. دقت داشته باشید که این متد دارای دو عدد پارامتر ورودی از نوع int می باشد که متدها می توانند هیچ یا چند پارامتر ورودی داشته باشند و نوع آنها می تواند از انواع مختلف داده باشد.

کلیه دستورات مربوط به متد می توانند داخل method body نوشته می شوند. برای درک مطالبی که گفته شد مثالی در زیر آورده شده است که یک تابع را تعریف کرده ایم که دارای 2 ورودی است که کوچکترین مقدار بین این دو ورودی را پیدا کرده و برمی گرداند.

public static int minFunction(int n1, int n2) {
   int min;
   if (n1 > n2)
      min = n2;
   else
      min = n1;

   return min; 
}

با عبارت return ما مقدار بازگشتی را اعلام می کنیم و وقتی اجرای برنامه به این قسمت رسید از متد خارجی می شود.

آموزش فراخوانی متدها در جاوا

برای این که از یک متد استفاده کنیم باید آن را فراخوانی کنیم یا به عبارت دیگر آن را صدا بزنیم. دو راه برای فراخوانی یک متد وجود دارد. زمانی که متد یک مقدار را برمی گرداند و زمانی که متد هیچ مقداری را برنمی گرداند. فرایند فراخوانی متدها آسان است .

زمانی که یک برنامه یک متد را فراخوانی می کند کنترل اجرای برنامه به ابتدای متد فراخوانی شده می رود و آن را اجرا می کند تا زمانی که کنترل اجرا به یکی از حالت های زیر برسد. به خطی برسد که عبارت return دارد یا به علامت { که نشان دهنده اتمام متد است برسد به عبارت دیگر بلوک متد تمام شود.

پس از اجرای متد کنترل برنامه به خطی که متد را فراخوانی کرده بود باز می گردد. برای این که متدی هیچ مقدار بازگشتی نداشته باشد نوع آن را هنگام تعریف متد از نوع void انتخاب می کنیم. در متدهایی که هیچ مقداری برنمی گردانند می توان return نگذاشت. همچنین اگر از return استفاده کنیم در جلوی آن چیزی نمی نویسیم. برای مثال کد زیر هیچ مقداری را برنمی گرداند.

System.out.println("This is tosinso.com!");

متدی که مقداری را برمی گرداند می تواند به شکل زیر باشد:

int result = sum(6, 9);

در مثال زیر کدی آورده شده است که نحوه تعریف متد و نحوه استفاده از آن را نشان می دهد.

public class ExampleMinNumber{
   
   public static void main(String[] args) {
      int a = 11;
      int b = 6;
      int c = minFunction(a, b);
      System.out.println("Minimum Value = " + c);
   }

   /** returns the minimum of two numbers */
   public static int minFunction(int n1, int n2) {
      int min;
      if (n1 > n2)
         min = n2;
      else
         min = n1;

      return min; 
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

inimum value = 6

در مثال زیر نحوه رفتار با متد های void را نشان می دهیم. دقت داشته باشید که در متدهای از نوع void متد را به تنهایی در یک خط می نویسیم.

ublic class ExampleVoid {

   public static void main(String[] args) {
      methodRankPoints(255.7);
   }

   public static void methodRankPoints(double points) {
      if (points >= 202.5) {
         System.out.println("Rank:A1");
      }
      else if (points >= 122.4) {
         System.out.println("Rank:A2");
      }
      else {
         System.out.println("Rank:A3");
      }
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

Rank:A1

آموزش ارسال پارامتر با مقدار

پارامترهایی که هنگام فراخوانی به متد داده می شوند باید به همان ترتیبی باشند که در تعریف متد آورده شده اند و همچنین نوع آنها نیز باید به همان شکل باشد. وقتی که یک پارامتر به متد ارسال می شود دوحالت عمده ممکن است پیش بیاید.

  1. هر تغییری که در بدنه متد بر روی پارامتر انجام می دهیم در خارج از متد نیز آن تغییرات اعمال شوند
  2. هر تغییر که در بدنه متد برروی پارامترها انجام می دهیم در خارج از متد آن تغییرات بی تاثیر می باشند.

در حالت اول به این معنی است که ما تغیرات را روی همان متغیر اولیه اعمال کنیم. ولی در حالت دوم مانند این است که مقدار متغیر در پارامتر تابع کپی شود و خود مقدار متغیر اصلی بدون تغییر باقی بماند. به نوع اول ارسال پارامتر با ارجاع یا pass by reference و به نوع دوم ارسال پارامتر با مقدار یا pass by value گفته می شود. در کد زیر یک مثال از pass by value را نشان داده ایم:

public class swappingExample {

   public static void main(String[] args) {
      int a = 30;
      int b = 45;

      System.out.println("Before swapping, a = " +
                          a + " and b = " + b);

      // Invoke the swap method
      swapFunction(a, b);
      System.out.println("\n**Now, Before and After swapping values will be same here**:");
      System.out.println("After swapping, a = " +
                         a + " and b is " + b);
   }

   public static void swapFunction(int a, int b) {
   
      System.out.println("Before swapping(Inside), a = " + a
                           + " b = " + b);
      // Swap n1 with n2
      int c = a;
      a = b;
      b = c;

      System.out.println("After swapping(Inside), a = " + a
                           + " b = " + b);
   }
}

خروجی کد بالا به شرح زیر خواهد بود:

Before swapping, a = 30 and b = 45
Before swapping(Inside), a = 30 b = 45
After swapping(Inside), a = 45 b = 30

**Now, Before and After swapping values will be same here**:
After swapping, a = 30 and b is 45

دقت داشته باشید که اشیا در جاوا به صورت pass by reference ارسال می شوند ولی انواع اولیه به صورت pass by value ارسال خواهند شد.

آموزش overload کردن متدها

در زبان جاوا بسیار پیش می آید که یک کلاس دارای چند متد با یک نام یکسان می باشد که این متد ها هرکدام یا از نظر نوع خروجی یا از نظر تعداد پارامتر های ورودی یا از نظر نوع پارامتر های ورودی با یکدیگر تفاوت دارند. ولی نام آنها یکسان است.

تعریف دو متد با نام یکسان و نوع خروجی و متغیر های یکسان باعث خطا می شود. به این گونه تعریف متد ها با نام یکسان ولی پارامترها یا نوع بازگشتی متفاوت overload کردن متدها یا method overloading گفته می شود. در زیر یک مثالی از این عمل آورده شده است که به دست آوردن کوچکترین عدد در دو نوع عدد صحیح و اعشاری می باشد.

public class ExampleOverloading{

   public static void main(String[] args) {
      int a = 11;
      int b = 6;
      double c = 7.3;
      double d = 9.4;
      int result1 = minFunction(a, b);
      // same function name with different parameters
      double result2 = minFunction(c, d);
      System.out.println("Minimum Value = " + result1);
      System.out.println("Minimum Value = " + result2);
   }

  // for integer
   public static int minFunction(int n1, int n2) {
      int min;
      if (n1 > n2)
         min = n2;
      else
         min = n1;

      return min; 
   }
   // for double
   public static double minFunction(double n1, double n2) {
     double min;
      if (n1 > n2)
         min = n2;
      else
         min = n1;

      return min; 
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

Minimum Value= 6
Minimum Value= 7.3

همانگونه که دیده می شود دو عدد متد به نام minFuction وجود دارد.

تعریف و استفاده از متدها قسمت دو

در ادامه مطالب متدها در جاوا مباحثی را مطرح کردیم و در این مطلب قصد داریم به ادامه مطالب در مورد متدها در جاوا می پردازیم.

آموزش استفاده از آرگومان های خط فرمان

خط فرمان یکی از امکاناتی است که تقریبا همه ی سیستم عامل ها آن را دارا می باشند. توسط این محیط کاربر دستوراتی را برای سیستم عامل می نویسد و سیستم عامل آن دستورات را اجرا کرده و پاسخ مناسب را به کاربر می دهد. خط فرمان در ویندوز command prompt نام دارد.

اگر شما با این محیط کار کرده باشید می بینید که در این محیط دستوراتی وجود دارد که هرکدام از این دستورات دارای پارامترهای ورودی هستند برای مثال دستور کپی کردن فایل دارای دو پارامتر ورودی و چندین سوییچ است. که یک مثال آن در کد زیر آورده شده است:

Copy d:\file1.txt f:\itpro\file.txt

در این دستور ما آدرس فایل منبع و مقصد را می دهیم و فایل را از آدرس منبع به آدرس مقصد کپی می کند. همانطور که می بینید دستور کپی در کد بالا دو پارامتر ورودی دارد. حال برای این که به این پارامتر ها در برنامه ی جاوا دسترسی داشته باشیم باید به متد main پارامتر ورودی بدهیم.

همان طور که قبلا هم در نمونه برنامه های مطالب قبلی نشان داده ایم متد main یک پارامتر ورودی از نوع آرایه String می باشد. حال پارامترهایی که در خط فرمان می آیند به ترتیب ورود در این آرایه قرار می گیرند و می توان از آنها استفاده کرد. برای مثال به کد زیر توجه کنید. این برنامه همه پارامترهای ورودی را با اندیس آن نشان می دهد.

public class CommandLine {

   public static void main(String args[]){ 
      for(int i=0; i<args.length; i++){
         System.out.println("args[" + i + "]: " +
                                           args[i]);
      }
   }
}

حال برای این که بتوانید این برنامه را تحت خط فرمان اجرا کنید آن را با استفاده از ابزار های گفته شده مانند IntelliJ idea کامپایل می کنیم تا فایل های .class ساخته شوند. سپس برای اجرای این برنامه کد زیر را در خط فرمان command prompt می نویسیم:

java CommandLine this is a command line 200 -100

خروجی که در خط فرمان مشاهده خواهیم کرد به شکل زیر خواهد بود:

args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100

بررسی مفهوم Constructor ها

همانگونه که قبلا هم گفته شد constructorها برای مقداردهی اولیه به فیلدهای اشیا به کار می روند و نامشان با نام کلاس یکی است و در شکل نوشتاری شبیه به متد است. اما constructorها هیچ مقدار بازگشتی ندارند. اما شما می توانید همه ی کار های آغازین شئ را در داخل constructor انجام دهید.

همه ی کلاس ها دارای constructor هستند چه برای یک کلاس constructor تعریف کنیم و چه تعریف نکنیم. زیرا که جاوا برای هر شئ یک constructor بدون ورودی در نظر می گیرد. برای مثال از constructor به کد زیر توجه کنید:

// A simple constructor.
class MyClass {
   int x;
   
   // Following is the constructor
   MyClass() {
      x = 10;
   }
}

ما می توانیم همچنین به constructor ها ورودی بدهیم که می توان روی ورودی عمل خاصی انجام شود و یا در مقداردهی اولیه تاثیر داشته باشد. برای مثال در تعریف کلاس می توان constructor را به شکل زیر تعریف کرد:

// A simple constructor.
class MyClass {
   int x;
   
   // Following is the constructor
   MyClass(int i ) {
      x = i;
   }
}

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

public class ConsDemo {

   public static void main(String args[]) {
      MyClass t1 = new MyClass( 10 );
      MyClass t2 = new MyClass( 20 );
      System.out.println(t1.x + " " + t2.x);
   }
}

که خروجی کد بالا به شکل زیر خواهد بود:

10 20

آموزش استفاده از کلمه کلیدی this

کلمه کلیدی this کلمه ای است که در داخل یک متد به همان شئی که متد در داخل آن است اشاره می کند. با استفاده از این کلمه کلیدی می توانید با متدها و فیلدهای کلاس جاری کار کنید و به آن ها دسترسی داشته باشید. دقت داشته باشید که کلمه کلیدی this فقط در داخل constructor ها و متدهای استاتیک کاربرد دارد. دو مثال از کلمه کلیدی this در ادامه آورده شده است:

class Student{

   int age;   
   Student(int age){
   this.age=age;	
   }

}

در کد بالا کلمه کلیدی this برای مقدار دهی به فیلدهای موجود در شئ به کار گرفته می شود. همچنین می توان برای فراخوانی یک constructor از داخل یک constructor دیگر نیز این کلمه کلیدی را می توان استفاده کرد. مانند مثال زیر

class Student{

   int age
   Student(){
   this(20);
   }
   
   Student(int age){
   this.age=age;	
   }

}

همچنین در ادامه مثالی آورده شده است که از کلمه کلیدی this برای دستیابی به اعضای کلاس مورد استفاده قرار می گیرد.

public class This_Example {
	
   //Instance variable num
   int num=10;
	
   This_Example(){
      System.out.println("This is an example program on keyword this ");	
   }

   This_Example(int num){
      //Invoking the default constructor
      this();
      
      //Assigning the local variable num to the instance variable num
      this.num=num;	   
   }
   
   public void greet(){
      System.out.println("Hi Welcome to Itpro.ir");
   }
      
   public void print(){
      //Local variable num
      int num=20;
      
      //Printing the instance variable
      System.out.println("value of local variable num is : "+num);
      
      //Printing the local variable
      System.out.println("value of instance variable num is : "+this.num);
      
      //Invoking the greet method of a class
      this.greet();     
   }
   
   public static void main(String[] args){
      //Instantiating the class
      This_Example obj1=new This_Example();
      
      //Invoking the print method
      obj1.print();
	  
      //Passing a new value to the num variable through parametrized constructor
      This_Example obj2=new This_Example(30);
      
      //Invoking the print method again
      obj2.print(); 
   }

}

اگر کد بالا را احرا کنیم نتیجه ای که در بر خواهد داشت به شکل زیر خواهد بود:

This is an example program on keyword this 
value of local variable num is : 20
value of instance variable num is : 10
Hi Welcome to Itpro.ir
This is an example program on keyword this 
value of local variable num is : 20
value of instance variable num is : 30
Hi Welcome to Itpro.ir

بررسی مفهوم آرگومان های متغیر ( Variable Arguments )

از نسخه jdk 1.5 شما می توانید برای ورودی متدها پارامترهایی از یک نوع تعریف کنید به شکلی که هر تعداد ورودی از یک نوع می توانید به تابع بدهید. این نوع ورودی ها آرگومان های متغیر نام دارد که به شکل زیر تعریف می شود.

typeName... parameterName

برای استفاده از این نوع آرگومان شما ورودی را با معرفی نوع و سپس سه نقطه و سپس نام آرگومان ها معرفی می کنیم و در داخل متد یک حلقه تعریف می کنیم و از متد ورودی به شکل آرایه استفاده می کنیم. برای مثالی از این نوع ورودی به مثال زیر دقت کنید:

public class VarargsDemo {

   public static void main(String args[]) {
      // Call method with variable args  
	  printMax(34, 3, 3, 2, 56.5);
      printMax(new double[]{1, 2, 3});
   }

   public static void printMax( double... numbers) {
   if (numbers.length == 0) {
      System.out.println("No argument passed");
      return;
   }

   double result = numbers[0];

   for (int i = 1; i <  numbers.length; i++)
      if (numbers[i] >  result)
      result = numbers[i];
      System.out.println("The max value is " + result);
   }
}

خروجی کد بالا به شکل زیر خواهد بود

The max value is 56.5
The max value is 3.0

 معرفی کاربرد متد finalize

این امکان در جاوا وجود دارد که هنگامی که یک شئ در حال از بین رفتن است یک عمل خاصی انجام شود. به این معنی که قبل از این که شئ از داخل حافظه پاک شود عمل خاصی مانند بستن فایل ها و یا ارتباطات دیتابیس بسته شود و سپس شئ از داخل حافظه دور ریخته شود. جاوا این عمل را با استفاده از متد finalize انجام می دهد. به صورتی که همه ی اعمالی که باید انجام شود را داخل متد finalize می نویسیم. شکل کلی متد finalize باید به شکل زیر باشد.

protected void finalize( )
{
   // finalization code here
}

دقت داشته باشید که modifier که در این متد به کار گرفته شده است protected است. دلیل این کار این است که کسی نتواند از خارج از شئ به این متد دسترسی داشته باشد و نتواند آن را صدا بزند.

کار با استریم ها و فایل ها

در ادامه مباحث آموزش جاوا در این مطلب بررسی I/O و فایل ها در جاوا می پردازیم و کار با فایل ها در جاوا را مورد بررسی قرار خواهیم داد. زبان جاوا همه کلاس هایی را که برای کار با فایل ها فراهم کرده است را در داخل یک پکیج به نام java.io قرار داده است. استریم ها در جاوا دارای دو بخش منبع ورودی و مقصد خروجی می باشد. استریم ها در پکیج java.io از داده های مختلفی مانند انواع داده های اولیه و اشیاء و کاراکترهای محلی پشتیبانی می کنند.

بررسی مفهوم Stream استریم ها

یک استریم می تواند به عنوان یک دنباله از داده ها تعریف شود. ما در جاوا دو نوع استریم داریم که به شرح زیر هستند

  1. استریم ورودی (InPutStream) این نوع استریم برای خواندن داده ها از منبع ورودی به کار می رود.
  2. استریم خروجی(OutPutStream) این استریم برای نوشتن داده ها در مقصد خروجی به کار می رود.
با سلام و عرض تبریک عید نوروز به همه دوستان و همراهان Itpro. در ادامه مباحث آموزش جاوا در این مطلب بررسی I/O و فایل ها در جاوا می پردازیم و کار با فایل ها در جاوا را مورد بررسی قرار خواهیم داد. زبان جاوا همه کلاس هایی را که برای کار با فایل ها فراهم کرده است را در داخل یک پکیج به نام java.io قرار داده است. استریم ها در جاوا دارای دو بخش منبع ورودی و مقصد خروجی می باشد. استریم ها در پکیج java.io از داده های مختلفی مانند انواع داده های اولیه و اشیاء و کاراکترهای محلی پشتیبانی می کنند.

!!Stream استریم ها
یک استریم می تواند به عنوان یک دنباله از داده ها تعریف شود. ما در جاوا دو نوع استریم داریم که به شرح زیر هستند
# استریم ورودی (InPutStream) این نوع استریم برای خواندن داده ها از منبع ورودی به کار می رود.
# استریم خروجی(OutPutStream) این استریم برای نوشتن داده ها در مقصد خروجی به کار می رود.
||http://tosinso.com/files/get/6a727604-7524-4289-b6b5-26881d5050ef||
زبان جاوا برای کار با فایل ها و شبکه بسیار قوی و انعطاف پذیر است و ما در این مطلب فقط اصول و پایه کاربردهای زبان جاوا را بررسی می کنیم.

!!استریم های بایتی Byte Streams
استریم های بایتی جاوا برای ورودی و خروجی داده های 8 بیتی مورد استفاده قرار می گیرد. با این که تعداد کلاس های زیاد هستند که با این نوع استریم ها کار می کنند ولی پرکاربرد ترین کلاس ها برای این نوع استریم ها FileInputStream و FileOutputStream می باشد.  برنامه زیر یک مثال از این دو کلاس است که نحوه استفاده از این کلاس ها را نشان می دهد. در برنامه زیر داده ها از فایل ورودی به فایل خروجی کپی می شوند.
<java>
import java.io.*;

public class CopyFile {
   public static void main(String args[]) throws IOException
   {
      FileInputStream in = null;
      FileOutputStream out = null;

      try {
         in = new FileInputStream(d:\\input.txt);
         out = new FileOutputStream(d:\\output.txt);
         
         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
This is test for copy file.
<text>

!!استریم های کاراکتری Character Streams
همان گونه که گفتیم استریم های بایتی برای خواندن و نوشتن داده های بایتی با تعداد 8 بیت مورد استفاده قرار می گرفتند ولی استریم های کاراکتری برای خواندن و نوشتن داده هایی که تعداد 16 بیت طول دارند انجام می شود. کلاس هایی که برای کار با این نوع داده ها بسیار مورد استفاده قرار می گیرد کلاس های FileReader, FileWriter هستند. کلاس FileReader به شکل داخلی از کلاس FileInputStream استفاده می کند و کلاس FileWriter نیز به طور داخلی از کلاس FileOutputStream استفاده می کند ولی یک تفاوت عمده بین این دو دسته کلاس وجود دارد و آن هم این است که کلاس های استریم کاراکتری در واحد زمان با دو کاراکتر کار می کنند یعنی FileReader در واحد زمان دو بایت می خواند و FileWriter در واحد زمان 2 بایت در خروجی می نویسد. در قطعه کد زیر مثال بالا با استفاده از دو کلاس گفته باز نویسی شده است که فایل ورودی را در فایل خروجی کپی می کند. 
<java>
import java.io.*;

public class CopyFile {
   public static void main(String args[]) throws IOException
   {
      FileReader in = null;
      FileWriter out = null;

      try {
         in = new FileReader(d:\\input.txt);
         out = new FileWriter(d:\\output.txt);
         
         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}
<java>
حال اگر در مسیر گفته شده فایل input.txt موجود باشد محتویات آن در فایل output.txt ریخته می شود.

!!استریم های استاندارد Standard Stream
همه ی زبان های برنامه نویسی از IO استاندارد پشتیبانی می کنند. IO استاندارد به این معنی است که بتوان کلید ها و کاراکترهای وارد شده از کیبورد را خواند و کاراکترهایی را که لازم داریم در صفحه نمایش نشان دهیم. اگر شما با زبان c یا C++ کار کرده باشید باید با STDIN, STDOUT, STDERR آشنا باشید. در جاوا نیز برای کار با کیبورد و صفحه نمایش استریم های استاندارد زیر وجود دارد.
* *ورودی استاندارد*: ورودی استاندارد برای خواندن داده ها برای برنامه کاربر به کار می رود که معمولا از کیبورد ورودی میگیرد و نحوه استفاده از آن با System.in شروع می شود.
* *خروجی استاندارد*: خروجی استاندارد برای خروج داده های تولید شده توسط برنامه کاربر به کار می رود و معمولا داده های تولید شده را در صفحه نمایش نشان می دهد و استفاده از آن با System.out شروع می شود.
* *خطای استاندارد*: اگر بخواهیم پیام خطا را در صفحه نمایش نشان دهیم از این استریم استفاده می کنیم که کلاس آن System.err است. 
در ادامه یک برنامه ساده آورده شده است که با استفاده از InputStreamReader داده های استاندارد را از کیبورد می خواند و تا وقتی که کاربر حرف q را وارد نکرده ادامه می یابد. این برنامه نحوه استفاده از استریم های استاندارد را نمایش می دهد.
<java>
import java.io.*;

public class ReadConsole {
   public static void main(String args[]) throws IOException
   {
      InputStreamReader cin = null;

      try {
         cin = new InputStreamReader(System.in);
         System.out.println(Enter characters, 'q' to quit.);
         char c;
         do {
            c = (char) cin.read();
            System.out.print(c);
         } while(c != 'q');
      }finally {
         if (cin != null) {
            cin.close();
         }
      }
   }
}
<java>
حال اگر برنامه بالا را اجرا کنیم خروجی برنامه شبیه به خطوط زیر خواهد بود:
<text>
Enter characters, 'q' to quit.
1
1
e
e
q
q
<text>

!!کاربا فایل ها
همانطور که گفتیم یک استریم دنباله ای از داده ها است و گفتیم که InputStream برای خواندن داده ها از منبع و OutputStream برای نوشتن داده ها در مقصد به کار می رود. در شکل زیر سلسله مراتب کلاس هایی که با استریم ها کار می کنند آورده شده است.
||http://tosinso.com/files/get/9616f8ee-25d0-4af7-a62b-3fe3413a6a0a||
در این مطلب دو استریم مهم را بررسی می کنیم که آنها FileInputStream و FileOutputStream خواهد بود. 

!!FileInputStream
این استریم برای خواندن داده ها از فایل ها استفاده می شود. اشیای این استریم می توانند با استفاده از کلمه کلیدی new ساخته شودن و دارای constructor های متنوعی هستند برای مثال constructor زیر مسیر فایل را به صورت متنی دریافت می کند و یک شئ استریم می سازد. تا بتواند فایل را بخواند.
<java>
InputStream f = new FileInputStream(C:/java/hello);
<java>
در constructor زیر ابتدا یک شئ فایل می سازیم و سپس برای فایل ساخته شده یک استریم می سازیم تا بتوانیم آن را بخوانیم. برای ساخت شئ فایل از کلاس File استفاده می کنیم و باید هنگام ساخت شئ فایل مسیر فایل را به آن بدهیم.
<java>
File f = new File(C:/java/hello);
InputStream f = new FileInputStream(f);
<java>
وقتی که یک شئ استریم InputStream داریم لیستی از متدهای helper وجود دارد که می توانیم با استفاده از آنها استریم ها را بخوانیم و یا اعمال دیگری را روی استریم ها انجام دهیم. لیست این متد ها را در ادامه آورده ایم.
# متد close: این متد استریم خروجی فایل را می بندد و همه منابعی که سیستم برای آن فایل گرفته بود را آزاد می کند. این متد ممکن است که یک خطای IOException تولید کند که باید توسط کاربر در نظر گرفته شود. این متد هیچ ورودی نداشته و چیزی برنمی گرداند.
# متد finalize: این متد همه ی اتصالات به فایل را حذف می کند و مطمئن می شود که متد close این استریم فراخوانی شده است. این متد نیز ممکن است که خطای IOException تولید کند. این متد هیچ ورودی نداشته و چیزی برنمی گرداند. همانطور که در قسمت متدها گفته شده این متد برای از بین بردن اشیا استفاده می شود.
# متد read این متد یک مقدار ورودی می گیرد که این ورودی می تواند یک مقدار عددی باشد و این به این معنی است که بایتی را که شماره آن را داده ایم می خواند و بایت بعدی را برمی گرداند و اگر به انتهای فایل رسیده باشیم مقدار -1 را برمی گرداند. این متد نیز ممکن است خطای IOException تولید کند
# متد available این متد یک مقدار عددی برمی گرداند و عدد بازگردانده شده به تعداد بایت هایی است که می توان از این فایل خواند.
استریم های مهم دیگری هم برای ورود اطلاعات وجود دارد که آنها را بعدا توضیح خواهیم داد. که این استریم ها عبارتند از: ByteArrayInputStream و DataInputStream

!!FileOutpuStream
این استریم برای ساخت یک فایل و نوشتن اطلاعات در درون آن به کار می رود. اگر ما قصد نوشتن اطلاعات در فایلی را داشته باشیم ولی فایل مقصد وجود نداشته باشد این استریم می تواند فایل را بسازد و اطلاعات را درون فایل بنویسد. در ادامه یک شئ از این استریم ساخته ایم که در constructor خود یک آدرس فایل می گیرد و شئ استریم را می سازد تا بتوان داده ها را در آن نوشت.
<java>
OutputStream f = new FileOutputStream(C:/java/hello)
<java>
در مثال زیر ابتدا یک شئ فایل ساخته ایم و از شئ فایل ساخته شده یک استریم برای نوشتن ساخته شده است.
<java>
File f = new File(C:/java/hello);
OutputStream f = new FileOutputStream(f);

<java>
شئی که از استریم خروجی فایل ساخته شده است متدهای متفاوتی دارد که می توان از آن برای اعمال مختلف استفاده کرد که در ادامه به توضیح چند عدد از آنها پرداخته ایم:
#متد close این متد استریم خروجی را می بندد و همه منابع را از آن پس می گیرد. این متد مانند متد استریم ورودی ممکن است خطای IOException تولید کند. همچنین این استریم متدی با نام finalize دارد که آن را قبلا توضیح دادیم.
#متد write این متد یک ورودی عددی دارد که بایت ورودی را در داخل استریم می نویسد. این متد نیز ممکن است که خطای IOException تولید کند. همچنین این متد ممکن است که یک ورودی آرایه ای از نوع byte داشته باشد که در این صورت خانه های آرایه را در داخل استریم خروجی می نویسد.
البته استریم های دیگری برای خروجی نیز وجود دارد که بعدا به توضیح آنها خواهیم پرداخت. برنامه زیر یک مثال از استریم های ورودی و خروجی می باشد که برای درک بهتر این استریم ها کمک می کند. در این برنامه یک آرایه از نوع byte می سازیم و آن را در فایل test.txt می نویسیم و سپس از آن می خوانیم و در صفحه نمایش آن را نشان می دهیم.
<java>
import java.io.*;

public class fileStreamTest{

   public static void main(String args[]){
   
   try{
      byte bWrite [] = { 75,106,3,48,95 };
      OutputStream os = new FileOutputStream(test.txt);
      for(int x=0; x < bWrite.length ; x++){
         os.write( bWrite[x] ); // writes the bytes
      }
      os.close();
     
      InputStream is = new FileInputStream(test.txt);
      int size = is.available();

      for(int i=0; i< size; i++){
         System.out.print((char)is.read() +   );
      }
      is.close();
   }catch(IOException e){
      System.out.print(Exception);
   }	
   }
}

<java>
خروجی این برنامه به شکل زیر خواهد بود
<text>
K  j     0  _  
<text>
دقت داشته باشید که مقادیری که نوشته می شوند تبدیل به کاراکتر شده و نوشته می شوند. برای همین شما باید کد اسکی کاراکتر را بنویسید.

*Itpro باشید*


نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

زبان جاوا برای کار با فایل ها و شبکه بسیار قوی و انعطاف پذیر است و ما در این مطلب فقط اصول و پایه کاربردهای زبان جاوا را بررسی می کنیم.

آموزش استفاده از استریم های بایتی Byte Streams

استریم های بایتی جاوا برای ورودی و خروجی داده های 8 بیتی مورد استفاده قرار می گیرد. با این که تعداد کلاس های زیاد هستند که با این نوع استریم ها کار می کنند ولی پرکاربرد ترین کلاس ها برای این نوع استریم ها FileInputStream و FileOutputStream می باشد. برنامه زیر یک مثال از این دو کلاس است که نحوه استفاده از این کلاس ها را نشان می دهد. در برنامه زیر داده ها از فایل ورودی به فایل خروجی کپی می شوند.

import java.io.*;

public class CopyFile {
   public static void main(String args[]) throws IOException
   {
      FileInputStream in = null;
      FileOutputStream out = null;

      try {
         in = new FileInputStream("d:\\input.txt");
         out = new FileOutputStream("d:\\output.txt");
         
         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

This is test for copy file.

آموزش استفاده از استریم های کاراکتری Character Streams

همان گونه که گفتیم استریم های بایتی برای خواندن و نوشتن داده های بایتی با تعداد 8 بیت مورد استفاده قرار می گرفتند ولی استریم های کاراکتری برای خواندن و نوشتن داده هایی که تعداد 16 بیت طول دارند انجام می شود. کلاس هایی که برای کار با این نوع داده ها بسیار مورد استفاده قرار می گیرد کلاس های FileReader, FileWriter هستند.

کلاس FileReader به شکل داخلی از کلاس FileInputStream استفاده می کند و کلاس FileWriter نیز به طور داخلی از کلاس FileOutputStream استفاده می کند ولی یک تفاوت عمده بین این دو دسته کلاس وجود دارد و آن هم این است که کلاس های استریم کاراکتری در واحد زمان با دو کاراکتر کار می کنند یعنی FileReader در واحد زمان دو بایت می خواند و FileWriter در واحد زمان 2 بایت در خروجی می نویسد. در قطعه کد زیر مثال بالا با استفاده از دو کلاس گفته باز نویسی شده است که فایل ورودی را در فایل خروجی کپی می کند.

import java.io.*;

public class CopyFile {
   public static void main(String args[]) throws IOException
   {
      FileReader in = null;
      FileWriter out = null;

      try {
         in = new FileReader("d:\\input.txt");
         out = new FileWriter("d:\\output.txt");
         
         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}

حال اگر در مسیر گفته شده فایل input.txt موجود باشد محتویات آن در فایل output.txt ریخته می شود.

آموزش استفاده از استریم های استاندارد Standard Stream

همه ی زبان های برنامه نویسی از IO استاندارد پشتیبانی می کنند. IO استاندارد به این معنی است که بتوان کلید ها و کاراکترهای وارد شده از کیبورد را خواند و کاراکترهایی را که لازم داریم در صفحه نمایش نشان دهیم. اگر شما با زبان c یا C++ کار کرده باشید باید با STDIN, STDOUT, STDERR آشنا باشید. در جاوا نیز برای کار با کیبورد و صفحه نمایش استریم های استاندارد زیر وجود دارد.

  • ورودی استاندارد: ورودی استاندارد برای خواندن داده ها برای برنامه کاربر به کار می رود که معمولا از کیبورد ورودی میگیرد و نحوه استفاده از آن با System.in شروع می شود.
  • خروجی استاندارد: خروجی استاندارد برای خروج داده های تولید شده توسط برنامه کاربر به کار می رود و معمولا داده های تولید شده را در صفحه نمایش نشان می دهد و استفاده از آن با System.out شروع می شود.
  • خطای استاندارد: اگر بخواهیم پیام خطا را در صفحه نمایش نشان دهیم از این استریم استفاده می کنیم که کلاس آن System.err است.

در ادامه یک برنامه ساده آورده شده است که با استفاده از InputStreamReader داده های استاندارد را از کیبورد می خواند و تا وقتی که کاربر حرف q را وارد نکرده ادامه می یابد. این برنامه نحوه استفاده از استریم های استاندارد را نمایش می دهد.

import java.io.*;

public class ReadConsole {
   public static void main(String args[]) throws IOException
   {
      InputStreamReader cin = null;

      try {
         cin = new InputStreamReader(System.in);
         System.out.println("Enter characters, 'q' to quit.");
         char c;
         do {
            c = (char) cin.read();
            System.out.print(c);
         } while(c != 'q');
      }finally {
         if (cin != null) {
            cin.close();
         }
      }
   }
}

حال اگر برنامه بالا را اجرا کنیم خروجی برنامه شبیه به خطوط زیر خواهد بود:

Enter characters, 'q' to quit.
1
1
e
e
q
q

آموزش کار با فایل ها در جاوا

همانطور که گفتیم یک استریم دنباله ای از داده ها است و گفتیم که InputStream برای خواندن داده ها از منبع و OutputStream برای نوشتن داده ها در مقصد به کار می رود. در شکل زیر سلسله مراتب کلاس هایی که با استریم ها کار می کنند آورده شده است.

با سلام و عرض تبریک عید نوروز به همه دوستان و همراهان Itpro. در ادامه مباحث آموزش جاوا در این مطلب بررسی I/O و فایل ها در جاوا می پردازیم و کار با فایل ها در جاوا را مورد بررسی قرار خواهیم داد. زبان جاوا همه کلاس هایی را که برای کار با فایل ها فراهم کرده است را در داخل یک پکیج به نام java.io قرار داده است. استریم ها در جاوا دارای دو بخش منبع ورودی و مقصد خروجی می باشد. استریم ها در پکیج java.io از داده های مختلفی مانند انواع داده های اولیه و اشیاء و کاراکترهای محلی پشتیبانی می کنند.

!!Stream استریم ها
یک استریم می تواند به عنوان یک دنباله از داده ها تعریف شود. ما در جاوا دو نوع استریم داریم که به شرح زیر هستند
# استریم ورودی (InPutStream) این نوع استریم برای خواندن داده ها از منبع ورودی به کار می رود.
# استریم خروجی(OutPutStream) این استریم برای نوشتن داده ها در مقصد خروجی به کار می رود.
||http://tosinso.com/files/get/6a727604-7524-4289-b6b5-26881d5050ef||
زبان جاوا برای کار با فایل ها و شبکه بسیار قوی و انعطاف پذیر است و ما در این مطلب فقط اصول و پایه کاربردهای زبان جاوا را بررسی می کنیم.

!!استریم های بایتی Byte Streams
استریم های بایتی جاوا برای ورودی و خروجی داده های 8 بیتی مورد استفاده قرار می گیرد. با این که تعداد کلاس های زیاد هستند که با این نوع استریم ها کار می کنند ولی پرکاربرد ترین کلاس ها برای این نوع استریم ها FileInputStream و FileOutputStream می باشد.  برنامه زیر یک مثال از این دو کلاس است که نحوه استفاده از این کلاس ها را نشان می دهد. در برنامه زیر داده ها از فایل ورودی به فایل خروجی کپی می شوند.
<java>
import java.io.*;

public class CopyFile {
   public static void main(String args[]) throws IOException
   {
      FileInputStream in = null;
      FileOutputStream out = null;

      try {
         in = new FileInputStream(d:\\input.txt);
         out = new FileOutputStream(d:\\output.txt);
         
         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}
<java>
خروجی کد بالا به شکل زیر خواهد بود:
<text>
This is test for copy file.
<text>

!!استریم های کاراکتری Character Streams
همان گونه که گفتیم استریم های بایتی برای خواندن و نوشتن داده های بایتی با تعداد 8 بیت مورد استفاده قرار می گرفتند ولی استریم های کاراکتری برای خواندن و نوشتن داده هایی که تعداد 16 بیت طول دارند انجام می شود. کلاس هایی که برای کار با این نوع داده ها بسیار مورد استفاده قرار می گیرد کلاس های FileReader, FileWriter هستند. کلاس FileReader به شکل داخلی از کلاس FileInputStream استفاده می کند و کلاس FileWriter نیز به طور داخلی از کلاس FileOutputStream استفاده می کند ولی یک تفاوت عمده بین این دو دسته کلاس وجود دارد و آن هم این است که کلاس های استریم کاراکتری در واحد زمان با دو کاراکتر کار می کنند یعنی FileReader در واحد زمان دو بایت می خواند و FileWriter در واحد زمان 2 بایت در خروجی می نویسد. در قطعه کد زیر مثال بالا با استفاده از دو کلاس گفته باز نویسی شده است که فایل ورودی را در فایل خروجی کپی می کند. 
<java>
import java.io.*;

public class CopyFile {
   public static void main(String args[]) throws IOException
   {
      FileReader in = null;
      FileWriter out = null;

      try {
         in = new FileReader(d:\\input.txt);
         out = new FileWriter(d:\\output.txt);
         
         int c;
         while ((c = in.read()) != -1) {
            out.write(c);
         }
      }finally {
         if (in != null) {
            in.close();
         }
         if (out != null) {
            out.close();
         }
      }
   }
}
<java>
حال اگر در مسیر گفته شده فایل input.txt موجود باشد محتویات آن در فایل output.txt ریخته می شود.

!!استریم های استاندارد Standard Stream
همه ی زبان های برنامه نویسی از IO استاندارد پشتیبانی می کنند. IO استاندارد به این معنی است که بتوان کلید ها و کاراکترهای وارد شده از کیبورد را خواند و کاراکترهایی را که لازم داریم در صفحه نمایش نشان دهیم. اگر شما با زبان c یا C++ کار کرده باشید باید با STDIN, STDOUT, STDERR آشنا باشید. در جاوا نیز برای کار با کیبورد و صفحه نمایش استریم های استاندارد زیر وجود دارد.
* *ورودی استاندارد*: ورودی استاندارد برای خواندن داده ها برای برنامه کاربر به کار می رود که معمولا از کیبورد ورودی میگیرد و نحوه استفاده از آن با System.in شروع می شود.
* *خروجی استاندارد*: خروجی استاندارد برای خروج داده های تولید شده توسط برنامه کاربر به کار می رود و معمولا داده های تولید شده را در صفحه نمایش نشان می دهد و استفاده از آن با System.out شروع می شود.
* *خطای استاندارد*: اگر بخواهیم پیام خطا را در صفحه نمایش نشان دهیم از این استریم استفاده می کنیم که کلاس آن System.err است. 
در ادامه یک برنامه ساده آورده شده است که با استفاده از InputStreamReader داده های استاندارد را از کیبورد می خواند و تا وقتی که کاربر حرف q را وارد نکرده ادامه می یابد. این برنامه نحوه استفاده از استریم های استاندارد را نمایش می دهد.
<java>
import java.io.*;

public class ReadConsole {
   public static void main(String args[]) throws IOException
   {
      InputStreamReader cin = null;

      try {
         cin = new InputStreamReader(System.in);
         System.out.println(Enter characters, 'q' to quit.);
         char c;
         do {
            c = (char) cin.read();
            System.out.print(c);
         } while(c != 'q');
      }finally {
         if (cin != null) {
            cin.close();
         }
      }
   }
}
<java>
حال اگر برنامه بالا را اجرا کنیم خروجی برنامه شبیه به خطوط زیر خواهد بود:
<text>
Enter characters, 'q' to quit.
1
1
e
e
q
q
<text>

!!کاربا فایل ها
همانطور که گفتیم یک استریم دنباله ای از داده ها است و گفتیم که InputStream برای خواندن داده ها از منبع و OutputStream برای نوشتن داده ها در مقصد به کار می رود. در شکل زیر سلسله مراتب کلاس هایی که با استریم ها کار می کنند آورده شده است.
||http://tosinso.com/files/get/9616f8ee-25d0-4af7-a62b-3fe3413a6a0a||
در این مطلب دو استریم مهم را بررسی می کنیم که آنها FileInputStream و FileOutputStream خواهد بود. 

!!FileInputStream
این استریم برای خواندن داده ها از فایل ها استفاده می شود. اشیای این استریم می توانند با استفاده از کلمه کلیدی new ساخته شودن و دارای constructor های متنوعی هستند برای مثال constructor زیر مسیر فایل را به صورت متنی دریافت می کند و یک شئ استریم می سازد. تا بتواند فایل را بخواند.
<java>
InputStream f = new FileInputStream(C:/java/hello);
<java>
در constructor زیر ابتدا یک شئ فایل می سازیم و سپس برای فایل ساخته شده یک استریم می سازیم تا بتوانیم آن را بخوانیم. برای ساخت شئ فایل از کلاس File استفاده می کنیم و باید هنگام ساخت شئ فایل مسیر فایل را به آن بدهیم.
<java>
File f = new File(C:/java/hello);
InputStream f = new FileInputStream(f);
<java>
وقتی که یک شئ استریم InputStream داریم لیستی از متدهای helper وجود دارد که می توانیم با استفاده از آنها استریم ها را بخوانیم و یا اعمال دیگری را روی استریم ها انجام دهیم. لیست این متد ها را در ادامه آورده ایم.
# متد close: این متد استریم خروجی فایل را می بندد و همه منابعی که سیستم برای آن فایل گرفته بود را آزاد می کند. این متد ممکن است که یک خطای IOException تولید کند که باید توسط کاربر در نظر گرفته شود. این متد هیچ ورودی نداشته و چیزی برنمی گرداند.
# متد finalize: این متد همه ی اتصالات به فایل را حذف می کند و مطمئن می شود که متد close این استریم فراخوانی شده است. این متد نیز ممکن است که خطای IOException تولید کند. این متد هیچ ورودی نداشته و چیزی برنمی گرداند. همانطور که در قسمت متدها گفته شده این متد برای از بین بردن اشیا استفاده می شود.
# متد read این متد یک مقدار ورودی می گیرد که این ورودی می تواند یک مقدار عددی باشد و این به این معنی است که بایتی را که شماره آن را داده ایم می خواند و بایت بعدی را برمی گرداند و اگر به انتهای فایل رسیده باشیم مقدار -1 را برمی گرداند. این متد نیز ممکن است خطای IOException تولید کند
# متد available این متد یک مقدار عددی برمی گرداند و عدد بازگردانده شده به تعداد بایت هایی است که می توان از این فایل خواند.
استریم های مهم دیگری هم برای ورود اطلاعات وجود دارد که آنها را بعدا توضیح خواهیم داد. که این استریم ها عبارتند از: ByteArrayInputStream و DataInputStream

!!FileOutpuStream
این استریم برای ساخت یک فایل و نوشتن اطلاعات در درون آن به کار می رود. اگر ما قصد نوشتن اطلاعات در فایلی را داشته باشیم ولی فایل مقصد وجود نداشته باشد این استریم می تواند فایل را بسازد و اطلاعات را درون فایل بنویسد. در ادامه یک شئ از این استریم ساخته ایم که در constructor خود یک آدرس فایل می گیرد و شئ استریم را می سازد تا بتوان داده ها را در آن نوشت.
<java>
OutputStream f = new FileOutputStream(C:/java/hello)
<java>
در مثال زیر ابتدا یک شئ فایل ساخته ایم و از شئ فایل ساخته شده یک استریم برای نوشتن ساخته شده است.
<java>
File f = new File(C:/java/hello);
OutputStream f = new FileOutputStream(f);

<java>
شئی که از استریم خروجی فایل ساخته شده است متدهای متفاوتی دارد که می توان از آن برای اعمال مختلف استفاده کرد که در ادامه به توضیح چند عدد از آنها پرداخته ایم:
#متد close این متد استریم خروجی را می بندد و همه منابع را از آن پس می گیرد. این متد مانند متد استریم ورودی ممکن است خطای IOException تولید کند. همچنین این استریم متدی با نام finalize دارد که آن را قبلا توضیح دادیم.
#متد write این متد یک ورودی عددی دارد که بایت ورودی را در داخل استریم می نویسد. این متد نیز ممکن است که خطای IOException تولید کند. همچنین این متد ممکن است که یک ورودی آرایه ای از نوع byte داشته باشد که در این صورت خانه های آرایه را در داخل استریم خروجی می نویسد.
البته استریم های دیگری برای خروجی نیز وجود دارد که بعدا به توضیح آنها خواهیم پرداخت. برنامه زیر یک مثال از استریم های ورودی و خروجی می باشد که برای درک بهتر این استریم ها کمک می کند. در این برنامه یک آرایه از نوع byte می سازیم و آن را در فایل test.txt می نویسیم و سپس از آن می خوانیم و در صفحه نمایش آن را نشان می دهیم.
<java>
import java.io.*;

public class fileStreamTest{

   public static void main(String args[]){
   
   try{
      byte bWrite [] = { 75,106,3,48,95 };
      OutputStream os = new FileOutputStream(test.txt);
      for(int x=0; x < bWrite.length ; x++){
         os.write( bWrite[x] ); // writes the bytes
      }
      os.close();
     
      InputStream is = new FileInputStream(test.txt);
      int size = is.available();

      for(int i=0; i< size; i++){
         System.out.print((char)is.read() +   );
      }
      is.close();
   }catch(IOException e){
      System.out.print(Exception);
   }	
   }
}

<java>
خروجی این برنامه به شکل زیر خواهد بود
<text>
K  j     0  _  
<text>
دقت داشته باشید که مقادیری که نوشته می شوند تبدیل به کاراکتر شده و نوشته می شوند. برای همین شما باید کد اسکی کاراکتر را بنویسید.

*Itpro باشید*


نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

در این مطلب دو استریم مهم را بررسی می کنیم که آنها FileInputStream و FileOutputStream خواهد بود.

آموزش استفاده از FileInputStream

این استریم برای خواندن داده ها از فایل ها استفاده می شود. اشیای این استریم می توانند با استفاده از کلمه کلیدی new ساخته شودن و دارای constructor های متنوعی هستند برای مثال constructor زیر مسیر فایل را به صورت متنی دریافت می کند و یک شئ استریم می سازد. تا بتواند فایل را بخواند.

InputStream f = new FileInputStream("C:/java/hello");

در constructor زیر ابتدا یک شئ فایل می سازیم و سپس برای فایل ساخته شده یک استریم می سازیم تا بتوانیم آن را بخوانیم. برای ساخت شئ فایل از کلاس File استفاده می کنیم و باید هنگام ساخت شئ فایل مسیر فایل را به آن بدهیم.

File f = new File("C:/java/hello");
InputStream f = new FileInputStream(f);

وقتی که یک شئ استریم InputStream داریم لیستی از متدهای helper وجود دارد که می توانیم با استفاده از آنها استریم ها را بخوانیم و یا اعمال دیگری را روی استریم ها انجام دهیم. لیست این متد ها را در ادامه آورده ایم.

  1. متد close: این متد استریم خروجی فایل را می بندد و همه منابعی که سیستم برای آن فایل گرفته بود را آزاد می کند. این متد ممکن است که یک خطای IOException تولید کند که باید توسط کاربر در نظر گرفته شود. این متد هیچ ورودی نداشته و چیزی برنمی گرداند.
  2. متد finalize: این متد همه ی اتصالات به فایل را حذف می کند و مطمئن می شود که متد close این استریم فراخوانی شده است. این متد نیز ممکن است که خطای IOException تولید کند. این متد هیچ ورودی نداشته و چیزی برنمی گرداند. همانطور که در قسمت متدها گفته شده این متد برای از بین بردن اشیا استفاده می شود.
  3. متد read این متد یک مقدار ورودی می گیرد که این ورودی می تواند یک مقدار عددی باشد و این به این معنی است که بایتی را که شماره آن را داده ایم می خواند و بایت بعدی را برمی گرداند و اگر به انتهای فایل رسیده باشیم مقدار -1 را برمی گرداند. این متد نیز ممکن است خطای IOException تولید کند
  4. متد available این متد یک مقدار عددی برمی گرداند و عدد بازگردانده شده به تعداد بایت هایی است که می توان از این فایل خواند.

استریم های مهم دیگری هم برای ورود اطلاعات وجود دارد که آنها را بعدا توضیح خواهیم داد. که این استریم ها عبارتند از: ByteArrayInputStream و DataInputStream

آموزش استفاده از FileOutpuStream

این استریم برای ساخت یک فایل و نوشتن اطلاعات در درون آن به کار می رود. اگر ما قصد نوشتن اطلاعات در فایلی را داشته باشیم ولی فایل مقصد وجود نداشته باشد این استریم می تواند فایل را بسازد و اطلاعات را درون فایل بنویسد. در ادامه یک شئ از این استریم ساخته ایم که در constructor خود یک آدرس فایل می گیرد و شئ استریم را می سازد تا بتوان داده ها را در آن نوشت.

OutputStream f = new FileOutputStream("C:/java/hello")

در مثال زیر ابتدا یک شئ فایل ساخته ایم و از شئ فایل ساخته شده یک استریم برای نوشتن ساخته شده است.

File f = new File("C:/java/hello");
OutputStream f = new FileOutputStream(f);

شئی که از استریم خروجی فایل ساخته شده است متدهای متفاوتی دارد که می توان از آن برای اعمال مختلف استفاده کرد که در ادامه به توضیح چند عدد از آنها پرداخته ایم:

  • متد close این متد استریم خروجی را می بندد و همه منابع را از آن پس می گیرد. این متد مانند متد استریم ورودی ممکن است خطای IOException تولید کند. همچنین این استریم متدی با نام finalize دارد که آن را قبلا توضیح دادیم.
  • متد write این متد یک ورودی عددی دارد که بایت ورودی را در داخل استریم می نویسد. این متد نیز ممکن است که خطای IOException تولید کند. همچنین این متد ممکن است که یک ورودی آرایه ای از نوع byte داشته باشد که در این صورت خانه های آرایه را در داخل استریم خروجی می نویسد.

البته استریم های دیگری برای خروجی نیز وجود دارد که بعدا به توضیح آنها خواهیم پرداخت. برنامه زیر یک مثال از استریم های ورودی و خروجی می باشد که برای درک بهتر این استریم ها کمک می کند. در این برنامه یک آرایه از نوع byte می سازیم و آن را در فایل test.txt می نویسیم و سپس از آن می خوانیم و در صفحه نمایش آن را نشان می دهیم.

import java.io.*;

public class fileStreamTest{

   public static void main(String args[]){
   
   try{
      byte bWrite [] = { 75,106,3,48,95 };
      OutputStream os = new FileOutputStream("test.txt");
      for(int x=0; x < bWrite.length ; x++){
         os.write( bWrite[x] ); // writes the bytes
      }
      os.close();
     
      InputStream is = new FileInputStream("test.txt");
      int size = is.available();

      for(int i=0; i< size; i++){
         System.out.print((char)is.read() + "  ");
      }
      is.close();
   }catch(IOException e){
      System.out.print("Exception");
   }	
   }
}

خروجی این برنامه به شکل زیر خواهد بود

K  j     0  _  

دقت داشته باشید که مقادیری که نوشته می شوند تبدیل به کاراکتر شده و نوشته می شوند. برای همین شما باید کد اسکی کاراکتر را بنویسید.

کار با دایرکتوری ها

در مطلب قبلی به بررسی کلی فایل ها و استریم ها در جاوا پرداختیم در این مطلب به دایرکتوری ها در جاوا می پردازیم.

بررسی کاربرد دایرکتوری ها در جاوا

یک دایرکتوری فایلی است که می تواند لیستی از سایر فایل ها و دایرکتوری ها را در خود نگهداری کند. برای کاربران ویندوز می توان به طور تقریبی دایرکتوری را معادل فولدر قرار داد. ما در جاوا برای ساخت دایرکتوری ها از شئ File استفاده می کنیم. همچنین از شئ File می توان برای لیست کردن فایل های موجود در یک دایرکتوری و یا سایر اعمالی که می توان بر روی دایرکتوری ها انجام داد این شئ قابل استفاده است. کلاس File را در مطالب بعدی توضیح خواهیم داد.

آموزش ساخت دایرکتوری

برای ساخت دایرکتوری در جاوا دو متد وجود دارد که می توان از آن ها استفاده کرد که این متدها به شرح زیر می باشند.

  • متد mkdir این متد یک دایرکتوری می سازد و اگر ساخت دایرکتوری با موفقیت باشد مقدار true برمی گرداند و در غیر این صورت مقدار false را برمی گرداند. زمانی برای ساخت دایرکتوری خطا رخ می دهد و نمی توان دایرکتوری را ساخت که یا همان دایرکتوری در همان مسیر وجود داشته باشد و یا چنین مسیری وجود نداشته باشد.
  • متد mkdirs این متد یک مسیر می گیرد و اگر دایرکتوری در مسیر وجود نداشته باشد آن را نیز می سازد به عبارت دیگر علاوه بر این که دایرکتوری مورد نظر را می سازد دایرکتور های والد را نیز می سازد.

در مثال زیر نحوه ساخت دایرکتوری ها را آورده ایم. در این برنامه دایرکتوری های e:\itpro\ir\programming\java ساخته می شود.

import java.io.File;

public class CreateDir {
   public static void main(String args[]) {
      String dirname = "e:/itpro/ir/programming/java ";
      File d = new File(dirname);
      // Create directory now.
      d.mkdirs();
  }
}

حال اگر به مسیر گفته شده بروید خواهید دید که فولدر های مورد نظر ساخته شده اند. دقت داشته باشید که جاوا با توجه به محیطی که در آن در حال اجرا است جدا کننده ها را می شناسد برای مثال در لینوکس یا یونیکس جدا کننده دایرکتوری ها علامت اسلش (//) می باشد ولی در ویندوز علامت بک اسلش است (\) خود جاوا اگر در همه حال از اسلش استفاده کنیم آن را اصلاح می کند و نیازی به نگرانی در این زمینه نیست.

آموزش لیست کردن دایرکتوری ها

شما می توانید با استفاده از متد list که در کلاس File وجود دارد همه ی فایل ها و دایرکتوری های موجود در دایرکتوری جاری را لیست کنید. به مثال زیر دقت کنید:

import java.io.File;

public class ReadDir {
   public static void main(String[] args) {
      
      File file = null;
      String[] paths;
            
      try{      
         // create new file object
         file = new File("j:/telegram");
                                 
         // array of files and directory
         paths = file.list();
            
         // for each name in the path array
         for(String path:paths)
         {
            // prints filename and directory name
            System.out.println(path);
         }
      }catch(Exception e){
         // if any error occurs
         e.printStackTrace();
      }
   }
}

خروجی این برنامه همه ی فایل ها و دایرکتوری هایی خواهد بود که به طور مستقیم در داخل دایرکتوری جاری قرار خواهند داشته که به شکل زیر خواهد بود

log.txt
tdata
Telegram.exe
Updater.exe

کلاس ByteArrayInputStream

با سلام به همه دوستان و همراهان Itpro. در قسمت های قبل در مورد پکیج java.io و فایل ها و استریم ها صحبت کردیم. در این مطلب قصد داریم که یکی از کلاس های مهم در مورد استریم ها را توضیح دهیم و نحوه کار کردن با آن را مشخص کنیم.

آموزش استفاده از ByteArrayInputStream

کلاس ByteArrayInputStream این اجازه را به کاربر می دهد که از بافر حافظه به عنوان استریم ورودی استفاده کند. به این معنی که استریم ورودی یک آرایه از نوع byte خواهد بود. این کلاس دارای constructor های زیر است.

  • این constructor یک آرایه از نوع byte را به عنوان ورودی دریافت می کند
ByteArrayInputStream(byte [] a)
  • این Constructor یک آرایه از نوع byte را به عنوان ورودی می گیرد و همچنین دو عدد نیز به عنوان ورودی میگیرد که اعداد گرفته شده به ترتیب برای این است که ابتدا و طول خانه های آرایه که باید مورد استفاده قرار بگیرند کدام است به این معنی که پارامتر off اولین خانه از آرایه است که باید خوانده شود و پارامتر len تعداد خانه هایی که باید خوانده شود را مشخص می کند.
ByteArrayInputStream(byte [] a, int off, int len)

اگر شما یک شئ از کلاس ByteArrayInputStreamداشته باشید متدهای زیر را که با استریم ها کار می کند را در اختیار خواهید داشت.

  1. متد **read این متد اگر هیچ پارامتر ورودی نداشته باشد، بایت بعدی از داده های استریم ورودی را می خواند و بایت بعدی را به عنوان int می خواند و اگر به انتهای استریم رسیده باشد مقدار -1 را برمی گرداند. اما نسخه پارامتردار این متد به این شکل است که یک آرایه از نوع byte و دو عدد از کاربر به عنوان ورودی می گیرد و نحوه عمل آن به این شکل است که از خانه ای که عدد اولی مشخص کرده به تعداد عدد دوم از داده ها می خواند و در داخل آرایه ورودی می ریزد و برای نتیجه نیز تعداد خانه های خوانده شده را برمی گرداند و اگر هیچ داده ای نخوانده باشد مقدار -1 برمی گرداند.
  2. متد available تعداد داده های باقی مانده که خوانده نشده اند را برمی گرداند.
  3. متد mark با استفاده از این متد می توان محل خواندن داده ها را تغییر داد. به این شکل که محل خواندن جدید را به صورت پارامتر ورودی به متد بدهیم. این متد چیزی برنمی گرداند
  4. متد skip این متد یک پارامتر ورودی عددی دارد که به تعداد آن ورودی از داده های استریم را نادیده می گیرد و از روی آنها می پرد.

برای مثالی از این کلاس به برنامه زیر دقت کنید. که این برنامه کاربرد کلاس های  ByteArrayInputStreamو ByteArrayOutputStream را نمایش می دهد.

import java.io.*;

public class ByteStreamTest {

    public static void main(String args[])throws IOException {

        ByteArrayOutputStream bOutput = new ByteArrayOutputStream(6);
        byte[] bb={'a','b','c','d','e','f','g'};
        bOutput.write(bb);
        byte b [] = bOutput.toByteArray();
        System.out.println("Print the content");
        for(int x= 0 ; x < b.length; x++) {
            // printing the characters
            System.out.print((char)b[x]  + "   ");
        }
        System.out.println("   ");

        int c;

        ByteArrayInputStream bInput = new ByteArrayInputStream(b);
        System.out.println("Converting characters to Upper case " );
        for(int y = 0 ; y < 1; y++ ) {
            while(( c= bInput.read())!= -1) {
                System.out.println(Character.toUpperCase((char)c));
            }
            bInput.reset();
        }
    }
}

خروجی این برنامه به شکل زیر خواهد بود

Print the content
a   b   c   d   e   f   g      
Converting characters to Upper case 
A
B
C
D
E
F
G

متد reset که در کد بالا آورده شده است این وظیفه را دارد که اگر قبلا از متد mark استفاده کرده ایم محل خواندن استریم را به آن محل انتقال دهد و در غیر این صورت محل خواندن را 0 کند. در باره ی ByteArrayOutputStream در مطالب بعدی توضیح خواهیم داد

معرفی کلاس File و متدها

در ادامه مطلب قبلی که در مورد استریم ها و فایل ها بود در این مطلب نیز به علت اهمیت زیاد کلاس File که در مطلب قبل به آن اشاره شد خواهیم پرداخت و این کلاس را به طور کامل شرح می دهیم. این کلاس فایل ها و دایرکتوری ها را مدیریت می کند.

این کلاس برای ساخت فایل و دایرکتوری و همچنین اعمالی مانند جستجو و حذف فایل ها و اعمال اینچنینی به کار می آید. اگر شما یک شئ از کلاس File داشته باشید به این معنی است که مطابق با آن شئ یک فایل فیزیکی دارید. به عبارت دیگر هر شئ فایل نماینده یک فایل یا دایرکتوری فیزیکی است. برای این که یک شئ File را بسازیم می توانیم از constructor های متفاوتی استفاده کرده و شئ خود را ایجاد کنیم که این constructor ها در ادامه آمده اند.

آموزش استفاده از Constructor های کلاس File

File(File parent, String child)

این Constructor یک شئ از کلاس file می گیرد که شئ جاری فرزند آن کلاس خواهد بود به عبارت دیگر شئ File جاری در داخل دایرکتوری شئ پدر می باشد. ورودی دوم این constructor یک رشته است که نام فایل فرزند کنونی را مشخص می کند.

File(String pathname)

این constructor مسیر فایل را به عنوان ورودی دریافت می کند و با تفسیر این مسیرشئ فایل مورد نظر را با آن می سازد.

File(String parent, String child)

این constructor دو رشته را به عنوان ورودی دریافت می کند که یکی آدرس پدر و دیگری آدرس خود فرزند است که قرار است از آن شیئی ساخته شود.

File(URI uri)

این constructor یک شئ از URI داده شده را می سازد. متدهایی که یک شئ File دارد به عبارت دیگر متدهایی که در کلاس File تعریف شده اند، عبارتند از:

  • متدgetName: این متد ورودی نداشته و یک رشته را به عنوان خروجی برمی گرداند و آن رشته نام فایل و یا دایرکتوری را که از آن شئ ساخته شده است برمی گرداند.
  • متد getParnet: این متد نیز ورودی نداشته و یک رشته را به عنوان خروجی برمی گرداند و آن خروجی مسیر پدر فایل یا دایرکتوری است که شئ از آن ساخته شده است.
  • متدgetParentFile: این متد ورودی ندارد. وظیفه این متد این است که مسیر فایل پدر را پیدا می کند سپس یک شئ فایل از پدر شئ جاری ساخته و برمی گرداند.
  • متد getPath: این متد یک رشته را که همان مسیر فایل جاری است را برمی گرداند.
  • متد getAbsolutePath این متد مسیر کامل از ریشه تا خود فایل را در قالب یک رشته برمی گرداند.
  • متد canRead: این متد مشخص می کند که آیا فایل توسط برنامه قابل خواندن است یا خیر اگر فایل توسط برنامه قابل خواندن بود مقدار True و در غیر این صورت مقدار false بر می گرداند. برای چک کردن قابلیت نوشتن هم متد canWrite وجود دارد که عمل مشابه canRead انجام می دهد.
  • متد exists این متد مشخص می کند که فایلی یا دایرکتوری که از آن شئی ساخته شده است به طور فیزیکی وجود دارد یا خیر. اگر فایل یا دایرکتوری مورد نظر وجود داشته باشد مقدار true برمی گرداند.
  • متد isDirecotry این متد مشخص می کند که شئ مورد نظر یک دایرکتوری است یا خیر. اگر دایرکتوری باشد مقدار true بازگردانده خواهد شد. برای این که بدانیم یک شئ فایل است یا خیر نیز می توان از متد isFile در همین کلاس استفاده کرد.
  • متد lastModified:این متد ورودی ندارد ولی برای خروجی یک مقدار long را برمی گرداند و این مقدار زمانی است که آخرین بار فایل تغییر داده شده است. مقدار long که بازگردانی می شود برابر تعداد میلی ثانیه هایی است که از زمان 1 ژانویه 1970 می گذرد. اگر فایل موجود نباشد خطا رخ خواهد داد.
  • متد length این متد ورودی نداشته و به عنوان خروجی اندازه فایل را بر می گرداند که یک مقدار long است.
  • متد createNewFile: این متد یک فایل جدید و خالی با همان نام و مسیر گفته شده می سازد. البته این عمل در صورتی انجام می شود که در مسیری که از آن شئ ساخته شده است فایلی فیزیکی وجود نداشته باشد. اگر ساخت فایل جدید با موفقیت انجام شود مقدار true و اگر فایلی با نام مشخص شده در همان مسیر بود عملیات ناموفق بوده و مقدار False برگردانده خواهد شد.
  • متد delete: این متد فایل یا دایرکتوری که از آن شئ ساخته شده است را حذف می کند. البته دقت داشته باشید برای این که یک دایرکتوری حذف شود باید آن دایرکتوری خالی باشد. اگر حذف فایل با موفقیت انجام شود مقدار true و در غیر این صورت مقدار false برگردانده خواهد شد.
  • متد deleteOnExit این متد مشخص می کند که فایل جاری هنگامی که ماشین مجازی جاوا به پایان کار خود رسید حذف شود. این متد برای ساخت فایل های موقتی بسیار کاربرد دارد.
  • متد list این متد یک آرایه String از فایل ها و دایرکتوری هایی که در داخل دایرکتوری شئ جاری هست را برمی گرداند. نسخه دیگری از این متد وجود دارد که یک فیلتر به عنوان ورودی می گیرد و همه فایل ها و دایرکتوری هایی که با فیلتر مشخص شده هم خوانی دارد را برمی گرداند.
  • متد listFiles این متد یک آرایه از اشیاء از کلاس File را برمی گرداند و آن آرایه همه ی فایل ها و دایرکتوری های موجود در دایرکتوری شئ جاری است. می توان از این متد بدون ورودی و یا با یک ورودی فیلتر استفاده کرد.
  • متدهای mkdir , mkdirs این دو متد برای ساخت دایرکتوری به کار می رود و اگر ساخت دایرکتوری موفقیت آمیز باشد مقدار true برگردانده می شود. تفاوت mkdir, mkdirs در این است که mkdir فقط یک دایرکتوری در مسیر جاری میسازد و اگر مسیر جاری وجود نداشته باشد خطا رخ می دهد ولی در متد mkdirs اگر مسیر داده شده وجود نداشته باشد همه ی دایرکتوری های مسیر را می سازد.
  • متد renameTo: این متد یک رشته را به عنوان ورودی می گیرد و آن هم آدرس فایل مقصد است. وظیفه این متد تغییر نام فایل مبدا به فایل مقصد است. به عبارت دیگر این فایل عمل انتقال یا move و یا همان cut کردن خودمان را انجام می دهد. اگر عمل rename موفقیت آمیز باشد مقدار true بازگردانده می شود.
  • متد های setLastModified و setReadOnly متد setLastModified یک ورودی long می گیرد که آخرین زمان تغییر فایل را با مقدار ورودی اش تنظیم می کند و متد setReadOnly فایل مورد نظر را فقط خواندنی می کند و قابلیت نوشتن را از روی فایل برمی دارد. در هردوی این متدها اگر عمل مورد نظر موفقیت آمیز باشد مقدار true بازگردانده خواهد شد.
  • متد createTempFile این متد دارای دو شکل است که یکی دارای دو ورودی است که هر دوی ورودی های آن از نوع رشته می باشد. وظیفه این متد این است که یک فایل خالی می سازد. دو ورودی رشته ای که این متد دریافت می کند به ترتیب پیشوندو پسوند نام فایل خواهد بود. این متد شئ فایل ساخته شده را به عنوان خروجی باز می گرداند. در فرم این متد که دارای سه ورودی می باشد، ورودی سوم از نوع کلاس File خواهد بود که دایرکتوری که قرار است فایل در آن ساخته شود را مشخص می کند. حال اگر این متد با دو ورودی فراخوانی شود فایل مورد نظر در محل فایل های موقتی temporary پیش فرض ساخته خواهد شد.
  • متد canExecute این متد مشخص می کند که فایل جاری را می توانیم اجرا کنیم یا نه. به عبارت دیگر مشخص می کند که فایل مورد نظر مجوز اجرای فایل مورد نظر را دارد یا خیر.

اکثر عملیات بر روی فایل ها در جاوا به گونه ای با کلاس file درگیر خواهند بود. به همین دلیل سعی شد که متدهای این کلاس را شرح دهیم

معرفی و شرح Exception ها قسمت 1

در برنامه نویسی ممکن است خطاهایی پیش بیاید که در همه حال این اتفاق نیفتد و در طی افتادن اتفاق یا اتفاقات خاصی یک خطا رخ دهد. به همین دلیل به این نوع خطاها استثنا گفته می شود. زبان جاوا در برخود با استثناها بسیار خوب عمل می کند.

در این مطلب قصد دارم نحوه برخورد و پردازش استثناها را شرح دهم. یک استثنا یا رویداد استثنایی مشکلی است که هنگام اجرای برنامه رخ می دهد. وقتی که یک استثنا رخ می دهد برنامه از جریان اجرای نرمال خود خارج می شود و به طور غیر عادی برنامه بسته می شود.

حتما شما این مثال ها را در برنامه های خود دیده اید. برای مثال در زمان ویندوز xp حالاتی اتفاق می افتاد که برنامه ها خطای به اصطلاخ Don’t send پیدا می کردند و یا در سیستم عامل اندروید برنامه ای stopped working می شود. این ها حالاتی هستند که در برنامه استثنایا exception رخ می دهد.

در مقابله با exception ها باید قبل از این که این خطاها باعث کرش کردن برنامه شود آن را مدیریت کرد و در صورت لزوم پیام مناسبی به کاربر داده شود.اتفاق افتادن یک exception می تواند دلایل مختلفی داشته باشد که در زیر به چند تا از آنها اشاره کرده ایم:

  1. وقتی که کاربری داده نامعتبر و غلط وارد کرده است
  2. قصد داریم فایلی را باز کنیم در حالی که فایل مورد نظر بر روی دیسک و در آدرس مورد نظر موجود نیست.
  3. زمانی که یک اتصال شبکه قطع می شود و یا حافظه jvm کم می آید.

دلیل اتفاق افتادن برخی از این exception ها خطای کاربر است و برخی دیگر خطای برنامه نویس و برخی دیگر هم مشکلات منابع سخت افزاری و مشکلات موجود در آنها می باشد. بنابر این exception ها را به سه بخش تقسیم می کنیم که باید بدانیم هرکدام را چگونه مدیریت کنیم.

آموزش بررسی Exception های چک شده

یک exception چک شده exceptionی است که در زمان کامپایل برنامه اتفاق می افتد. این exception ها را نمی توان به راحتی نادیده گرفت این exception ها باید توسط برنامه نویس مدیریت شوند. برای مثال اگر از کلاس FileReader استفاده می کنید که یک فایل را بخوانید

اگر حدس می زنید که ممکن است که فایل مورد نظر موجود نباشد پس ممکن است یک exception از نوع FileNotFoundException رخ بدهد و در زبان جاوا کامپایلر کاربر را مجبورم می کند تا این exception را مدیریت نماید. برای مثال اگر شما سعی کنید که برنامه زیر را کامپایل کنید:

import java.io.File;
import java.io.FileReader;

public class FilenotFound_Demo {

   public static void main(String args[]){		
      File file=new File("E://file.txt");
      FileReader fr = new FileReader(file); 
   }
   
}

در این صورت برنامه خطای زیر را به شما خواهد داد:

FilenotFound_Demo.java:8: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
      FileReader fr = new FileReader(file);
                      ^
1 error

دقت داشته باشید که چون متدهای read, close در کلاس FileReader ممکن است exception از نوع IOException را تولید کنند کامپایلر از کاربر می خواهد که این exception را نیز مدیریت نماید.

آموزش بررسی  Exception های چک نشده

یک exception چک نشده exceptionی است که در زمان اجرا اتفاق می افتد که شامل خطاهای برنامه نویسی مانند خطاهای منطقی یا استفاده نادرست از API ها می باشد. می توان این exception ها را در زمان کامپایل نادیده گرفت. برای مثال اگر شما یک آرایه را با سایز 5 معرفی کرده باشید و بخواهید از خانه 6ام آن استفاده کنید exception ی به نام ArrayIndexOutOfBoundsExceptionexception رخ خواهد داد. برای مثال به کد زیر دقت کنید

public class Unchecked_Demo {
   
   public static void main(String args[]){
      int num[]={1,2,3,4};
      System.out.println(num[5]);
   }

}

اگر شما کد بالا را اجرا کنید خطای زیر را دریافت خواهید کرد.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
	at Exceptions.Unchecked_Demo.main(Unchecked_Demo.java:8)

بررسی مفهوم خطاها Errors

البته این نوع خطاها exception محسوب نمی شوند. اما مشکلاتی هستند که به خاطر عدم کنترل توسط کاربر و یا برنامه نویس رخ می دهد اتفاق می افتند. خطاها هنگام کامپایل توسط کامپایلر نادیده گرفته می شوند به خاطر این که به ندرت اتفاق می افتند. برای مثال اگر خطایی مانند سرریز شدن پشته (stack overflow) رخ دهد یک خطا اتفاق می افتد.

بررسی مفهوم سلسله مراتب exception ها

مانند بقیه قسمت های زبان برنامه نویسی جاوا که از کلاس ها تشکیل شده اند exception ها نیز هرکدام دارای کلاس خاص خود می باشند. که همه ی کلاس های Exception ها از کلاس java.lang.Exception ارث بری کرده اند. کلاس exception نیز خود زیر کلاسی از کلاس Throwable می باشد.

به غیر از کلاس Exception کلاس Error نیز از کلاس Throwable مشتق شده است. خطاها شرط های غیر طبیعی هستند که در زمان های خرابی اتفاق می افتند و فکری به حال آنها نشده است و آنها پیش بینی نشده اند. کلاس Exception دو زیرکلاس اصلی دارد. کلاس IOException و کلاس RuntimeException دو زیرکلاس کلاس Exception هستند که بقیه کلاس های Exception از آنها ارث بری کرده اند. در شکل زیر سلسله مراتب این کلاس ها آورده شده است.

با سلام به همه دوستان و همراهان Itpor. در برنامه نویسی ممکن است خطاهایی پیش بیاید که در همه حال این اتفاق نیفتد و در طی افتادن اتفاق یا اتفاقات خاصی یک خطا رخ دهد. به همین دلیل به این نوع خطاها استثنا گفته می شود. زبان جاوا در برخود با استثناها بسیار خوب عمل می کند. در این مطلب قصد دارم نحوه برخورد و پردازش استثناها را شرح دهم. یک استثنا یا رویداد استثنایی مشکلی است که هنگام اجرای برنامه رخ می دهد. وقتی که یک استثنا رخ می دهد برنامه از جریان اجرای نرمال خود خارج می شود و به طور غیر عادی برنامه بسته می شود. حتما شما این مثال ها را در برنامه های خود دیده اید. برای مثال در زمان ویندوز xp حالاتی اتفاق می افتاد که برنامه ها خطای به اصطلاخ Don’t send پیدا می کردند و یا در سیستم عامل اندروید برنامه ای stopped working می شود. این ها حالاتی هستند که در برنامه استثنایا exception رخ می دهد. در مقابله با exception ها باید قبل از این که این خطاها باعث کرش کردن برنامه شود آن را مدیریت کرد و در صورت لزوم پیام مناسبی به کاربر داده شود.اتفاق افتادن یک exception می تواند دلایل مختلفی داشته باشد که در زیر به چند تا از آنها اشاره کرده ایم:
# وقتی که کاربری داده نامعتبر و غلط وارد کرده است
# قصد داریم فایلی را باز کنیم در حالی که فایل مورد نظر بر روی دیسک و در آدرس مورد نظر موجود نیست.
# زمانی که یک اتصال شبکه قطع می شود و یا حافظه jvm کم می آید.
دلیل اتفاق افتادن برخی از این exception ها خطای کاربر است و برخی دیگر خطای برنامه نویس و برخی دیگر هم مشکلات منابع سخت افزاری و مشکلات موجود در آنها می باشد. بنابر این exception ها را به سه بخش تقسیم می کنیم که باید بدانیم هرکدام را چگونه مدیریت کنیم.

!!Exception های چک شده
یک exception چک شده exceptionی است که در زمان کامپایل برنامه اتفاق می افتد. این exception ها را نمی توان به راحتی نادیده گرفت این exception ها باید توسط برنامه نویس مدیریت شوند. برای مثال اگر از کلاس FileReader استفاده می کنید که یک فایل را بخوانید، اگر حدس می زنید که ممکن است که فایل مورد نظر موجود نباشد پس ممکن است یک exception  از نوع FileNotFoundException رخ بدهد و در زبان جاوا کامپایلر کاربر را مجبورم می کند تا این exception را مدیریت نماید. برای مثال اگر شما سعی کنید که برنامه زیر را کامپایل کنید:
<java>
import java.io.File;
import java.io.FileReader;

public class FilenotFound_Demo {

   public static void main(String args[]){		
      File file=new File(E://file.txt);
      FileReader fr = new FileReader(file); 
   }
   
}
<java>
در این صورت برنامه خطای زیر را به شما خواهد داد:
<text>
FilenotFound_Demo.java:8: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
      FileReader fr = new FileReader(file);
                      ^
1 error
<text>
دقت داشته باشید که چون متدهای read, close در کلاس FileReader ممکن است exception از نوع IOException را تولید کنند کامپایلر از کاربر می خواهد که این exception را نیز مدیریت نماید.

!!Exceptionهای چک نشده
یک exception چک نشده exceptionی است که در زمان اجرا اتفاق می افتد که شامل خطاهای برنامه نویسی مانند خطاهای منطقی یا استفاده نادرست از API ها می باشد. می توان این exception ها را در زمان کامپایل نادیده گرفت.  برای مثال اگر شما یک آرایه را با سایز 5 معرفی کرده باشید و بخواهید از خانه 6ام آن استفاده کنید exception ی به نام ArrayIndexOutOfBoundsExceptionexception  رخ خواهد داد. برای مثال به کد زیر دقت کنید
<java>
public class Unchecked_Demo {
   
   public static void main(String args[]){
      int num[]={1,2,3,4};
      System.out.println(num[5]);
   }

}
<java>
اگر شما کد بالا را اجرا کنید خطای زیر را دریافت خواهید کرد.
<text>
Exception in thread main java.lang.ArrayIndexOutOfBoundsException: 5
	at Exceptions.Unchecked_Demo.main(Unchecked_Demo.java:8)
<text>


!!خطاها Errors
البته این نوع خطاها exception محسوب نمی شوند. اما مشکلاتی هستند که به خاطر عدم کنترل توسط کاربر و یا برنامه نویس رخ می دهد اتفاق می افتند. خطاها هنگام کامپایل توسط کامپایلر نادیده گرفته می شوند به خاطر این که به ندرت اتفاق می افتند. برای مثال اگر خطایی مانند سرریز شدن پشته (stack overflow) رخ دهد یک خطا اتفاق می افتد.

!!سلسله مراتب exception ها
مانند بقیه قسمت های زبان برنامه نویسی جاوا که از کلاس ها تشکیل شده اند exception ها نیز هرکدام دارای کلاس خاص خود می باشند. که همه ی کلاس های Exception ها از کلاس java.lang.Exception ارث بری کرده اند. کلاس exception نیز خود زیر کلاسی از کلاس Throwable می باشد. به غیر از کلاس Exception کلاس Error نیز از کلاس Throwable مشتق شده است. خطاها شرط های غیر طبیعی هستند که در زمان های خرابی اتفاق می افتند و فکری به حال آنها نشده است و آنها پیش بینی نشده اند. کلاس Exception دو زیرکلاس اصلی دارد. کلاس IOException و کلاس RuntimeException دو زیرکلاس کلاس Exception هستند که بقیه کلاس های Exception از آنها ارث بری کرده اند. در شکل زیر سلسله مراتب این کلاس ها آورده شده است.
||http://tosinso.com/files/get/7c9fc11e-c8e3-4e3f-a24e-b74101f4fde9||
همانطور که گفته شد یکی از مهمترین و معمول ترین Exception ها از نوع RuntimeException می باشد. Exception های زیر مجموعه ای از Exception های چک نشده زیرکلاس RuntimeException هستند.
* ArithmeticException: این Exception در زمانی که خطایی در محاسبات ریاضی رخ داده باشد اتفاق می افتد. برای مثال زمانی که تقصیم بر صفر انجام شود این Exception رخ خواهد داد.
* ArrayIndexOutOfBoundsException: این exception زمانی رخ می دهد که اندیس خارج از خانه های آرایه باشد.
* ArrayStoreException زمانی که نوع داده ای که در خانه آرایه ریخته می شود با خود نوع آرایه متفاوت باشد این exception رخ خواهد داد.
* ClassCastException این Exception در زمان تبدیل نوع و تبدیل کلاس رخ می دهد. و زمانی این اتفاق می افتد که جاوا نتواند تبدیل نوع را انجام بدهد.
* IllegalArgumentException زمانی که از آرگومان های ورودی نامعتبر برای فراخوانی یک متد استفاده شود این exception رخ خواهد داد.
* NegativeArraySizeException زمانی که یک آرایه با سایز منفی ساخته شود این exception رخ می دهد.
* NullPointerException این استثنا زمانی اتفاق می افتد که از اشیائی استفاده کنیم که مقداردهی نشده باشند و null هستند.
* NumberFormatException این استثنا زمانی رخ می دهد که بخواهیم یک متن را به عدد تبدیل کنیم ولی متن مورد نظر دارای قالب عددی صحیحی نباشد.
* UnsupportedOperationException این exception زمانی رخ می دهد که از عملیاتی استفاده شود که زبان جاوا از آن پشتیبانی نکند.
Exception های زیر نیز exceptionهای چک شده معمول هستند.
* ClassNotFoundException این exception برای زمانی است که کلاس مورد نظر پیدا نشود.
* IllegalAccessException زمانی که بخواهیم به کلاسی که دسترسی نداریم دسترسی داشته باشیم این استثنا رخ خواهد داد.
* InstantiationException زمانی که بخواهیم از یک کلاس abstract و یا اینترفیس یک شئ بسازیم این استثنا رخ خواهد داد.
* NoSuchFieldException وقتی که فیلد مورد نظر وجود نداشته باشد این استثنا رخ خواهد داد
* NoSuchMethodExceptionزمانی که متد مورد نظر وجود نداشته باشد این استثنا رخ خواهد داد.
تا به این قسمت از مطلب به معرفی exception ها پرداختیم. در مطالب بعدی به مدیریت هرکدام از این exception ها خواهیم پرداخت.*Itpro باشید*


نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

همانطور که گفته شد یکی از مهمترین و معمول ترین Exception ها از نوع RuntimeException می باشد. Exception های زیر مجموعه ای از Exception های چک نشده زیرکلاس RuntimeException هستند.

  • ArithmeticException: این Exception در زمانی که خطایی در محاسبات ریاضی رخ داده باشد اتفاق می افتد. برای مثال زمانی که تقصیم بر صفر انجام شود این Exception رخ خواهد داد.
  • ArrayIndexOutOfBoundsException: این exception زمانی رخ می دهد که اندیس خارج از خانه های آرایه باشد.
  • ArrayStoreException زمانی که نوع داده ای که در خانه آرایه ریخته می شود با خود نوع آرایه متفاوت باشد این exception رخ خواهد داد.
  • ClassCastException این Exception در زمان تبدیل نوع و تبدیل کلاس رخ می دهد. و زمانی این اتفاق می افتد که جاوا نتواند تبدیل نوع را انجام بدهد.
  • IllegalArgumentException زمانی که از آرگومان های ورودی نامعتبر برای فراخوانی یک متد استفاده شود این exception رخ خواهد داد.
  • NegativeArraySizeException زمانی که یک آرایه با سایز منفی ساخته شود این exception رخ می دهد.
  • NullPointerException این استثنا زمانی اتفاق می افتد که از اشیائی استفاده کنیم که مقداردهی نشده باشند و null هستند.
  • NumberFormatException این استثنا زمانی رخ می دهد که بخواهیم یک متن را به عدد تبدیل کنیم ولی متن مورد نظر دارای قالب عددی صحیحی نباشد.
  • UnsupportedOperationException این exception زمانی رخ می دهد که از عملیاتی استفاده شود که زبان جاوا از آن پشتیبانی نکند.

Exception های زیر نیز exceptionهای چک شده معمول هستند.

  • ClassNotFoundException این exception برای زمانی است که کلاس مورد نظر پیدا نشود.
  • IllegalAccessException زمانی که بخواهیم به کلاسی که دسترسی نداریم دسترسی داشته باشیم این استثنا رخ خواهد داد.
  • InstantiationException زمانی که بخواهیم از یک کلاس abstract و یا اینترفیس یک شئ بسازیم این استثنا رخ خواهد داد.
  • NoSuchFieldException وقتی که فیلد مورد نظر وجود نداشته باشد این استثنا رخ خواهد داد
  • NoSuchMethodExceptionزمانی که متد مورد نظر وجود نداشته باشد این استثنا رخ خواهد داد.

تا به این قسمت از مطلب به معرفی exception ها پرداختیم. در مطالب بعدی به مدیریت هرکدام از این exception ها خواهیم پرداخت.

معرفی و شرح Exception ها قسمت 2

در مطلب قبلی به مفاهیم exception ها و معرفی آنها پرداختیم. ولی نحوه مدیریت آنها و نحوه برخورد با هرکدام را توضیح ندادیم. در این مطلب قصد داریم که مبحث Exception ها را بیشتر پیش ببریم و با این مبحث ازبرنامه نویسی جاوا بیشتر آشنا شویم.

 معرفی کاربرد متدهای exception ها

گفتیم که همه ی Exception ها از کلاس Throwable مشتق شده اند و متدهای زیر متدهای کلاس Throwable می باشد که در همه ی exception ها وجود دارد.

  • متد getMessage این متد پیامی را در مورد exception رخ داده شده را در قالب String برمی گرداند این پیام در constructor کلاس Throwable قرار داده شده است.
  • متد getCause این متد دلیل رخ دادن exception به وجود آمده را در قالب یک شئ Throwable بر می گرداند.
  • متد printStackTrace این متد نه ورودی دارد و نه مقدار بازگشتی دارد. وظیفه این متد این است که سلسله مراتب کلاس ها و محل هایی از کلاس ها که exception در آنها رخ داده است را به ترتیب در خروجی چاپ می کند و می توان با استفاده از اطلاعات این متد فهمید که خطا و exception در چه محلی رخ داده است.
  • متد getStackTrace متد قبلی سلسله مراتب محل خطاها را چاپ می کرد حال اگر بخواهیم این اطلاعات را در یک آرایه داشته باشیم که بتوانیم بر روی آنها اعمال مختلفی انجام دهیم از این متد استفاده می کنیم. این متد همه ی اطلاعات stack trace را در یک آرایه از اشیاء StackTraceElement قرار می دهد و این آرایه را برمی گرداند.
  • متد fillInStackTrace این متد ورودی ندارد و شئ جاری را با stackTrace جاری پر می کند.

آموزش مدیریت exception ها (به دام انداختن)

برای این که بتوانیم در هنگام وقوع یک exception آن را تشخیص داده و عمل خاصی را انجام دهیم از کلمات کلیدی try, catch استفاده می کنیم. Try, catch اسم بلوک های کد است که برای مدیریت exception ها به کار می رود. کدهایی را که ممکن است exception تولید کنند را داخل بلوک try قرار می دهیم و عمل مربوط به هرکدام از exception ها را داخل بلوک های catch می نویسیم. نحوه نوشتن و استفاده از این بلوک ها در برنامه جاوا به شکل زیر خواهد بود:

try
{
   //Protected code
}catch(ExceptionName e1)
{
   //Catch block
}

به کدی که داخل بلوک try قرار می گیرد کد محافظت شده می گویند. دقت داشته باشید که بلوک های catch باید بلافاصله بعد از بلوک try قرار بگیرند. بعد از هر بلوک try هم باید بلوک های catch ویا بلوک finally بیاید. بلوک های catch برای درگیر شدن با exception ها به کار می روند.

اصولا هر بلوک catch برای مدیریت یک Exception به کار می رود. وقتی که در داخل کدهای بلوک try خطایی رخ دهد بلوک catch مربوط به آن بلوک اجرا خواهد شد. در کد زیر مثالی از مدیریت exception ها را با استفاده از بلوک های try, catch آورده ایم. در این مثال ما یک آرایه 2 خانه ای تعریف کرده ایم ولی در داخل برنامه قصد داریم که به خانه سوم آن دسترسی داشته باشیم که برنامه exception تولید می کند و ما آن exception را مدیریت می کنیم.

import java.io.*;
public class ExcepTest{

   public static void main(String args[]){
      try{
         int a[] = new int[2];
         System.out.println("Access element three :" + a[3]);
      }catch(ArrayIndexOutOfBoundsException e){
         System.out.println("Exception thrown  :" + e);
      }
      System.out.println("Out of the block");
   }
}

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

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block

آموزش استفاده از چندین بلوک catch

یک بلوک try می تواند چندین بلوک Catch را به دنبال داشته باشد. سینتکس نوشتاری چندین بلوک catch به شکل زیر خواهد بود:

try
{
   //Protected code
}catch(ExceptionType1 e1)
{
   //Catch block
}catch(ExceptionType2 e2)
{
   //Catch block
}catch(ExceptionType3 e3)
{
   //Catch block
}

در کد بالا 3 بلوک catch وجود دارد که هرکدام از آنها برای یک Exception خاص است. شما به هر تعداد که بخواهید می توانید بلوک catch بعد از یک بلوک try داشته باشید. زمانی که در کد داخل بلوک catch یک exception رخ دهد برنامه به دنبال اولین بلوک catch می رود.

اگر نوع exception مشخص شده دراین بلوک Catch با نوع exception رخ داده یکی بود کد های داخل بلوک اجرا خواهند شد. در غیر این صورت به دنبال بلوک catch دوم خواهد رفت و در صورت عدم تطبیق نوع exception ها به سراغ exception بعدی خواهد رفت. این عمل به همین ترتیب انجام خواهد شد تا بلوک مورد نظر پیدا شود. در صورتی که بلوک Catch مورد نظر پیدا نشد خطایی صادر خواهد شد و اجرای برنامه متوقف خواهد شد. برای مثال به کد زیر دقت کنید

try
{
   file = new FileInputStream(fileName);
   x = (byte) file.read();
}catch(IOException i)
{
   i.printStackTrace();
   return -1;
}catch(FileNotFoundException f) //Not valid!
{
   f.printStackTrace();
   return -1;
}

آموزش مدیریت همزمان بیش از یک exception

از نسخه 7 جاوا به بعد این امکان به وجود آمده است که به عنوان ورودی یک بلوک Catch بتوان چند exception را فرستاد و هرکدام از exception ها را با استفاده از | جدا نمود. برای مثال به کد زیر دقت کنید:

catch (IOException|FileNotFoundException ex) {
   logger.log(ex);
   throw ex;

آموزش کلمات کلیدی throw, throws

اگر داخل متدی از کدهایی استفاده کردیم که امکان رخ دادن exception چک شده داشته باشد و آن را داخل try, catch قرار ندهیم باید از کلمه کلیدی throws استفاده کنیم. این کلمه کلیدی هنگام تعریف تابع و در خط اول قرار می گیرد. اما کاربرد کلمه کلیدی throw به طور کامل با throwsتفاوت دارد.

این کلمه کلیدی برای زمانی است که بخواهیم به طور دستی یک exception را بسازیم و با استفاده از throw می توان کاری کرد که یک exception رخ دهد. به عبارت دیگر کلمه کلیدی throws برای این است که نوشتن try, catch را به عقب بیندازیم ولی کلمه throw برای ساختن یک exception به طور دستی است. یک مثال از کلمه کلیدی throwsو throw برای RemoteException در کد زیر آورده ایم.

import java.io.*;
public class className
{
   public void deposit(double amount) throws RemoteException
   {
      // Method implementation
      throw new RemoteException();
   }
   //Remainder of class definition
}

متدی که می سازیم ممکن است که چندین exception را تولید کند که می توان هنگام تعریف آن در جلوی کلمه کلیدی throws این exception ها را به ترتیب آورد. برای مثال به کد زیر دقت کنید که دو exception را در جلوی throws آورده است.

import java.io.*;
public class className
{
   public void withdraw(double amount) throws RemoteException,
                              InsufficientFundsException
   {
       // Method implementation
   }
   //Remainder of class definition
}

تا به این قسمت از مطالب به معرفی و نحوه مدیریت exception ها در جاوا پرداختیم. در قسمت بعدی مطالب بیشتری در مورد Exception ها خواهیم گفت

معرفی و شرح Exception ها قسمت 3

در ادامه مباحث در مورد Exception ها در این مطلب نیز به ادامه آموزش نحوه مدیریت exception ها در جاوا خواهیم پرداخت.

بررسی مفهوم بلوک finally

بلوک finally به دنبال بلوک try و بعد از بلوک های catch می آید. استفاده از این بلوک اختیاری می باشد. کد هایی که در درون بلوک finally قرار می گیرند به هر حال اجرا می شوند. به این معنی که اگر exception رخ دهد و یا رخ ندهد کدهای این بلوک اجرا خواهند شد. کد های که در این بلوک قرار می گیرند معمولا کدهایی هستند که برای تمیز کردن حافظه و آزاد کردن فایل ها و اعمال این چنینی می باشد. نحوه استفاده از این بلوک در کد زیر آورده شده است.

try
{
   //Protected code
}catch(ExceptionType1 e1)
{
   //Catch block
}catch(ExceptionType2 e2)
{
   //Catch block
}catch(ExceptionType3 e3)
{
   //Catch block
}finally
{
   //The finally block always executes.
}

برای مثالی از استفاده از این بلوک و درک بهتر آن به کد زیر توجه کنید :

public class ExcepTest{

   public static void main(String args[]){
      int a[] = new int[2];
      try{
         System.out.println("Access element three :" + a[3]);
      }catch(ArrayIndexOutOfBoundsException e){
         System.out.println("Exception thrown  :" + e);
      }
      finally{
         a[0] = 6;
         System.out.println("First element value: " +a[0]);
         System.out.println("The finally statement is executed");
      }
   }
}

خروجی برنامه بالا به شکل زیر خواهد بود:

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
First element value: 6
The finally statement is executed

در مورد بلوک های try, catch , finally به نکات زیر توجه کنید:

  • بلوک catch هرگز بدون بلوک try نمی تواند باشد.
  • بلوک finally یک بلوک اختیاری است و گاهی اوقات لزومی ندارد که این بلوک نیز آورده شود.
  • بلوک try را نمی توان به تنهایی به کار برد و باید حداقل یک بلوک catch یا finally همراه آن باشد.
  • بین بلوک های try, catch, finally نمی توان هیچ کدی قرار داد.

 معرفی کاربرد بلوک try پیشرفته

معمولا وقتی از منابعی مانند استریم ها و یا کانکشن های استفاده می کنیم باید بعد از این که کارمان تمام شد آن را ببندیم. اگر از بلوک try استفاده کرده باشیم این کار را در داخل بلوک finally انجام می دهیم. برای مثال در برنامه زیر ما اطلاعات را از یک فایل توسط کلاس FileReader می خوانیم و سپس آن را در داخل بلوک finally می بندیم.

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class ReadData_Demo {

   public static void main(String args[]){
      FileReader fr=null;		
      try{
         File file=new File("file.txt");
         fr = new FileReader(file);  char [] a = new char[50];
         fr.read(a); // reads the content to the array
         for(char c : a)
         System.out.print(c); //prints the characters one by one
      }catch(IOException e){
          e.printStackTrace();
       }
       finally{	
          try{
              fr.close();
          }catch(IOException ex){		
               ex.printStackTrace();
           }
       }
    }

}

حال نسخه دیگری از try وجود دارد که ما را از بستن کانکشن ها و استریم ها در قسمت finally راحت می کند. این نوع try به صورت اتوماتیک منابع را مدیریت می کند. این نوع try در زمان جاوا نسخه 7 به جاوا اضافه شده است. این نوع try پس از این که بلوک try, catch به اتمام رسید منابع را آزاد می کند.

نحوه استفاده از این امکان بسیار ساده است. برای این کار شما باید منابعی را که تعریف می کنید در یک پرانتز در جلوی try بیاورید. با این کار منبع معرفی شده در پایان بلوک های try, catch آزاد خواهد شد. نحوه نوشتن این نوع try به شکل زیر است:

try(FileReader fr=new FileReader("file path"))
   {
   //use the resource
   }catch(){
      //body of catch 
    }
   }

در مثال زیر مقادیری از یک فایل خوانده می شود و در انتها فایل آزاد می شود. به برنامه زیر دقت کنید:

import java.io.FileReader;
import java.io.IOException;

public class Try_withDemo {

   public static void main(String args[]){
      		
      try(FileReader fr=new FileReader("E://file.txt")){
         char [] a = new char[50];
         fr.read(a); // reads the contentto the array
         for(char c : a)
         System.out.print(c); //prints the characters one by one
      }catch(IOException e){
          e.printStackTrace();
       }   
   }
}

در استفاده از این نوع try باید نکاتی را در نظر داشت که در ادامه این نکات آورده شده است.

  • هر منبعی که در این نوع try مورد استفاده قرار می گیرد باید اینترفیس AutorClosable را پیاده سازی کرده باشد و متد close داشته باشد و بتوان این متد را به صورت اتوماتیک در زمان اجرا فراخوانی کرد.
  • شما می توانید هنگام تعریف منابع بیش از یک کلاس از منابع را نیز تعریف کرد.
  • اگر چندین کلاس از منابع را در اول try تعریف کرده باشید نحوه بسته شدن آنها به ترتیب از آخرین منبع به اولین منبع خواهد بود.
  • به جز معرفی منابع در بین پرانتز های این نوع try, catch تفاوتی با try, catch قبلی ندارد.
  • منبعی که در بین پرانتزها تعریف می شود به شکل ضمنی از نوع final است.

بررسی Exception های تعریف شده توسط کاربر

در زبان جاوا می توان exception ی که خودمان تعریف کرده ایم را فعال کنیم. فقط برای تعریف یک کلاس exception باید به نکات زیر توجه کنید.

  • همه ی Exception ها باید فرزند Throwable باشند و از آن ارث برده باشند.
  • اگر می خواهید exception چک شده بسازید که در زمان کامپایل کاربر را مجبور به مدیریت exception کند باید کلاسی که می سازید فرزند کلاس Exception باشد.
  • اگر می خواهید که exception شما exception زمان اجرا باشد باید کلاس شما فرزند RuntimeException باشد.

نحوه تعریف کلاس به شکل زیر است:

class MyException extends Exception{
}

برای تعریف کلاس شما فقط لازم است که از کلاس از قبل تعریف شده Exception در کلاس خود ارث برده باشید. این exception ساخته شده یک exception چک شده خواهد بود. در مثال زیر یک exception به نام InsufficientFundsException تعریف کرده ایم که از کلاس Exception ارث برده است. دقت داشته باشید که کلاس Exception نیز مانند کلاس های دیگر می تواند متدها و فیلد های مختص به خود را داشته باشد.

import java.io.*;

public class InsufficientFundsException extends Exception
{
   private double amount;
   public InsufficientFundsException(double amount)
   {
      this.amount = amount;
   } 
   public double getAmount()
   {
      return amount;
   }
}

نحوه استفاده از exception تعریف شده توسط کاربر را در مثال زیر نشان داده ایم. دقت داشته باشید که متد withdraw() یک excetption از نوع InsufficientFundsException تولید خواهد کرد.

import java.io.*;

public class CheckingAccount
{
   private double balance;
   private int number;
   
   public CheckingAccount(int number)
   {
      this.number = number;
   }
   
   public void deposit(double amount)
   {
      balance += amount;
   }
   
   public void withdraw(double amount) throws InsufficientFundsException
   {
      if(amount <= balance)
      {
         balance -= amount;
      }
      else
      {
         double needs = amount - balance;
         throw new InsufficientFundsException(needs);
      }
   }
   
   public double getBalance()
   {
      return balance;
   }
   
   public int getNumber()
   {
      return number;
   }
}

برنامه زیر نحوه استفاده از متدهای deposite و withdraw را برای چک کردن حساب نشان می دهد.

public class BankDemo
{
   public static void main(String [] args)
   {
      CheckingAccount c = new CheckingAccount(101);
      System.out.println("Depositing $500...");
      c.deposit(500.00);
      
      try
      {
         System.out.println("\nWithdrawing $100...");
         c.withdraw(100.00);
         System.out.println("\nWithdrawing $600...");
         c.withdraw(600.00);
      }catch(InsufficientFundsException e)
      {
         System.out.println("Sorry, but you are short $" + e.getAmount());
         e.printStackTrace();
      }
    }
}

اگر کد های بالا را کامپایل کنیم خروجی به شکل زیر خواهد بود:

Depositing $500...

Withdrawing $100...

Withdrawing $600...
Sorry, but you are short $200.0
InsufficientFundsException
        at CheckingAccount.withdraw(CheckingAccount.java:25)
        at BankDemo.main(BankDemo.java:13)

استفاده از انوع کلاس های داخلی

در این مطلب قصد داریم در مورد کلاس ها و مفاهیم آن صحبت کنیم. ولی نه همه کلاس ها بلکه نوع خاصی از کلاس ها را مدنظر خواهیم داشت. این کلاس ها کلاس های داخلی جاوا خواهند بود.

 معرفی کاربرد کلاس های تو در تو

در جاوا هر کلاس می تواند اعضای خود را داشته باشد. این اعضا می توانند متغیر ها و فیلد ها و متدها و کلاس های داخلی باشند. شما می توانید در یک کلاس یک کلاس دیگر تعریف کنید. کلاسی که در داخل کلاس دیگر تعریف می شود را nested class گویند و کلاسی که در برگیرنده کلاس داخلی است را outer class می گویند. نحوه نشوتن کلاس های داخلی به شکل زیر خواهد بود. در این تعریف کلاس داخلی Nested و نام کلاس خارجی را Outer نامگذاری کرده ایم.

class Outer{
   class Nested{   
   }   
}

کلاسهای داخلی به دو نوع استاتیک و غیر استاتیک تقسیم می شوند.

 معرفی کاربرد کلاس های داخلی غیر استاتیک

استفاده از کلاس های داخلی یک مکانیزم امنیتی در جاوا است. می دانیم که یک کلاس خارجی را نمی توانی به صورت private در جاوا معرفی کنیم. ولی وقتی که یک کلاس را در درون کلاس دیگر در جاوا معرفی می کنیم آن کلاس به عنوان یکی از اعضای کلاس در برگیرنده است و می توان آن را به صورت private نیز استفاده کرد و از استفاده های خارج از کلاس دربرگیرنده جلوگیری کرد. کلاس های داخلی با توجه به این که کجا و چگونه تعریف شده اند به سه دسته تقسیم خواند شد. کلاس های داخلی و کلاس های داخل متدی و کلاس های داخلی بینام.

 معرفی کاربرد کلاس های داخلی Inner Class

ساختن یک کلاس داخلی بسیار ساده است. شما فقط یک کلاس را در داخل کلاس اصلی تعریف می کنید. برخلاف تعریف کلاس های Outer می توانید کلاس های داخلی را به صورت private هم تعریف کنید. اگر یک کلاس داخلی را به صورت private تعریف کنید این کلاس خارج از کلاس outer خود قابل دسترس نخواهد بود. در ادامه برنامه ای آورده شده است که یک کلاس داخلی را می سازد و دسترسی به آن را نشان می دهد. در این برنامه ما کلاس داخلی را به صورت private می سازیم و در یک متد به آن دسترسی داریم.

class Outer_Demo{
   int num;
   //inner class
   private class Inner_Demo{
      public void print(){	   
         System.out.println("This is an inner class");
      }
   }
   //Accessing he inner class from the method within
   void display_Inner(){
      Inner_Demo inner = new Inner_Demo();
      inner.print();
   }
}
   
public class My_class{
   public static void main(String args[]){
      //Instantiating the outer class 
      Outer_Demo outer = new Outer_Demo();
      //Accessing the display_Inner() method.
      outer.display_Inner();
   }

}

در این مثال مشاهده می کنید که کلاس OuterDemo یک کلاس Outer است و کلاس InnerDemo یک کلاس داخلی است که در داخل کلاس OuterDemo قرار دارد. متد displayInner متدی است که از کلاس داخلی استفاده می کند و این متد از داخل متد main فراخوانی می شود. اگر کد بالا را اجرا کنید نتیجه اجرای کد بالا به شکل زیر خواهد بود:

This is an inner class.

آموزش دادن دسترسی به اعضای private

همانگونه که قبلا گفته شد کلاس های داخلی را می توان در داخل یک کلاس به صورت private نیز معرفی کرد. حال می خواهیم یک روش برای دسترسی به فیلدهای private یک کلاس معرفی کنیم. یک کلاس داخلی به اعضای داخلی یک کلاس دسترسی دارد.

حتی اگر آن اعضای کلاس به صورت private تعریف شده باشند. حال اگر ما یک کلاس داخلی تعریف کنیم می توانیم توسط این کلاس به سایر اعضای private کلاس Outer نیز دسترسی داشته باشیم. برای انجام این کار ما یک کلاس Outer تعریف می کنیم

و داخل آن یک کلاس داخلی تعریف می کنیم که این کلاس داخلی یک متد به نام getValue دارد. از داخل این متد می توان به اعضای کلاس outer دسترسی داشت. حال برای این که در خارج از کلاس به اعضای داخلی کلاس Outer دسترسی داشته باشیم یک شئ از کلاس داخلی می سازیم و متد getValue را فراخوانی می کنیم. برای درک بهتر و راحت تر این مفهوم به کد زیر دقت کنید.

class Outer_Demo {
   //private variable of the outer class
   private int num= 175;  
   //inner class   
   public class Inner_Demo{
      public int getNum(){
         System.out.println("This is the getnum method of the inner class");
         return num;
      }
   }
}

public class My_class2{
   public static void main(String args[]){
      //Instantiating the outer class
      Outer_Demo outer=new Outer_Demo();
      //Instantiating the inner class
      Outer_Demo.Inner_Demo inner=outer.new Inner_Demo();
      System.out.println(inner.getNum());
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

The value of num in the class Test is: 175

 معرفی کاربرد کلاس های داخلی درون متدها

در زبان جاوا ما قادر هستیم که در داخل یک متد یک کلاس تعریف کنیم و این یک کلاس محلی خواهد بود. مانند متغیر محلی کلاس محلی نیز فقط داخل متد قابل شناسایی است و بیرون از متد شناخته شده نیست. از کلاسی که داخل متد تعریف شده است فقط می توان داخل متد شئ ساخت. برنامه زیر به شما نشان می دهد که چگونه یک کلاس درون متد بسازیم و از آن استفاده کنیم.

public class Outerclass{
   
   //instance method of the outer class 
   void my_Method(){
      int num = 23;
   
      //method-local inner class
      class MethodInner_Demo{
         public void print(){
            System.out.println("This is method inner class "+num);	   
         }   
      }//end of inner class
	   
      //Accessing the inner class
      MethodInner_Demo inner = new MethodInner_Demo();
      inner.print();
   }
   
   public static void main(String args[]){
      Outerclass outer = new Outerclass();
      outer.my_Method();	   	   
   }
}

خروجی کد بالا به شکل زیر خواهد بود:

This is method inner class 23

 معرفی کاربرد کلاس های داخلی بینام

کلاس داخلی که نام نداشته باشد را کلاس داخلی بینام می نامیم. در این نوع کلاس ها ما در همان زمانی که یک کلاس را تعریف می کنیم یک شئ هم از آن می سازیم. این کلاس ها در زمانی استفاده می شود که شما می خواهید یک متد را Override کنید و یا از یک کلاس و یا اینترفیس کلاسی به ارث ببرید و همانجا آن کلاس را تعریف کنید و از آن استفاده کنید. نحوه نوشتاری این نوع کلاس ها به شکل زیر است:

AnonymousInner an_inner = new AnonymousInner(){
   public void my_method(){
   ........
   ........
   }	    
};

برنامه زیر نشان می دهد که چگونه از یک کلاس بینام استفاده می شود و یک متد را override می کنیم.

abstract class AnonymousInner{
   public abstract void mymethod();
}

public class Outer_class {
   public static void main(String args[]){
      AnonymousInner inner = new AnonymousInner(){
         public void mymethod(){
            System.out.println("This is an example of anonymous inner class");    	  
         }	    
      };
      inner.mymethod();	
   }
}

اگر برنامه بالا را کامپایل کنید خروجی به شکل زیر خواهد بود:

This is an example of anonymous inner class

شما می توانید متدهای کلاس های معمولی را مانند اینترفیس ها در کلاس های بی نام تغییر دهید.

آموزش استفاده از کلاس داخلی بی نام به عنوان پارامتر ورودی

به طور معمول در جایی که یک متد وجود دارد که یک شئ از یک اینترفیس یا کلاس abstract و یا حتی کلاس معمولی را به عنوان آرگومان ورودی می گیرد می توانیم همان اینترفیس را در همانجا به عنوان یک کلاس داخلی پیاده سازی کنیم و یا کلاس abstract را ارث بری نماییم و آنها را در قالب یک شئ به متد پاس بدهیم. در هر سه شکلی که گفته شد می توان یک کلاس بی نام همانجا تعریف کرد و به عنوان یک شئ به داخل متد به عنوان پارامتر ورودی فرستاد. نحوه نوشتن این نوع کلاس ها به شکل زیر است:

obj.my_Method(new My_Class(){
   public void Do(){
   .....
   .....
   }
});

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

//interface
interface Message{
   String greet();	
}

public class My_class {
   //method which accepts the object of interface Message
   public void displayMessage(Message m){
      System.out.println(m.greet() +", This is an example of anonymous inner calss as an argument");	   
   }

   public static void main(String args[]){
      //Instantiating the class
      My_class obj = new My_class();
		
      //Passing an anonymous inner class as an argument
      obj.displayMessage(new Message(){
         public String greet(){
            return "Hello";  		   
         }
      });
   }
}

خروجی برنامه بالا به شکل زیر خواهد بود:

Hello This is an example of anonymous inner class as an argument

 معرفی کاربرد کلاس های داخلی استاتیک

یک کلاس داخلی استاتیک کلاسی است که به صورت استاتیک در داخل کلاس تعریف شده است و یکی از اعضای استاتیک کلاس است. می توان بدون این که است کلاس Outer شیئی ساخته شود به این کلاس دسترسی داشت.. این نوع کلاس همچنین می تواند سایر اعضای استاتیک کلاس را تغییر بدهد. مانند بقیه اعضای استاتیک کلاس این نوع کلاس فقط می تواند به اعضای استاتیک دسترسی داشته باشد. نحوه نوشتاری این نوع کلاس مانند شکل زیر است:

class MyOuter {
   static class Nested_Demo{
   }
}

برای استفاده از این نوع کلاس به شکل زیر عمل می کنیم:

public class Outer{
   static class Nested_Demo{
      public void my_method(){
         System.out.println("This is my nested class");
      }
   }
   
   public static void main(String args[]){
      Outer.Nested_Demo nested = new Outer.Nested_Demo();	 
      nested.my_method();
   }
   
}

خروجی برنامه بالا به شکل زیرخواهد بود:

This is my nested class

وراثت کلاس ها و انواع آن

آموزش هایی که تا به حال در مورد زبان جاوا گفتیم بیشتر مطالب مقدماتی یادگرفتن زبان برنامه نویسی جاوا بود و به گونه ای مطالب گفته شده پایه برنامه نویسی زبان جاوا محسوب می شوند. ولی در مطالب گفته شده آنچنان به مفاهیم شئ گرایی و خواص شئ گرایی جاوا پرداخته نشد.

حال از این آموزش به بعد قصد داریم که مطالب شئ گرایی را در جاوا بیان کنیم و هرکدام را به صورت مفصل توضیح دهیم. امیدوارم که بتوانم این زبان قدرتمند و پراستفاده را به صورت درست شرح دهم. یکی از خواص شئ گرایی که قبلا هم کم و بیش در مورد آن گفتیم ارث بری یا inheritance است.

ارث بری را می توان این گونه تعریف کرد که یک کلاس خصوصیاتی را از یک کلاس دیگر به ارث می برد. با استفاده از ارث بری اطلاعات به ارث برده شده طبق ارث بری آنها قابل مدیریت است. کلاسی که خصوصیات را به ارث می برد زیرکلاس یا کلاس مشتق شده یا کلاس فرزند نام دارد و کلاسی که خصوصیاتی را ارث می دهد به عنوان کلاس پایه و یا کلاس والد شناخته می شود.

آموزش استفاده از کلمه کلیدی extends

کلمه extends کلمه کلیدی است که برای وراثت خصوصیات از یک کلاس استفاده می شود. نحوه استفاده از این کلمه کلیدی در ادامه آمده است:

class Super{
   .....
   .....
}

class Sub extends Super{
   .....
   .....

}

برای این که وراثت در کلاس ها در زبان جاوا را بهتر بیان کنیم مثالی در ادامه آورده ایم.در این مثال دو کلاس آورده ایم که یکی Calculation و دیگری MyCalculation نام دارد. با استفاده از کلمه extends کلاس MyCalcuation متدهای addition و subtraction را از کلاس Calculation به ارث می برد.

class Calculation{ 
   int z;
	
   public void addition(int x, int y){
      z = x+y;
      System.out.println("The sum of the given numbers:"+z);
   }
	
   public void Substraction(int x,int y){
      z = x-y;
      System.out.println("The difference between the given numbers:"+z);
   }
   
}

public class MyCalculation extends Calculation{    
  
   public void multiplication(int x, int y){
      z = x*y;
      System.out.println("The product of the given numbers:"+z);
   }
	
   public static void main(String args[]){
      int a = 20, b = 10;
      MyCalculation demo = new My_Calculation();
      demo.addition(a, b);
      demo.Substraction(a, b);
      demo.multiplication(a, b);      
   }

}

حال اگر برنامه بالا را کامپایل و اجرا کنید نتیجه اجرای برنامه به شکل زیر خواهد بود:

The sum of the given numbers:30
The difference between the given numbers:10
The product of the given numbers:200

در برنامه بالا شیئی که از کلاس MyCalculation ساخته می شود همه ی متدهای کلاس والد را نیز به همراه خود دارد. به این معنی که با استفاده از شئ فرزند می توان به متدها و فیلدهای public کلاس والد هم دسترسی داشت. اگر شما شیئی داشته باشید که از کلاس والد ساخته شده باشد این شئ فقط می تواند به اعضای کلاس والد دسترسی داشته باشد در حالی که کلاس از کلاس فرزند هم به اعضای کلاس فرزند و هم به اعضای کلاس پدر دسترسی دارد.

برای مثال در برنامه بالا اگر شیئی از کلاس Calculation ساخته شده باشد. این شئ نمی تواند به متد multiplication دسترسی داشته باشد. زیرا که این متد مربوط به کلاس فرزند یعنی MyCalculation می باشد. دقت داشته باشید که یک کلاس فرزند همه ی اعضا(فیلدها و متدها و کلاس های داخلی) را از کلاس والد به ارث می برد. Constructor ها جزء این اعضا محسوب نمی شوند و به ارث برده نمی شوند اما سازنده کلاس والد می تواند از داخل کلاس فرزند فراخوانی شود.

آموزش استفاده از کلمه کلیدی super

این کلمه کلیدی شبیه به کلمه this می باشد ولی این کلمه کلیدی برای ارجاع به کلاس والد استفاده می شود. یکی از کاربرد های آن تفاوت قایل شدن بین اعضای خود کلاس و اعضای کلاس والد است. این کار در صورتی که نام یکی از اعضا هم در کلاس والد تعریف شده باشد و هم در کلاس فرزند. کاربرد دیگر این کلمه کلیدی فراخوانی constructor کلاس والد است.

 بررسی تفاوت قایل شدن بین اعضا

اگر یک کلاس مشخصات خود را از کلاس دیگری ارث برده باشد و اگر اعضای کلاس پدر نام هایی داشته باشند که آن نام در بین اعضای کلاس فرزند نیز موجود باشد اگر در داخل کلاس فرزند نام آن عضو را قرار بدهیم، کامپایلر عضو مربوط به کلاس فرزند را در نظر می گیرد و اگر بخواهیم به کلاس پدر دسترسی داشته باشیم از کلمه کلیدی super استفاده خواهیم کرد.

برای درک بهتر این کلمه کلیدی و استفاده از آن برای تفاوت قایل شدن بین اعضای کلاس والد و فرزند مثالی آورده ایم که در کد زیر مشاهده می کنید. در این برنامه یک کلاس به نام SubClass و یک کلاس دیگر به نام SuperClass داریم که هر دوی آن ها بک متد به نام display دارد. هر کدام از این متدها دارای پیاده سازی جداگانه ای هستند. در برنامه زیر می بینید که هرکدام از این متد ها را چگونه فراخوانی می کنیم و چگونه بین آنها تفاوت می گذاریم.

class SuperClass{

   int num = 20;
   
   //display method of superclass
   public void display(){   
      System.out.println("This is the display method of superclass");
   }	

}

public class SubClass extends Super_class {

   int num = 10;
   
   //display method of sub class
   public void display(){
      System.out.println("This is the display method of subclass");
   }
   
   public void myMethod(){
	  
      //Instantiating subclass
      SubClass sub = new SubClass();
	  
      //Invoking the display() method of sub class
      sub.display();
	  
      //Invoking the display() method of superclass
      super.display();
	  
      //printing the value of variable num of subclass
      System.out.println("value of the variable named num in sub class:"+ sub.num);
		  
      //printing the value of variable num of superclass
      System.out.println("value of the variable named num in super class:"+ super.num);     
   }
   
   public static void main(String args[]){
      SubClass obj = new SubClass();
      obj.myMethod();
      
   }
}

اگر برنامه بالا را کامپایل و اجرا کنید نتیجه اجرای برنامه به شکل زیر خواهد بود:

This is the display method of subclass
This is the display method of superclass
value of the variable named num in sub class:10
value of the variable named num in super class:20

آموزش فراخوانی constructor کلاس والد از داخل کلاس فرزند

اگر یک کلاس از کلاس دیگری ارث برده باشد، کلاس فرزند به طو پیشفرض کلاس والد را با constructor پیشفرض که بدون پارامتر ورودی است به ارث می برد. اما اگر بخواهید یکی از constructor های کلاس والد که دارای پارامتر ورودی است را فراخوانی کنید باید از کلمه کلیدی super استفاده کنید.

برای مثال و درک بهتر این کاربرد super به برنامه زیر دقت کنید. در این برنامه نشان می دهیم که چگونه با استفاده از کلمه کلیدی super می توان constructor مربوط به کلاس والد را فراخوانی کنیم. این برنامه یک کلاس والد و یک کلاس فرزند دارد که کلاس والد یک رشته را به عنوان پارامتر ورودی constructor می گیرد. و در کلاس فرزند با استفاده از کلمه کلیدی super آن constructor فراخوانی می شود.

class Superclass{
   
   int age;

   Superclass(int age){
      this.age = age; 		 
   }

   public void getAge(){
      System.out.println("The value of the variable named age in super class is: " +age);
   }

}

public class Subclass extends Superclass {
   
   Subclass(int age){
      super(age);
   }

   public static void main(String argd[]){
      Subclass s = new Subclass(24);
      s.getAge();
   }

}

خروجی برنامه بالا به شکل زیر خواهد بود:

The value of the variable named age in super class is: 24

 معرفی کاربرد رابطه Is-A

اگر بخواهیم بگوییم این شئ یک نوع از شئ دیگری است یک راه آن استفاده از رابطه از Is-A است. برای مثال ببر یک حیوان است. مرغ یک پرنده است. این رابطه در برنامه نویسی کاربرد بسیار دارد. این روش را می توان با استفاده از ارث بری و کلمه کلیدی extends می توان ساخت. برای مثال به تعریف کلاس های زیر که تعریف حیوانات است توجه کنید:

public class Animal{
}

public class Mammal extends Animal{
}

public class Reptile extends Animal{
}

public class Dog extends Mammal{
}

با توجه به تعاریف بالا و طبق قوانین شئ گرایی جمله های زیر صادق است:

  • Mammal یک Animal است زیرا از آن ارث برده است.
  • Reptile یک Animal است زیرا از آن ارث برده است.

* Dog یک Mammal است.

  • Dog یک Animal است.

با استفاده از کلمه کلیدی extends کلاس های فرزند همه ی خصوصیات کلاس های والد را به ارث می برند. به طور مثال در کد بالا کلاس Dog از کلاس Mammal ارث برده است ولی از آنجا که کلاس Mammal خود از کلاس Animal به ارث برده است پس کلاس Dog خصوصیات کلاس Animal را نیز به ارث خواهد برد. دقت داشته باشید که کلاس فرزند نمی تواند اعضای private کلاس والد را به ارث ببرد. برای مثال به کد زیر دقت کنید.

class Animal{
}

class Mammal extends Animal{
}

class Reptile extends Animal{
}

public class Dog extends Mammal{

   public static void main(String args[]){

      Animal a = new Animal();
      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}

خروجی برنامه بالا به شکل زیر خواهد بود:

true
true
true

پس از این که با مفهوم extends آشنا شدیم به بیان مفهوم implements می پردازیم. این کلمه کلید زمانی به کار برده می شود که بخواهیم خصوصیات موجود در یک اینترفیس را به ارث ببریم. برای اینترفیس ها نمی توان از کلمه کلیدی extends استفاده کرد. خود اینترفیس نیز نمی تواند از کلاسی ارث ببرد. برای مثال به کد زیر دقت کنید:

public interface Animal {
}

public class Mammal implements Animal{
}

public class Dog extends Mammal{
}

دقت داشته باشید که برای این که مشخص کنیم که یک کلاس از کلاس دیگر به ارث برده است یا خیر از کلمه کلیدی instaceof استفاده می کنیم.

 معرفی کاربرد رابطه Has-A

این رابطه بیشتر در این مورد است که آیا یک کلاس یک خاصیت به خصوص را دارد یا خیر. این خاصیت در برنامه نویسی شئ گرا به این امر کمک می کند که از نوشتن کدهای تکراری خود داری کنیم. برای مثال به کد زیر دقت کنید.

public class Vehicle{}
public class Speed{}

public class Van extends Vehicle{
	private Speed sp;
} 

کد بالا نشان می دهد که کلاس Van خصوصیت Speed را دارد. با استفاده از کلاس جداگانه برای Speed دیگر نیازی نداریم که کل کدهای کلاس Speed را برای Van نیز بیاوریم و فقط از آن استفاده می کنیم. با استفاده از خواص شئ گرایی نیازی نیست که کاربران بدانند که کار واقعی را کدام کلاس انجام می دهد و بهتر است این مسئله از دید کاربر مخفی باشد. در مثال بالا هم کلاس Van پیاده سازی Speed را از دید کاربر مخفی کرده است. تنها کاری که کلاس Van از Speed انتظار دارد این است که کارهای خاصی را انجام دهد.

معرفی انواع ارث بری در جاوا

ارث بری انواع مختلفی دارد که در تصویر زیر مشاهده می کنید

با سلام به همه دوستان و همراهان Itpro. آموزش هایی که تا به حال در مورد زبان جاوا گفتیم بیشتر مطالب مقدماتی یادگرفتن زبان برنامه نویسی جاوا بود و به گونه ای مطالب گفته شده پایه برنامه نویسی زبان جاوا محسوب می شوند. ولی در مطالب گفته شده آنچنان به مفاهیم شئ گرایی و خواص شئ گرایی جاوا پرداخته نشد. حال از این آموزش به بعد قصد داریم که مطالب شئ گرایی را در جاوا بیان کنیم و هرکدام را به صورت مفصل توضیح دهیم. امیدوارم که بتوانم این زبان قدرتمند و پراستفاده را به صورت درست شرح دهم. یکی از خواص شئ گرایی که قبلا هم کم و بیش در مورد آن گفتیم ارث بری یا inheritance است. ارث بری را می توان این گونه تعریف کرد که یک کلاس خصوصیاتی را از یک کلاس دیگر به ارث می برد. با استفاده از ارث بری اطلاعات به ارث برده شده طبق ارث بری آنها قابل مدیریت است. کلاسی که خصوصیات را به ارث می برد زیرکلاس یا کلاس مشتق شده یا کلاس فرزند نام دارد و کلاسی که خصوصیاتی را ارث می دهد به عنوان کلاس پایه و یا کلاس والد شناخته می شود.

!!کلمه کلیدی extends
کلمه extends کلمه کلیدی است که برای وراثت خصوصیات از یک کلاس استفاده می شود. نحوه استفاده از این کلمه کلیدی در ادامه آمده است:
<java>
class Super{
   .....
   .....
}

class Sub extends Super{
   .....
   .....

}
<java>
برای این که وراثت در کلاس ها در زبان جاوا را بهتر بیان کنیم مثالی در ادامه آورده ایم.در این مثال دو کلاس آورده ایم که یکی Calculation و دیگری MyCalculation نام دارد. با استفاده از کلمه extends کلاس MyCalcuation متدهای addition و subtraction را از کلاس Calculation به ارث می برد.
<java>
class Calculation{ 
   int z;
	
   public void addition(int x, int y){
      z = x+y;
      System.out.println(The sum of the given numbers:+z);
   }
	
   public void Substraction(int x,int y){
      z = x-y;
      System.out.println(The difference between the given numbers:+z);
   }
   
}

public class MyCalculation extends Calculation{    
  
   public void multiplication(int x, int y){
      z = x*y;
      System.out.println(The product of the given numbers:+z);
   }
	
   public static void main(String args[]){
      int a = 20, b = 10;
      MyCalculation demo = new My_Calculation();
      demo.addition(a, b);
      demo.Substraction(a, b);
      demo.multiplication(a, b);      
   }

}
<java>
حال اگر برنامه بالا را کامپایل و اجرا کنید نتیجه اجرای برنامه به شکل زیر خواهد بود:
<text>
The sum of the given numbers:30
The difference between the given numbers:10
The product of the given numbers:200
<text>
در برنامه بالا شیئی که از کلاس MyCalculation ساخته می شود همه ی متدهای کلاس والد را نیز به همراه خود دارد. به این معنی که با استفاده از شئ فرزند می توان به متدها و فیلدهای public کلاس والد هم دسترسی داشت. اگر شما شیئی داشته باشید که از کلاس والد ساخته شده باشد این شئ فقط می تواند به اعضای کلاس والد دسترسی داشته باشد در حالی که کلاس از کلاس فرزند هم به اعضای کلاس فرزند و هم به اعضای کلاس پدر دسترسی دارد. برای مثال در برنامه بالا اگر شیئی از کلاس Calculation ساخته شده باشد. این شئ نمی تواند به متد multiplication دسترسی داشته باشد. زیرا که این متد مربوط به کلاس فرزند یعنی MyCalculation می باشد. دقت داشته باشید که یک کلاس فرزند همه ی اعضا(فیلدها و متدها و کلاس های داخلی) را از کلاس والد به ارث می برد. Constructor ها جزء این اعضا محسوب نمی شوند و به ارث برده نمی شوند اما سازنده کلاس والد می تواند از داخل کلاس فرزند فراخوانی شود.

!!کلمه کلیدی super
این کلمه کلیدی شبیه به کلمه this می باشد ولی این کلمه کلیدی برای ارجاع به کلاس والد استفاده می شود. یکی از کاربرد های آن تفاوت قایل شدن بین اعضای خود کلاس و اعضای کلاس والد است. این کار در صورتی که نام یکی از اعضا هم در کلاس والد تعریف شده باشد و هم در کلاس فرزند. کاربرد دیگر این کلمه کلیدی فراخوانی constructor کلاس والد است.

!!تفاوت قایل شدن بین اعضا
اگر یک کلاس مشخصات خود را از کلاس دیگری ارث برده باشد و اگر اعضای کلاس پدر نام هایی داشته باشند که آن نام در بین اعضای کلاس فرزند نیز موجود باشد اگر در داخل کلاس فرزند نام آن عضو را قرار بدهیم، کامپایلر عضو مربوط به کلاس فرزند را در نظر می گیرد و اگر بخواهیم به کلاس پدر دسترسی داشته باشیم از کلمه کلیدی super استفاده خواهیم کرد. برای درک بهتر این کلمه کلیدی و استفاده از آن برای تفاوت قایل شدن بین اعضای کلاس والد و فرزند مثالی آورده ایم که در کد زیر مشاهده می کنید. در این برنامه یک کلاس به نام SubClass و یک کلاس دیگر به نام SuperClass داریم که هر دوی آن ها بک متد به نام display دارد. هر کدام از این متدها دارای پیاده سازی جداگانه ای هستند. در برنامه زیر می بینید که هرکدام از این متد ها را چگونه فراخوانی می کنیم و چگونه بین آنها تفاوت می گذاریم.
<java>
class SuperClass{

   int num = 20;
   
   //display method of superclass
   public void display(){   
      System.out.println(This is the display method of superclass);
   }	

}

public class SubClass extends Super_class {

   int num = 10;
   
   //display method of sub class
   public void display(){
      System.out.println(This is the display method of subclass);
   }
   
   public void myMethod(){
	  
      //Instantiating subclass
      SubClass sub = new SubClass();
	  
      //Invoking the display() method of sub class
      sub.display();
	  
      //Invoking the display() method of superclass
      super.display();
	  
      //printing the value of variable num of subclass
      System.out.println(value of the variable named num in sub class:+ sub.num);
		  
      //printing the value of variable num of superclass
      System.out.println(value of the variable named num in super class:+ super.num);     
   }
   
   public static void main(String args[]){
      SubClass obj = new SubClass();
      obj.myMethod();
      
   }
}
<java>
اگر برنامه بالا را کامپایل و اجرا کنید نتیجه اجرای برنامه به شکل زیر خواهد بود:
<text>
This is the display method of subclass
This is the display method of superclass
value of the variable named num in sub class:10
value of the variable named num in super class:20
<text>

!!فراخوانی constructor کلاس والد از داخل کلاس فرزند
اگر یک کلاس از کلاس دیگری ارث برده باشد، کلاس فرزند به طو پیشفرض کلاس والد را با constructor پیشفرض که بدون پارامتر ورودی است به ارث می برد. اما اگر بخواهید یکی از constructor های کلاس والد که دارای پارامتر ورودی است را فراخوانی کنید باید از کلمه کلیدی super استفاده کنید. برای مثال و درک بهتر این کاربرد super به برنامه زیر دقت کنید. در این برنامه نشان می دهیم که چگونه با استفاده از کلمه کلیدی super می توان constructor مربوط به کلاس والد را فراخوانی کنیم. این برنامه یک کلاس والد و یک کلاس فرزند دارد که کلاس والد یک رشته را به عنوان پارامتر ورودی constructor می گیرد. و در کلاس فرزند با استفاده از کلمه کلیدی super آن constructor فراخوانی می شود.
<java>
class Superclass{
   
   int age;

   Superclass(int age){
      this.age = age; 		 
   }

   public void getAge(){
      System.out.println(The value of the variable named age in super class is:  +age);
   }

}

public class Subclass extends Superclass {
   
   Subclass(int age){
      super(age);
   }

   public static void main(String argd[]){
      Subclass s = new Subclass(24);
      s.getAge();
   }

}
<java>
خروجی برنامه بالا به شکل زیر خواهد بود:
<text>
The value of the variable named age in super class is: 24

<text>

!!رابطه Is-A
اگر بخواهیم بگوییم این شئ یک نوع از شئ دیگری است یک راه آن استفاده از رابطه از Is-A است. برای مثال ببر یک حیوان است. مرغ یک پرنده است. این رابطه در برنامه نویسی کاربرد بسیار دارد. این روش را می توان با استفاده از ارث بری و کلمه کلیدی extends می توان ساخت. برای مثال به تعریف کلاس های زیر که تعریف حیوانات است توجه کنید:
<java>
public class Animal{
}

public class Mammal extends Animal{
}

public class Reptile extends Animal{
}

public class Dog extends Mammal{
}

<java>
با توجه به تعاریف بالا و طبق قوانین شئ گرایی جمله های زیر صادق است:
* Mammal یک Animal است زیرا از آن ارث برده است.
* Reptile یک Animal است زیرا از آن ارث برده است. 
 * Dog یک Mammal است.
* Dog یک Animal است.
با استفاده از کلمه کلیدی extends کلاس های فرزند همه ی خصوصیات کلاس های والد را به ارث می برند. به طور مثال در کد بالا کلاس Dog از کلاس Mammal ارث برده است ولی از آنجا که کلاس Mammal خود از کلاس Animal به ارث برده است پس کلاس Dog خصوصیات کلاس Animal  را نیز به ارث خواهد برد. دقت داشته باشید که کلاس فرزند نمی تواند اعضای private کلاس والد را به ارث ببرد. برای مثال به کد زیر دقت کنید.
<java>
class Animal{
}

class Mammal extends Animal{
}

class Reptile extends Animal{
}

public class Dog extends Mammal{

   public static void main(String args[]){

      Animal a = new Animal();
      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}
<java>
خروجی برنامه بالا به شکل زیر خواهد بود:
<text>
true
true
true

<text>
پس از این که با مفهوم extends آشنا شدیم به بیان مفهوم implements می پردازیم. این کلمه کلید زمانی به کار برده می شود که بخواهیم خصوصیات موجود در یک اینترفیس را به ارث ببریم. برای اینترفیس ها نمی توان از کلمه کلیدی extends استفاده کرد. خود اینترفیس نیز نمی تواند از کلاسی ارث ببرد. برای مثال به کد زیر دقت کنید:
<java>
public interface Animal {
}

public class Mammal implements Animal{
}

public class Dog extends Mammal{
}

<java>
دقت داشته باشید که برای این که مشخص کنیم که یک کلاس از کلاس دیگر به ارث برده است یا خیر از کلمه کلیدی instaceof استفاده می کنیم.

!!رابطه Has-A
این رابطه بیشتر در این مورد است که آیا یک کلاس یک خاصیت به خصوص را دارد یا خیر. این خاصیت در برنامه نویسی شئ گرا به این امر کمک می کند که از نوشتن کدهای تکراری خود داری کنیم. برای مثال به کد زیر دقت کنید.
<java>
public class Vehicle{}
public class Speed{}

public class Van extends Vehicle{
	private Speed sp;
} 

<java>
کد بالا نشان می دهد که کلاس Van خصوصیت Speed را دارد. با استفاده از کلاس جداگانه برای Speed دیگر نیازی نداریم که کل کدهای کلاس Speed را برای Van  نیز بیاوریم و فقط از آن استفاده می کنیم. با استفاده از خواص شئ گرایی نیازی نیست که کاربران بدانند که کار واقعی را کدام کلاس انجام می دهد و بهتر است این مسئله از دید کاربر مخفی باشد. در مثال بالا هم کلاس Van پیاده سازی Speed را از دید کاربر مخفی کرده است. تنها کاری که کلاس Van از Speed انتظار دارد این است که کارهای خاصی را انجام دهد.

!!انواع ارث بری 
ارث بری انواع مختلفی دارد که در تصویر زیر مشاهده می کنید
||http://tosinso.com/files/get/39dce960-f097-4efb-9d4d-5735d96e3bcd||
دقت داشته باشید که زبان جاوا از ارث بری چندگانه پشتیبانی نمی کند. این به این معنی است که جلوی کلمه extends فقط یک کلاس می توان قرار داد. ولی می توان با استفاده از اینترفیس ها و سلسله مراتب ارث بری، ارث بری چندگانه را شبیه سازی کرد.*Itpro باشید*

نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

دقت داشته باشید که زبان جاوا از ارث بری چندگانه پشتیبانی نمی کند. این به این معنی است که جلوی کلمه extends فقط یک کلاس می توان قرار داد. ولی می توان با استفاده از اینترفیس ها و سلسله مراتب ارث بری، ارث بری چندگانه را شبیه سازی کرد.

Override کردن متد ها

در مطالب قبلی در مورد کلاس های والد و کلاس های فرزند و وراثت کلاس ها صحبت کردیم. همانطور که گفتیم در وراثت متدهای کلاس والد نیز به کلاس فرزند به ارث می رسد. حال اگر بخواهیم همان متدها را بازنویسی کنیم باید چه کنیم.

عمل باز نویسی متدهای به ارث رسیده را override کردن متد گویند. برای این که بتوانیم یک متد را که به ارث رسیده است را override کنیم نباید این متد در کلاس والد به صورت final تعریف شده باشد. فایده ای که override کردن متدها این است که کلاس والد یک متد را تعریف می کند که کلیات و اساس یک کار را انجام می دهد و هر کلاس فرزند می تواند با توجه به نیاز خود اعمالی را به این متد اضافه کند. به این معنی که به یک کاربرد اعمال دیگری را اضافه کنیم. برای مثال به برنامه زیر دقت کنید:

class Animal{

   public void move(){
      System.out.println("Animals can move");
   }
}

class Dog extends Animal{

   public void move(){
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog{

   public static void main(String args[]){
      Animal a = new Animal(); // Animal reference and object
      Animal b = new Dog(); // Animal reference but Dog object

      a.move();// runs the method in Animal class

      b.move();//Runs the method in Dog class
   }
}

خروجی برنامه بالا به شکل زیر خواهد بود:

Animals can move
Dogs can walk and run

در مثال بالا می بینید که شئ b خود یک از نوع کلاس Animal است ولی با شیئی از کلاس Dog مقداردهی شده است. پس هنگامی که این متد move از این کلاس را فراخوانی می کنیم متد move مربوط به کلاس Dog اجرا می شود. دلیل این عمل این است که عمل چک کردن نوع شئ هنگام کامپایل بررسی می شود و چون نوع شئ را با کلاس Dog مقدار دهی کردیم متد مربوط به این کلاس اجرا می شود. بنابراین در کلاس بالا چنین اتفاقی می افتد. حال به مثال زیر توجه کنید:

class Animal{

   public void move(){
      System.out.println("Animals can move");
   }
}

class Dog extends Animal{

   public void move(){
      System.out.println("Dogs can walk and run");
   }
   public void bark(){
      System.out.println("Dogs can bark");
   }
}

public class TestDog{

   public static void main(String args[]){
      Animal a = new Animal(); // Animal reference and object
      Animal b = new Dog(); // Animal reference but Dog object

      a.move();// runs the method in Animal class
      b.move();//Runs the method in Dog class
      b.bark();
   }
}

خروجی برنامه بالا به شکل زیر خواهد بود:

TestDog.java:30: cannot find symbol
symbol  : method bark()
location: class Animal
                b.bark();
                 ^

اجرای این برنامه ممکن نبوده و خطا می دهد. زیرا که شئ b یک شئ از کلاس Animal بوده و کلاس Animal متدی به نام bark ندارد و این متد مربوط به کلاس Dog است. پس اگر متدی در کلاس والد موجود باشد و ما آن را در کلاس فرزند override نماییم، حال اگر شئی از نوع کلاس والد تعریف کنیم ولی با یک شئ کلاس فرزند مقدار دهی نماییم در این صورت متدهایی که فراخوانی می کنیم متدهای کلاس فرزند خواهد بود. اما اگر متدی فقط مربوط به کلاس فرزند باشد با استفاده از این روش نمی توان آن متد را فراخوانی نمود.

بررسی قوانین override کردن متدها در جاوا

قواعد و قوانین زیر هنگام override کردن متدها صادق است.

  • پارامترهای ورودی متد مربوط به کلاس فرزند باید دقیقا همانند پارامترهای ورودی متد مربوط به کلاس پدر باشد و هم از نظر تعداد پارامترها و هم از نظر نوع پارامتر ها یکی باشد.
  • نوع بازگشتی متد override شده باید همنوع نوع بازگشتی متد کلاس پدر باشد و یا یک زیرنوع (sybtype) از نوع بازگشتی متد کلاس پدر باشد.
  • سطح دسترسی متد کلاس فرزند نمی تواند محدود تر از کلاس پدر باشد برای مثال اگر در کلاس والد متد به شکل public تعریف شده است متد override شده نمی تواند private یا protected باشد.
  • متدی که به صورت final تعریف شده باشد نمی تواند override شود.
  • متدی که به صورت static تعریف شود را نمی توان override کرد اما می توان دوباره تعریف کرد.
  • اگر نمی توان متدی را به ارث برد نمی توان آن را override کرد.
  • در داخل یک پکیج یک کلاس فرزند می تواند همه متدهایی که در کلاس والد خود دارد و به عنوان final یا private تعریف نشده است را override کند. اما اگر در پکیج دیگر باشد متد کلاس والد باید final نباشد و همچنین public یا protected نیز باشد.
  • یک متد override شده در کلاس فرزند می تواند هر exception چک نشده ای را فراخوانی کند بدون این که لازم باشد که متد کلاس والد هم آن exception را فراخوانی کرده باشد. اما در مورد exception های چک شده متد کلاس فرزند نمی تواند exception های چک شده ی بیشتر از متد کلاس والد را صدا کند.

آموزش استفاده از کلمه کلیدی super

به عنوان یاد آوری می گوییم که برای این که در داخل متد override شده بتوانیم متد کلاس والد را فراخوانی کنید از کلمه کلیدی super استفاده می کنیم برای مثال به برنامه زیر توجه کنید:

class Animal{

   public void move(){
      System.out.println("Animals can move");
   }
}

class Dog extends Animal{

   public void move(){
      super.move(); // invokes the super class method
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog{

   public static void main(String args[]){

      Animal b = new Dog(); // Animal reference but Dog object
      b.move(); //Runs the method in Dog class

   }
}

خروجی برنامه بالا به شکل زیر خواهد بود:

Animals can move
Dogs can walk and run

چند ریختی (Polymorphism)

در این مطلب قصد داریم که در مورد چندریختی یا polymorphism صحبت کنیم. چندریختی یکی از قابلیت های شئ است که می تواند چندین فرم یا چندین شکل داشته باشد. بیشترین استفاده از چندریختی در برنامه نویسی شئ گرا زمانی است که یک شئ از کلاس پدر ایجاد کنیم ولی آن را با کلاس های فرزندان مقداردهی نماییم.

هر شئ جاوا که از کلاسی ساخته شده باشد به گونه ای که آن کلاس حد اقل دو کلاس فرزند داشته باشد که با کلاس پدر رابطه IS-A داشته باشد قابلیت چندریختی را می تواند داشته باشد. در زبان جاوا همه ی اشیاء قابلیت چندریختی و یا polymorphism را دارد.

دلیل این ادعا این است که همه ی کلاس های تعریف شده در جاوا از کلاس Object ارث بری کرده اند و با آن کلاس خاصیت Is-A دارند. به یاد داشته باشید که تنها راه دسترسی به یک شئ این است که یک متغیر از کلاس آن بسازیم.متغیری که ساخته می شود دارای یک نوع خاص است.

به یاد داشته باشید که اگر یک متغیر را در جاوا تعریف کرده باشیم دیگر نمی توانیم نوع آن متغیر را تغییر بدهیم. اگر یک متغیر به صورت final تعریف نشده باشد می توان شیئی را که در آن ریخته شده است را تغییر داد و یک شئ دیگر را در درون آن ریخت.

نوع متغیری که متغیر از آن ساخته شده است مشخص می کند که چه متدهایی را می توانیم فراخوانی کنیم. می توان هر شیئی را که از نوع متغیر است را در داخل یک متغیر ریخت همچنین می توان هر شیئی که از یک کلاس که کلاس فرزند نوع تعریف شده متغیر است را نیز داخل متغیر ریخت (یا خدا خودمم به سختی فهمیدم این جمله رو :D) یک متغیر را می توان از نوع کلاس یا اینترفیس معرفی کرد. برای مثال به کد زیر توجه نمایید.

public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}

با توجه به مثال بالا می توان گفت که کلاس Deer چند وراثت دارد پس می تواند چندریخت باشد. با توجه به کد بالا مفاهیم زیر درست است

  • یک Deer یک Animal است و با آن رابطه IS-A با آن دارد.
  • Deer یک Vegetarian است و با آن ارتباط IS-A دارد.
  • Deer یک Deer است و با آن ارتباط Is-A دارد.
  • Deer یک Object است و با آن ارتباط Is-A دارد.

بنابراین با توجه به کدهای بالا مفاهیم بالا را به شکل زیر در جاوا بیان می کنیم.

Deer d = new Deer();
Animal a = d;
Vegetarian v = d;
Object o = d;

همه ی اعمال بالا در جاوا مجاز بوده و به شئ d در برنامه اشاره می کنند. این عمل چندریختی و یا polymorphism نام دارد.

 معرفی کاربرد متدهای virtual

در این بخش نشان می دهیم که چگونه متدهای override شده می توانند در چندریختی تاثیر داشته باشد و چندریختی را با متدهای override شده پیاده سازی نمود و چگونه از آنها در طراحی کلاس ها استفاده کرد. ما در مطالب قبلی در مورد override کردن متد ها صحبت کرده ایم و گفته ایم که چگونه یک متد را override می کنیم.

اگر متدی در کلاس پدر باشد و همان متد در کلاس فرزند override شده باشد بنابراین متدی که در کلاس پدر است به کار نمی رود و فراخوانی نمی شود مگر این که در متد کلاس فرزند از کلمه کلیدی super استفاده شود. برای مثال به کد زیر توجه کنید:

/* File name : Employee.java */
public class Employee
{
   private String name;
   private String address;
   private int number;
   public Employee(String name, String address, int number)
   {
      System.out.println("Constructing an Employee");
      this.name = name;
      this.address = address;
      this.number = number;
   }
   public void mailCheck()
   {
      System.out.println("Mailing a check to " + this.name
       + " " + this.address);
   }
   public String toString()
   {
      return name + " " + address + " " + number;
   }
   public String getName()
   {
      return name;
   }
   public String getAddress()
   {
      return address;
   }
   public void setAddress(String newAddress)
   {
      address = newAddress;
   }
   public int getNumber()
   {
     return number;
   }
}

حال در کد زیر از کلاس Employee به شکل زیر ارث بری می کنیم.

/* File name : Salary.java */
public class Salary extends Employee
{
   private double salary; //Annual salary
   public Salary(String name, String address, int number, double
      salary)
   {
       super(name, address, number);
       setSalary(salary);
   }
   public void mailCheck()
   {
       System.out.println("Within mailCheck of Salary class ");
       System.out.println("Mailing check to " + getName()
       + " with salary " + salary);
   }
   public double getSalary()
   {
       return salary;
   }
   public void setSalary(double newSalary)
   {
       if(newSalary >= 0.0)
       {
          salary = newSalary;
       }
   }
   public double computePay()
   {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}

حال کد زیر با دقت بخوانید و سعی کنید خروجی برنامه را حدس بزنید.

/* File name : VirtualDemo.java */
public class VirtualDemo
{
   public static void main(String [] args)
   {
      Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
      Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
      System.out.println("Call mailCheck using Salary reference --");
      s.mailCheck();
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
    }
}

خروجی برنامه به شکل زیر خواهد بود:

Constructing an Employee
Constructing an Employee
Call mailCheck using Salary reference --
Within mailCheck of Salary class
ailing check to Mohd Mohtashim with salary 3600.0

Call mailCheck using Employee reference--
Within mailCheck of Salary class
ailing check to John Adams with salary 2400.0

در این کد ما دو متغیر از کلاس Salary معرفی کرده ایم. یکی برای این که شئ Salary در داخل آن قرار بگیرد که نام آن s می باشد و دیگری یک شئ از کلاس Employee در درون آن قرار می گیرد و نام آن e می باشد. هنگامی که متد

s.mailCheck()

را فراخوانی می کنیم. کامپایلر متد mailCheck در درون کلاس Salary را اجرا می کند ولی زمانی که متد mailCheck را از شئ e را فراخوانی می کنیم با این که باید متد مربوط به Employee را اجرا کند ولی نتیجه متفاوت می گیریم و دلیل آن این است که متد mailCheck مربوط به کلاس Salary اجرا خواهد شد. در جاوا همه ی متدها این قابلیت را دارند که override شوند و به این رفتار فراخوانی متدهای virtual گفته می شود

Enum و ویژگی های آن

در این مطلب قصد دارم در مورد کاربرد enum ها توضیح دهم. همانطور که در مطالب قبلی گفته شده بود enum ها برای نگهداری برخی مقادیر می باشد. برای مثال اگر شما بخواهید یک سری مقادیر مشخص و محدود را در یک دسته قرار دهید برای آن یک enum تعریف می کنیم. برای مثال اگر شما بخواهید سایز انواع لباس ها را که تعداد مشخص هستند را نگهداری کنیم برای آنها یک enum به شکل زیر تعریف می کنیم.

enum ShirtSize{
   small,
   medium,
   large,
   xlarge,
   xxlarge
      }

حال اگر بخواهیم به این مقادیر یک constructor بدهیم و مقداری را به آنها پاس بدهیم به گونه ای بتوان از مقدار هرکدام بعدا استفاده کرد به شکل زیر استفاده می کنیم.

enum Car {
   lamborghini(900),tata(2),audi(50),fiat(15),honda(12);
   private int price;
   Car(int p) {
      price = p;
   }
   int getPrice() {
      return price;
   } 
}
public class Main {
   public static void main(String args[]){
      System.out.println("All car prices:");
      for (Car c : Car.values())
      System.out.println(c + " costs " 
      + c.getPrice() + " thousand dollars.");
   }
}

حال اگر برنامه را اجرا کنیم خروجی به شکل زیر خواهد بود

All car prices:
lamborghini costs 900 thousand dollars.
tata costs 2 thousand dollars.
audi costs 50 thousand dollars.
fiat costs 15 thousand dollars.
honda costs 12 thousand dollars.

همانطور که در کد بالا مشاهده کردید هر enum می تواند یک متد values داشته باشد که مجموعه مقادیر داخل enum را برمی گرداند که می توان برای هر enum متد مربوط به آن enum را فراخوانی نمود.

معرفی Abstract

آیا تا به حال به فرایند ارسال یک ایمیل دقت کرده اید. شما یک ایمیل را تایپ می کنید و آدرس گیرنده و موضوع را داخل آن می نویسید. سپس بر روی دکمه send کلیک می کنید. حال چه می شود. پیام شما تبدیل به چه بسته داده هایی می شود؟ پیام شما از چه پورتی ارسال می شود؟

پیام شما به کجا ارسال می شود؟ پیام شما با چه پروتکلی ارسال می شود. چه اعمالی قبل از ارسال بر روی پیام شما صورت می گیرد؟ چه پردازش هایی در mail server بر روی پیام شما انجام می شود؟ پیام شما وقتی توسط گیرنده دریافت شد در کامپیوتر گیرنده چه پردازش هایی بر روی آن انجام خواهد شد؟

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

شما فقط همین را بدانی که چگونه باید ایمیل را ارسال کنید کافی است. به این مفهوم انتزاع یا abstraction می گویند. Abstraction به این معنی است که شما با ایده ها کار کنید نه رخدادها. در برنامه نویسی شئ گرا ما بسیار از abstraction استفاده می کنیم.

زیرا که باید در طراحی نرم افزار بسیاری از جزئیات نرم افزار را از دید کاربران مخفی نگه داشت و فقط کاربران باید با نحوه کارایی یک برنامه آشنا باشند. به عبارت دیگر کاربران باید اطلاعاتی در مورد این که هرشئ چه کاری انجام می دهد داشته باشند ولی نیازی نیست که بدانند هر شئ چگونه یک عمل را انجام می دهد. در زبان برنامه نویسی جاوا مفهوم abstraction را می توان با استفاده از کلاس های abstract و interface ها مورد استفاده قرار داد. در ادامه به بررسی این قسمت های جاوا خواهیم پرداخت.

 معرفی کاربرد کلاس های Abstract

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

  • کلاس های abstract ممکن است که در درون خود متد abstract داشته باشند و یا نداشته باشند. متد abtract متدی است که فقط تعریف شده است و هیچ بدنه ای ندارد( در ادامه همین مطلب توضیح می دهیم)
  • اگر یک کلاس بخواهد متد abstract داشته باشد باید خود آن کلاس حتما abstract باشد.
  • از کلاسی که به شکل abstract تعریف شده باشد نمی توان هیچ شیئی ساخت.
  • برای این که از یک کلاس abstract استفاده کنیم شما باید از آن به یک کلاس دیگر ارث بری کنید و متدهای abstract آن را در درون کلاس فرزند پیاده سازی نمایید.
  • اگر از کلاس abstract ارث بری نماییم باید همه ی متدهای abstract آن را پیاده سازی نماییم.

برای مثال برنامه ای را در زیر آورده ایم که بدانید این نوع کلاس چگونه مورد استفاده قرار می گیرد. در برنامه زیر مشاهده می کنید که برای تعریف کلاس abstract از کلمه abstract استفاده می شود.

/* File name : Employee.java */
public abstract class Employee
{
   private String name;
   private String address;
   private int number;
   public Employee(String name, String address, int number)
   {
      System.out.println("Constructing an Employee");
      this.name = name;
      this.address = address;
      this.number = number;
   }
   public double computePay()
   {
     System.out.println("Inside Employee computePay");
     return 0.0;
   }
   public void mailCheck()
   {
      System.out.println("Mailing a check to " + this.name
       + " " + this.address);
   }
   public String toString()
   {
      return name + " " + address + " " + number;
   }
   public String getName()
   {
      return name;
   }
   public String getAddress()
   {
      return address;
   }
   public void setAddress(String newAddress)
   {
      address = newAddress;
   }
   public int getNumber()
   {
     return number;
   }
}

در کد بالا مشاهده می کنید که به غیر از متدهای abstract کلاس Employee مانند بقیه کلاس ها در جاوا می باشد. این کلاس یک کلاس abstract است ولی همین کلاس 3 فیلد و 7 متد و یک constructor دارد. حال اگر از این کلاس بخواهید با کلمه کلیدی new یک شئ بسازید و به شکل زیر از آن استفاده کنید :

/* File name : AbstractDemo.java */
public class AbstractDemo
{
   public static void main(String [] args)
   {
      /* Following is not allowed and would raise error */
      Employee e = new Employee("George W.", "Houston, TX", 43);

      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
    }
}

اگر این کار را انجام دهید و برنامه را اجرا کنید برنامه خطای زیر را به شما خواهد داد:

Employee.java:46: Employee is abstract; cannot be instantiated
      Employee e = new Employee("George W.", "Houston, TX", 43);
                   ^
1 error

این بدین معنی است که از کلاسی که abstract است نمی توان هیچ شیئی ساخت. در ادامه نحوه استفاده از این کلاس ها را توضیح داده ایم.

 معرفی کاربرد وراثت از کلاس های Abstract

ما می توانیم خصوصیات کلاس Employee را مانند کلاس های دیگر به ارث ببریم. این کار را در کد زیر انجام داده ایم.

/* File name : Salary.java */
public class Salary extends Employee
{
   private double salary; //Annual salary
   public Salary(String name, String address, int number, double
      salary)
   {
       super(name, address, number);
       setSalary(salary);
   }
   public void mailCheck()
   {
       System.out.println("Within mailCheck of Salary class ");
       System.out.println("Mailing check to " + getName()
       + " with salary " + salary);
   }
   public double getSalary()
   {
       return salary;
   }
   public void setSalary(double newSalary)
   {
       if(newSalary >= 0.0)
       {
          salary = newSalary;
       }
   }
   public double computePay()
   {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}

در این برنامه شما نمی توانید از کلاس Employee شیئی بسازید اما می توانید از کلاس Salary شئ بسازید و از تمامی فیلد ها و متدهای کلاس Employee مانند کد زیر استفاده کنید.

/* File name : AbstractDemo.java */
public class AbstractDemo
{
   public static void main(String [] args)
   {
      Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
      Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);

      System.out.println("Call mailCheck using Salary reference --");
      s.mailCheck();

      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
    }
}

خروجی برنامه زیر به شکل زیر خواهد بود:

Constructing an Employee
Constructing an Employee
Call mailCheck using  Salary reference --
Within mailCheck of Salary class
ailing check to Mohd Mohtashim with salary 3600.0

Call mailCheck using Employee reference--
Within mailCheck of Salary class
ailing check to John Adams with salary 2400.

 معرفی کاربرد متدهای Abstract

اگر شما بخواهید که همه ی برنامه نویسان یک متد مشخص در داخل کلاسشان داشته باشند ولی هرکدام به روشی که می خواهند آن متد را پیاده سازی کنند، شما می توانید برای این کار متد را در کلاس والد به صورت abstract تعریف کنید و هر کدام از کلاس های فرزند پیاده سازی خاص خود را نسبت به متد مورد نظر داشته باشند. متد های abstract دارای خصوصیات زیر می باشند.

  • برای تعریف این متد ها از کلمه کلیدی abstract آورده می شود.
  • شما هنگام تعریف متد abstract باید کلمه کلیدی abstract را قبل از نام متد قرار دهید.
  • یک متد abstract فقط قسمت تعریف متد را دارد ولی این متد هیچ بدنه ای ندارد.
  • در یک متد abstract به جای علامت شروع و پایان یک بلوک و نوشتن بدنه برای متد از علامت سمی کولن یا ; استفاده می شود.

در کد زیر یک مثال از متد abstract آورده شده است.

public abstract class Employee
{
   private String name;
   private String address;
   private int number;
   
   public abstract double computePay();
   
   //Remainder of class definition
}

وقتی به یک متد abstract میرسیم نتیجه می گیریم که کلاس در بر گیرنده متد باید به صورت abstract تعریف شده باشد و همچنین هر کلاسی که از کلاس در برگیرنده متد ارث بری کرده باشد باید متد abstract را پیاده سازی کند. برای مثال به کد زیر توجه نمایید که متد computePay را پیاده سازی می کند.

/* File name : Salary.java */
public class Salary extends Employee
{
   private double salary; // Annual salary
  
   public double computePay()
   {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }

   //Remainder of class definition
}

استفاده از کپسول بندی (Encapsulation)

یکی از مهمترین مفهوم از چهار مفهوم اصلی برنامه نویسی شئ گرا encapsulation یا کپسول بندی می باشد و سه مفهوم دیگر وراثت و چندریختی و abstraction می باشد. کپسول بندی در جاوا مکانیزمی است که داده ها (متغیرها) و پردازش های داده ها (متدها) را در یک بخش قرار می دهد.

در کپسول بندی متغیرهای یک کلاس از کلاس های دیگر مخفی می شود و این متغیر های داخل کلاس فقط از داخل متدهای این کلاس قابل دسترسی هستند. برای همین به مکانیزم کپسول بندی مخفی کردن کلاس هم گفته می شود. برای این که در جاوا به کپسول بندی را پیاده سازی کنیم باید

  • متغیر های کلاس را به صورت private تعریف کنیم تا نتوان از بیرون از کلاس به آن دسترسی داشت.
  • برای هر یک از متغیرهای عضو کلاس یک متد setter و همچنین یک متد getter تعریف کنیم. در این صورت می توانیم دسترسی به متغیر ها را از طریق این کلاس ها کنترل کنیم. دقت داشته باشید که متدهای getter و setter باید به صورت public معرفی شده باشد. برای مثالی از کپسول بندی و چگونگی دسترسی به متغیر ها در جاوا به کد زیر دقت کنید:
/* File name : EncapTest.java */
public class EncapTest{

   private String name;
   private String idNum;
   private int age;

   public int getAge(){
      return age;
   }

   public String getName(){
      return name;
   }

   public String getIdNum(){
      return idNum;
   }

   public void setAge( int newAge){
      age = newAge;
   }

   public void setName(String newName){
      name = newName;
   }

   public void setIdNum( String newId){
      idNum = newId;
   }
}

متدهای set, get که به صورت public تعریف شده اند نقاط دسترسی به متغیرهای عضو کلاسEncapTest می باشد. معمولا به این متدها متدهای getter, setter می گویند. بنابراین اگر کلاسی بخواهد به متغیرهای عضو کلاس دسترسی داشته باشد باید از طریق متدهای getter و setter اقدام کنیم. به شکل زیر می توان به متغیرهای کلاس EncapTest دسترسی داشت:

/* File name : RunEncap.java */
public class RunEncap{

   public static void main(String args[]){
      EncapTest encap = new EncapTest();
      encap.setName("James");
      encap.setAge(20);
      encap.setIdNum("12343ms");

      System.out.print("Name : " + encap.getName() + " Age : " + encap.getAge());
    }
}

خروجی برنامه بالا به شکل زیر خواهد بود:

Name : James Age : 20

بررسی مزایای کپسول بندی در جاوا

دلایلی که باعث می شود که ما از کپسول بندی در برنامه نویسی استفاده کنیم عبارتند از:

  • می توان با استفاده از این امکان کاری کرد که فیلدهای یک کلاس به صورت فقط خواندنی یا فقط نوشتنی باشد.
  • با استفاده از کپسول بندی یک کلاس می تواند بر روی داده های ذخیره شده بر روی فیلدهایش کنترل داشته باشد.
  • در خارج از کلاس نمی توان فهمید که یک کلاس چگونه داده هایش را ذخیره می کند زیرا که یک کلاس می تواند در داخل متدهای setter, getter نوع داده را تغییر دهد و یا هر عمل دیگری بر روی داده ها انجام دهد و سپس آن را ذخیره کند.

در برنامه های کوچک شاید برای شما مهم نباشد که داده های خود را کپسول بندی نمایید. ولی در برنامه هایی که بزرگ هستند و توسط چندین نفر نوشته شده اند این گونه مسائل بسیار مهم می شوند زیرا که هم قابلیت خوانایی برنامه را بالا می برند و هم این که امنیت برنامه افزایش پیدا می کند که از رخ دادن خطاهای غیر منتظره و دسترسی های غیر مجاز جلوگیری خواهد شد.

استفاده از اینترفیس ها

اینترفیس یک نوع در جاوا است که شبیه کلاسی است که دارای متدهای abstract است و هیچ متدی ندارد که پیاده سازی کرده باشد. اگر کلاسی بخواهد از یک اینترفیس ارث بری داشته باشد باید آن را پیاده سازی کند و از کلمه کلیدی implements استفاده کند.

همانند کلاس های abstract در داخل اینترفیس می توان ثابت و متد پیش فرض و متد استاتیک و .. داشت. متدهای استاتیک را می توان در داخل اینترفیس تعریف کرد. نوشتن یک اینترفیس شبیه نوشتن یک کلاس است. اما یک کلاس ویژگی ها و رفتارهای اشیاء را شرح می دهد ولی یک اینترفیس شامل رفتارهایی است

که کلاس هایی که قرار است اینترفیس را پیاده سازی کنند باید از آن رفتار ها تبعیت کنند. برخلاف کلاس ها متدهای موجود در اینترفیس در خود اینترفیس تعریف نمی شوند و کلاسی که اینترفیس را پیاده سازی می کند باید آن متدها را تعریف کند. شباهت های اینترفیس و کلاس در بخش های زیر است:

  • یک اینترفیس می تواند مانند کلاس ها به هر تعداد که می خواهد متد داشته باشد.
  • همانند کلاس ها اینترفیس ها را در داخل فایل هایی با پسوند .java می نویسیم.
  • وقتی که یک اینترفیس را کامپایل می کنیم و اصطلاحاً بایت کد به وجود می آید فایل های بایت کد با پسوند .class ساخته می شود.
  • اینترفیس ها در پکیج ها قرار دارند و بایت کد آنها در ساختار دایرکتوری متناظر قرار دارد.

تفاوتهایی که یک اینترفیس با یک کلاس دارد چندین مورد است که می توان موارد زیر را نام برد.

  • شما نمی توانید از یک اینترفیس یک شئ بسازید.
  • یک اینترفیس نمی تواند constructor داشته باشد. زیرا که نمی توان با استفاده از کلمه کلیدی new یک شئ از اینترفیس ساخت.
  • همه ی متدهای یک اینترفیس از نوع abstract می باشند و بدنه ندارند.
  • یک اینترفیس نمی تواند فیلد استاتیک داشته باشد. تنها فیلدهایی که می تواند در داخل اینترفیس وجود داشته باشد فیلد هایی هستند که باید هم به صورت final و هم به صورت static تعریف شوند.
  • یک اینترفیس را نمی توان با استفاده از کلمه کلیدی extends آورد و برای وراثت حتما باید از کلمه کلیدی implements استفاده کرد.
  • یک اینترفیس می تواند چندین اینترفیس دیگر را extend کند و از آنها ارث ببرد.

آموزش تعریف اینترفیس در جاوا

در کد زیر تعریف اینترفیس آورده شده است:

/* File name : NameOfInterface.java */
import java.lang.*;
//Any number of import statements

public interface NameOfInterface
{
   //Any number of final, static fields
   //Any number of abstract method declarations}

اینترفیس ها مشخصات زیر را دارند.

  • یک اینترفیس به صورت ضمنی یک abstract است و لازم نیست که شما از کلمه کلیدی abstract هنگام تعریف اینترفیس استفاده کنید.
  • هر متدی که در یک اینترفیس است نیز به طور ضمنی abstract است بنابراین هنگام تعریف متدها نیازی به استفاده از کلمه کلیدی abstract نیست.
  • متدهای موجود در اینترفیس به صورت ضمنی public هستند. برای مثال به کد زیر دقت کنید:
/* File name : Animal.java */
interface Animal {

   public void eat();
   public void travel();
}

آموزش پیاده سازی اینترفیس ها

وقتی یک کلاس یک اینترفیس را پیاده سازی می کند شما یک قرار داد را امضا می کنید که عملیات گفته شده در اینترفیس را درون کلاس خود پیاده سازی کنید. اگر یک کلاس همه ی متدهای موجود در اینترفیس را پیاده سازی نکند باید متد مربوطه به صورت abstract معرفی شود

و در غیر این صورت برنامه خطا خواهد داشت. یک کلاس برای این که یک اینترفیس را پیاده سازی نماید از کلمه کلیدی implements استفاده خواهد کرد. این کلمه کلیدی در زمان تعریف کلاس آورده می شود و مانند کد زیر خواهد بود:

/* File name : MammalInt.java */
public class MammalInt implements Animal{

   public void eat(){
      System.out.println("Mammal eats");
   }

   public void travel(){
      System.out.println("Mammal travels");
   } 

   public int noOfLegs(){
      return 0;
   }

   public static void main(String args[]){
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
} 

خروجی برنامه بالا به شکل زیر خواهد بود:

Mammal eats
Mammal travels

قوانینی برای پیاده سازی متدهای موجود در اینترفیس وجود دارد که این قوانین عبارتند از:

  • هنگام پیاده سازی متد علاوه بر exception های چک شده ای که در متد اینترفیس معرفی شده اند نباید exception دیگری را معرفی کرد.
  • در متدی که در حال پیاده سازی است تعداد آرگومان ها و نوع مقدار بازگشتی باید با تعداد آرگومان و مقدار بازگشتی متد اینترفیس یکی باشد.
  • کلاسی که قصد پیاده سازی اینترفیس را دارد می تواند خود به صورت abstract تعریف شود بنابراین نیازی نیست که متدها را پیاده سازی کند.

هنگام پیاده سازی اینترفیس ها به قوانین زیر توجه کنید:

  • یک کلاس می تواند در یک زمان چند اینترفیس را پیاده سازی نماید.
  • یک کلاس می تواند فقط از یک کلاس ارث ببرد ولی چند اینترفیس را پیاده سازی کند.
  • یک اینترفیس می تواند از اینترفیس دیگر ارث بری داشته باشد.همان طور که یک کلاس می تواند از کلاس دیگر ارث ببرد.

آموزش ارث بری اینترفیس ها

یک اینترفیس می تواند از اینترفیس دیگر ارث بری داشته باشد. با استفاده از کلمه کلیدی extends یک اینترفیس می تواند از اینترفیس دیگر ارث ببرد. در مثال زیر اینترفیس های football و hokey از اینترفیس sports ارث بری داشته اند.

//Filename: Sports.java
public interface Sports
{
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}

//Filename: Football.java
public interface Football extends Sports
{
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}

//Filename: Hockey.java
public interface Hockey extends Sports
{
   public void homeGoalScored();
   public void visitingGoalScored();
   public void endOfPeriod(int period);
   public void overtimePeriod(int ot);
}

اینترفیس Hokey دارای 4 متد است اما این اینترفیس 2 متد را نیز از اینترفیس Sports به ارث برده است. بنابراین کلاسی که اینترفیس Hokey را پیاده سازی می کند باید 6 متد را پیاده سازی نماید. همانطور برای اینترفیس Football نیز هر کلاسی که بخواهد این اینترفیس را پیاده سازی کند باید 5 متد را پیاده سازی نماید.

آموزش ارث بری از چند اینترفیس

یک کلاس جاوا فقط می تواند از یک کلاس جاوای دیگر ارث بری داشته باشد. ارث بری چندگانه در جاوا مجاز نیست. اما اینترفیس ها این محدودیت را ندارند و می توانند از بیش از یک اینترفیس ارث بری داشته باشند. برای ارث بری اینترفیس ها از کلمه کلیدی extends استفاده می کنیم و اینترفیس های والد را با استفاده از علامت , جدا می نماییم. برای مثال به کد زیر توجه کنید:

public interface Hockey extends Sports, Event

 معرفی کاربرد اینترفیس های تگ

به اینترفیس هایی که هیچ متدی ندارند اینترفیس تگ می گویند. برای مثال اینترفیس MouseListener یک اینترفیس تگ است که در کتابخانه java.awt قرار دارد و از java.util.EventListener ارث بری کرده است که به صورت زیر تعریف شده است:

package java.util;
public interface EventListener
{}

استفاده از اینترفیس های بدون متد که اینترفیس تگ هم به آنها می گویند دو دلیل عمده دارد که عبارتند از:

  • ساختن یک اینترفیس والد عمومی: مانند اینترفیس EventListener که اینترفیس های زیادی از آن ارث بری کرده اند می تواند یک اینترفیس بدون متد ساخت فقط به این منظور که اینترفیس والد آن EventListener باشد. این کار برای اعمال خاصی مناسب است. برای مثال وقتی یک اینترفیس از EventListener ارث بری کرده باشد jvm تشخیص می دهد که اینترفیس مورد نظر یک رویداد را پیاده سازی خواهد کرد.
  • اضافه کردن یک نوع داده خاص به اینترفیس دیگر. این کار برای اعمال چندریختی به کار برده می شود.

آموزش جاوا (Java) قسمت 40 : پکیج(Package) و نحوه استفاده

یکی دیگر از مفاهیم برنامه نویسی شئ گرا در جاوا مفهوم پکیج یا بسته بندی package می باشد. فرض کنید که یک کلاس به نام Data دارید که در تمام برنامه های خود برای کار با داده ها از آن استفاده می کنید. پس شما دیگر نمی توانید هیچوقت کلاسی به نام Data را تعریف کنید.

این عمل وقتی است که شما از پکیج ها استفاده نکنید. استفاده از پکیج برای این است که وقتی از نام های تکراری استفاده می کنیم مشکلی پیش نیاید. برای مثال شما تصور کنید که پوشه یا دایرکتوری در سیستم عامل وجود نداشت. آن وقت شما با خیل عظیمی از فایل ها مواجه بودید که همه ی آن ها باید نامی داشتند که آن نام با بقیه فایل های کامپیوتر متفاوت بود.

در این وضعیت مشکلات بسیاری پیش می آمد. همچنین از پکیج ها برای کنترل دسترسی به کلاس ها و استفاده راحت تر از کلاس ها و اینترفیس ها استفاده می شود. اغلب پکیج ها را برای گروه بندی کلاس ها و اینترفیس های و enum های مرتبط به کار می برند. برخی از پکیج های معمول که در زبان جاوا بسیار مورد استفاده قرار می گیرند عبارتند از:

  • java.lang کلاس های پایه ای جاوا را در خود نگهداری می کند.
  • java.io برای نگهداری کلاس هایی که برای کار با فایل ها و ورودی و خروجی است را نگهداری می کند.

شما می توانید پکیج دلخواه خود را برای گروه بندی کلاس ها و اینترفیس های خود تعریف کنید. یکی از اصول نوشتن برنامه درست این است که کد های شما دارای طبقه بندی درست باشد تا به راحتی معنای کد های نوشته شده را درک کرد و در یک تیم اعضای تیم در کدهای شما گم نشوند.

پس کلاس ها و اینترفیس ها و enum های خود را با توجه به عمل و هدفشان طبقه بندی نمایید. به خاطر این که پکیج ها یک فضای نام (namespace) مخصوص به خود را تعریف می کنند پس احتمال هم نام شدن کلاس ها کاهش پیدا می کند و شما باید دقت کنید که در داخل پکیج کلاس یا اینترفیس همنام نداشته باشید نه در کل پروژه. همچنین استفاده از پکیج ها برنامه نویسی را آسان تر می کند زیرا که دسترسی به کلاس ها آسانتر خواهد بود.

آموزش ساخت پکیج ها در جاوا

هر پکیج یک نام دارد. پس هنگامی که می خواهید یک پکیج بسازید باید یک نام برای آن تعیین کنید. برای این که یک پکیج بسازید در برنامه intellij idea باید در قسمت project بر روی پوشه src کلیک راست کنید و گزینه New را انتخاب کنید و از زیرمنو package را انتخاب کنید. سپس اسم پکیج از شما پرسیده خواهد شد که نامی را به آن اختصاص می دهید.با این کار یک پکیج با نامی که شما انتخاب کرده اید برای شما ساخته می شود. که شکل آن را در تصویر زیر می بینید.

با سلام به همه دوستان و همراهان Itpro. یکی دیگر از مفاهیم برنامه نویسی شئ گرا در جاوا مفهوم پکیج یا بسته بندی package می باشد. فرض کنید که یک کلاس به نام Data دارید که در تمام برنامه های خود برای کار با داده ها از آن استفاده می کنید. پس شما دیگر نمی توانید هیچوقت کلاسی به نام Data را تعریف کنید. این عمل وقتی است که شما از پکیج ها استفاده نکنید. استفاده از پکیج برای این است که وقتی از نام های تکراری استفاده می کنیم مشکلی پیش نیاید. برای مثال شما تصور کنید که پوشه یا دایرکتوری در سیستم عامل وجود نداشت. آن وقت شما با خیل عظیمی از فایل ها مواجه بودید که همه ی آن ها باید نامی داشتند که آن نام با بقیه فایل های کامپیوتر متفاوت بود. در این وضعیت مشکلات بسیاری پیش می آمد. همچنین از پکیج ها برای کنترل دسترسی به کلاس ها و استفاده راحت تر از کلاس ها و اینترفیس ها استفاده می شود. اغلب پکیج ها را برای گروه بندی کلاس ها و اینترفیس های و enum های مرتبط به کار می برند. برخی از پکیج های معمول  که در زبان جاوا بسیار مورد استفاده قرار می گیرند عبارتند از:

* java.lang کلاس های پایه ای جاوا را در خود نگهداری می کند.
* java.io برای نگهداری کلاس هایی که برای کار با فایل ها و ورودی و خروجی است را نگهداری می کند.
شما می توانید پکیج دلخواه خود را برای گروه بندی کلاس ها و اینترفیس های خود تعریف کنید. یکی از اصول نوشتن برنامه درست این است که کد های شما دارای طبقه بندی درست باشد تا به راحتی معنای کد های نوشته شده را درک کرد و در یک تیم اعضای تیم در کدهای شما گم نشوند. پس کلاس ها و اینترفیس ها و enum های خود را با توجه به عمل و هدفشان طبقه بندی نمایید. به خاطر این که پکیج ها یک فضای نام (namespace) مخصوص به خود را تعریف می کنند پس احتمال هم نام شدن کلاس ها کاهش پیدا می کند و شما باید دقت کنید که در داخل پکیج کلاس یا اینترفیس همنام نداشته باشید نه در کل پروژه. همچنین استفاده از پکیج ها برنامه نویسی را آسان تر می کند زیرا که دسترسی به کلاس ها آسانتر خواهد بود.

!!ساخت پکیج ها
هر پکیج یک نام دارد. پس هنگامی که می خواهید یک پکیج بسازید باید یک نام برای آن تعیین کنید. برای این که یک پکیج بسازید در برنامه intellij idea باید در قسمت project بر روی پوشه src کلیک راست کنید و گزینه New را انتخاب کنید و از زیرمنو package را انتخاب کنید. سپس اسم پکیج از شما پرسیده خواهد شد که نامی را به آن اختصاص می دهید.
با این کار یک پکیج با نامی که شما انتخاب کرده اید برای شما ساخته می شود. که شکل آن را در تصویر زیر می بینید.
||http://tosinso.com/files/get/8e777fc5-c73d-4e28-ac2a-9821691f8194||
 دقت داشته باشید که ما نام پکیج خود را ItProPackage قرار داده ایم. همه کلاس ها و اینترفیس هایی را که می خواهیم در این پکیج باشد را باید در داخل این پکیج بسازیم. به شکلی که بر روی این پکیج کلیک کرده و new , class را انتخاب کنیم و یا کلاس هایی را که قبلا ساخته ایم را به داخل این پکیج drag کنیم. دقت داشته باشید که خط اول کلیه کلاس ها و اینترفیس هایی که در یک پکیج قرار دارند باید به شکل کد زیر باشد که این کد نام پکیج را مشخص می کند.
<java>
package ItProPackage;

<java>
همچنین این کد باید حتما خط اول کدهای یک کلاس و اینترفیبس موجود در یک پکیج باشد. دقت داشته باشید که همه ی پکیج هایی که در پروژه شما ساخته می شود اگر به مسیر خود پروژه بر روی کامپیوتر شما بروید خواهید دید که به ازای هر پکیج یک دایرکتوری برای آن پکیج ساخته شده است و کلاس ها و اینترفیس ها در قالب فایل های .java در آن قرار دارند. برای مثال کد زیر یک کلاس در پکیج تعریف شده است :
<java>
package ItProPackage;

public class ItproClass {
    public void sayHello(String name){
        System.out.println(Hello dear Itpro User: + name);
    }
}

<java>
و اگر به آدرس پروژه بروید مانند تصویر زیر فایل ها را مشاهده خواهید کرد:
||http://tosinso.com/files/get/a2288c30-f725-4ddc-b932-d6bdfee73e11||

!!کلمه کلیدی import
اگر یک کلاس بخواهد از کلاسی در همان پکیج استفاده کند لازم نیست کاری انجام دهید. ولی برای این که کلاسی از یک کلاس در پکیج دیگر استفاده کند باید با استفاده از کلمه کلیدی import پکیج مورد نظر را به فایل اضافه کرد. برای مثال اگر ما در داخل پکیج ItProPackage یک کلاس به نام ItproClass داشته باشیم که کد آن به شکل زیر باشد:
<java>
package ItProPackage;

public class ItproClass {
    public void sayHello(String name){
        System.out.println(Hello dear Itpro User: + name);
    }
}

<java>
حال اگر در کلاس اصلی برنامه بخواهیم از این کلاس استفاده کنیم باید با استفاده از کلمه کلیدی import پکیج این کلاس را به کلاس اصلی اضافه کنیم. مانند شکل زیر 
<java>
import ItProPackage.*;

public class Main {

    public static void main(String[] args) {
ItproClass itpro=new ItproClass();
itpro.sayHello(Mehdi Adeli);
}
}

<java>
اگر برنامه بالا را اجرا کنیم خروجی به شکل زیر خواهد بود:
<text>
Hello dear Itpro User: Mehdi Adeli
<text>
دقت داشته باشید که با عبارت import که در کد بالا نوشته ایم همه ی کلاس های پکیج به داخل کلاس لود می شود ولی اگر فقط بخواهیم که از کلاس ItproClass استفاده کنیم و با بقیه کلاس های پکیج کاری نداشته باشیم باید این خط را به شکل زیر تغییر دهیم:
<java>
import ItProPackage.ItproClass;

<java>
دقت داشته باشید که به هر تعداد که بخواهیم می توانیم از کلمه کلیدی import در داخل کلاس استفاده کنیم و عبارات import بعد از خط اول که همان اسم پکیج است می آید. ما می توانیم در داخل پکیج ها پکیج های دیگری را تعریف کنیم. همچنین می توان هنگام import کردن پکیج هایی را import کرد که داخل پکیج های دیگر هستند برای مثال شکل import کردن مانند کد زیر باشد:
<java>
import com.apple.computers.*;

<java>
*Itpro باشید*


نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

دقت داشته باشید که ما نام پکیج خود را ItProPackage قرار داده ایم. همه کلاس ها و اینترفیس هایی را که می خواهیم در این پکیج باشد را باید در داخل این پکیج بسازیم. به شکلی که بر روی این پکیج کلیک کرده و new , class را انتخاب کنیم و یا کلاس هایی را که قبلا ساخته ایم را به داخل این پکیج drag کنیم. دقت داشته باشید که خط اول کلیه کلاس ها و اینترفیس هایی که در یک پکیج قرار دارند باید به شکل کد زیر باشد که این کد نام پکیج را مشخص می کند.

package ItProPackage;

همچنین این کد باید حتما خط اول کدهای یک کلاس و اینترفیبس موجود در یک پکیج باشد. دقت داشته باشید که همه ی پکیج هایی که در پروژه شما ساخته می شود اگر به مسیر خود پروژه بر روی کامپیوتر شما بروید خواهید دید که به ازای هر پکیج یک دایرکتوری برای آن پکیج ساخته شده است و کلاس ها و اینترفیس ها در قالب فایل های .java در آن قرار دارند. برای مثال کد زیر یک کلاس در پکیج تعریف شده است :

package ItProPackage;

public class ItproClass {
    public void sayHello(String name){
        System.out.println("Hello dear Itpro User: "+ name);
    }
}

و اگر به آدرس پروژه بروید مانند تصویر زیر فایل ها را مشاهده خواهید کرد:

با سلام به همه دوستان و همراهان Itpro. یکی دیگر از مفاهیم برنامه نویسی شئ گرا در جاوا مفهوم پکیج یا بسته بندی package می باشد. فرض کنید که یک کلاس به نام Data دارید که در تمام برنامه های خود برای کار با داده ها از آن استفاده می کنید. پس شما دیگر نمی توانید هیچوقت کلاسی به نام Data را تعریف کنید. این عمل وقتی است که شما از پکیج ها استفاده نکنید. استفاده از پکیج برای این است که وقتی از نام های تکراری استفاده می کنیم مشکلی پیش نیاید. برای مثال شما تصور کنید که پوشه یا دایرکتوری در سیستم عامل وجود نداشت. آن وقت شما با خیل عظیمی از فایل ها مواجه بودید که همه ی آن ها باید نامی داشتند که آن نام با بقیه فایل های کامپیوتر متفاوت بود. در این وضعیت مشکلات بسیاری پیش می آمد. همچنین از پکیج ها برای کنترل دسترسی به کلاس ها و استفاده راحت تر از کلاس ها و اینترفیس ها استفاده می شود. اغلب پکیج ها را برای گروه بندی کلاس ها و اینترفیس های و enum های مرتبط به کار می برند. برخی از پکیج های معمول  که در زبان جاوا بسیار مورد استفاده قرار می گیرند عبارتند از:

* java.lang کلاس های پایه ای جاوا را در خود نگهداری می کند.
* java.io برای نگهداری کلاس هایی که برای کار با فایل ها و ورودی و خروجی است را نگهداری می کند.
شما می توانید پکیج دلخواه خود را برای گروه بندی کلاس ها و اینترفیس های خود تعریف کنید. یکی از اصول نوشتن برنامه درست این است که کد های شما دارای طبقه بندی درست باشد تا به راحتی معنای کد های نوشته شده را درک کرد و در یک تیم اعضای تیم در کدهای شما گم نشوند. پس کلاس ها و اینترفیس ها و enum های خود را با توجه به عمل و هدفشان طبقه بندی نمایید. به خاطر این که پکیج ها یک فضای نام (namespace) مخصوص به خود را تعریف می کنند پس احتمال هم نام شدن کلاس ها کاهش پیدا می کند و شما باید دقت کنید که در داخل پکیج کلاس یا اینترفیس همنام نداشته باشید نه در کل پروژه. همچنین استفاده از پکیج ها برنامه نویسی را آسان تر می کند زیرا که دسترسی به کلاس ها آسانتر خواهد بود.

!!ساخت پکیج ها
هر پکیج یک نام دارد. پس هنگامی که می خواهید یک پکیج بسازید باید یک نام برای آن تعیین کنید. برای این که یک پکیج بسازید در برنامه intellij idea باید در قسمت project بر روی پوشه src کلیک راست کنید و گزینه New را انتخاب کنید و از زیرمنو package را انتخاب کنید. سپس اسم پکیج از شما پرسیده خواهد شد که نامی را به آن اختصاص می دهید.
با این کار یک پکیج با نامی که شما انتخاب کرده اید برای شما ساخته می شود. که شکل آن را در تصویر زیر می بینید.
||http://tosinso.com/files/get/8e777fc5-c73d-4e28-ac2a-9821691f8194||
 دقت داشته باشید که ما نام پکیج خود را ItProPackage قرار داده ایم. همه کلاس ها و اینترفیس هایی را که می خواهیم در این پکیج باشد را باید در داخل این پکیج بسازیم. به شکلی که بر روی این پکیج کلیک کرده و new , class را انتخاب کنیم و یا کلاس هایی را که قبلا ساخته ایم را به داخل این پکیج drag کنیم. دقت داشته باشید که خط اول کلیه کلاس ها و اینترفیس هایی که در یک پکیج قرار دارند باید به شکل کد زیر باشد که این کد نام پکیج را مشخص می کند.
<java>
package ItProPackage;

<java>
همچنین این کد باید حتما خط اول کدهای یک کلاس و اینترفیبس موجود در یک پکیج باشد. دقت داشته باشید که همه ی پکیج هایی که در پروژه شما ساخته می شود اگر به مسیر خود پروژه بر روی کامپیوتر شما بروید خواهید دید که به ازای هر پکیج یک دایرکتوری برای آن پکیج ساخته شده است و کلاس ها و اینترفیس ها در قالب فایل های .java در آن قرار دارند. برای مثال کد زیر یک کلاس در پکیج تعریف شده است :
<java>
package ItProPackage;

public class ItproClass {
    public void sayHello(String name){
        System.out.println(Hello dear Itpro User: + name);
    }
}

<java>
و اگر به آدرس پروژه بروید مانند تصویر زیر فایل ها را مشاهده خواهید کرد:
||http://tosinso.com/files/get/a2288c30-f725-4ddc-b932-d6bdfee73e11||

!!کلمه کلیدی import
اگر یک کلاس بخواهد از کلاسی در همان پکیج استفاده کند لازم نیست کاری انجام دهید. ولی برای این که کلاسی از یک کلاس در پکیج دیگر استفاده کند باید با استفاده از کلمه کلیدی import پکیج مورد نظر را به فایل اضافه کرد. برای مثال اگر ما در داخل پکیج ItProPackage یک کلاس به نام ItproClass داشته باشیم که کد آن به شکل زیر باشد:
<java>
package ItProPackage;

public class ItproClass {
    public void sayHello(String name){
        System.out.println(Hello dear Itpro User: + name);
    }
}

<java>
حال اگر در کلاس اصلی برنامه بخواهیم از این کلاس استفاده کنیم باید با استفاده از کلمه کلیدی import پکیج این کلاس را به کلاس اصلی اضافه کنیم. مانند شکل زیر 
<java>
import ItProPackage.*;

public class Main {

    public static void main(String[] args) {
ItproClass itpro=new ItproClass();
itpro.sayHello(Mehdi Adeli);
}
}

<java>
اگر برنامه بالا را اجرا کنیم خروجی به شکل زیر خواهد بود:
<text>
Hello dear Itpro User: Mehdi Adeli
<text>
دقت داشته باشید که با عبارت import که در کد بالا نوشته ایم همه ی کلاس های پکیج به داخل کلاس لود می شود ولی اگر فقط بخواهیم که از کلاس ItproClass استفاده کنیم و با بقیه کلاس های پکیج کاری نداشته باشیم باید این خط را به شکل زیر تغییر دهیم:
<java>
import ItProPackage.ItproClass;

<java>
دقت داشته باشید که به هر تعداد که بخواهیم می توانیم از کلمه کلیدی import در داخل کلاس استفاده کنیم و عبارات import بعد از خط اول که همان اسم پکیج است می آید. ما می توانیم در داخل پکیج ها پکیج های دیگری را تعریف کنیم. همچنین می توان هنگام import کردن پکیج هایی را import کرد که داخل پکیج های دیگر هستند برای مثال شکل import کردن مانند کد زیر باشد:
<java>
import com.apple.computers.*;

<java>
*Itpro باشید*


نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

آموزش استفاده از کلمه کلیدی import

اگر یک کلاس بخواهد از کلاسی در همان پکیج استفاده کند لازم نیست کاری انجام دهید. ولی برای این که کلاسی از یک کلاس در پکیج دیگر استفاده کند باید با استفاده از کلمه کلیدی import پکیج مورد نظر را به فایل اضافه کرد. برای مثال اگر ما در داخل پکیج ItProPackage یک کلاس به نام ItproClass داشته باشیم که کد آن به شکل زیر باشد:

package ItProPackage;

public class ItproClass {
    public void sayHello(String name){
        System.out.println("Hello dear Itpro User: "+ name);
    }
}

حال اگر در کلاس اصلی برنامه بخواهیم از این کلاس استفاده کنیم باید با استفاده از کلمه کلیدی import پکیج این کلاس را به کلاس اصلی اضافه کنیم. مانند شکل زیر

import ItProPackage.*;

public class Main {

    public static void main(String[] args) {
ItproClass itpro=new ItproClass();
itpro.sayHello("Mehdi Adeli");
}
}

اگر برنامه بالا را اجرا کنیم خروجی به شکل زیر خواهد بود:

Hello dear Itpro User: Mehdi Adeli

دقت داشته باشید که با عبارت import که در کد بالا نوشته ایم همه ی کلاس های پکیج به داخل کلاس لود می شود ولی اگر فقط بخواهیم که از کلاس ItproClass استفاده کنیم و با بقیه کلاس های پکیج کاری نداشته باشیم باید این خط را به شکل زیر تغییر دهیم:

import ItProPackage.ItproClass;

دقت داشته باشید که به هر تعداد که بخواهیم می توانیم از کلمه کلیدی import در داخل کلاس استفاده کنیم و عبارات import بعد از خط اول که همان اسم پکیج است می آید. ما می توانیم در داخل پکیج ها پکیج های دیگری را تعریف کنیم. همچنین می توان هنگام import کردن پکیج هایی را import کرد که داخل پکیج های دیگر هستند برای مثال شکل import کردن مانند کد زیر باشد:

import com.apple.computers.*;

معرفی داده ساختارها Enumeration

تا به این قسمت از مطالب به مفاهیم زبان جاوا و مفاهیم شئ گرایی در جاوا در Itpro پرداختیم. ولی باید بگم که مطالبی که تا کنون توضیح دادیم مطالب پایه و اساسی زبان جاوا بودند. حال از این به بعد به بررسی مفاهیم پیشرفته تر در جاوا می پردازیم که هنگام تولید و ساختن یک برنامه بزرگ و اپلیکیشن مفید قابل استفاده خواهد بود.

قسمت اولی که مورد بررسی خواهیم داد مکانیزم هایی است که برای دسته بندی و سازماندهی داده ها استفاده می شود. به این مکانیزم های Data structure گفته می شود که ترجمه فارسی آن داده ساختار است (بعضیا بهش میگن ساختمان داده ها که توی دانشگاه چند واحدشون رو براش میذارن :D) داده ساختارهایی که جاوا در درون خود دارد در پکیج utility قرار دارند و بسیار قدرتمند و پرکاربرد هستند. این داده ساختار ها عبارتند از:

  • Enumeration
  • BitSet
  • Vector
  • Stack
  • Dictionary
  • Hashtable
  • Propperties

همه این کلاس ها در جاوا وجود دارند و همه ی آنها برای نگهداری داده ها به شکل های گوناگون می باشند که به توضیح آنها خواهیم پرداخت. البته این ها داده ساختار های پیچیده زبان جاوا هستند. داده ساختار های ساده در جاوا عبارتند از متغیر ها و آرایه ها و ArrayList ها که قبلا به توضیح آنها در Itpro پرداخته ایم.

 معرفی کاربرد Enumeration

اینترفیس Enumeration به خودی خود یک داده ساختار نیست. اما در مجموعه داده ساختار ها بسیار مهم است. این اینترفیس یک ابزاری را برای استخراج داده های ترتیبی از یک داده ساختار را فراهم می کند. برای مثال اینترفیس Enumeration متد nextElement را تعریف می کند که این متد برای به دست آوردن عنصر بعدی از یک داده ساختار که چندین عنصر داردد به کار می رود.

در کل این اینترفیس متدهایی را تعریف می کند که برای شمارش و استخراج یک به یک مجموعه داده به کار گرفته می شوند. این اینترفیس قدیمی است. اگرچه این اینترفیس منسوخ نشده است ولی در کدهای جدید مورد استفاده قرار نمی گیرد. اما این اینترفیس توسط کلاس هایی مثل Vector و Properties و برخی از کلاس های API ها مورد استفاده قرار می گیرد. متدهای اینترفیس Enumeration در ادامه آورده شده اند.

  • متد hasMoreElements این متد دارای مقدار بازگشتی Boolean است و هیچ ورودی را نمی گیرد. وظیفه این متد این است که مشخص می کند که داده های یک داده ساختار به اتمام رسیده اند یا خیر. به عبارت دیگر وقتی که شما این اینترفیس را پیاده سازی می کنید در این قسمت باید مشخص کنید که در داده ساختار مورد نظر همه ی داده ها را استخراج کرده ایم یا خیر.
  • متد nextElement این متد یک شئ object برمی گرداند و این شئ همان مقدار داده بعدی در داده ساختار مورد نظر است.برای مثال به برنامه زیر دقت کنید.

در برنامه زیر نحوه پیاده سازی و استفاده ازاین اینترفیس را نشان داده ایم.

import java.util.ArrayList;
import java.util.Enumeration;


public class Main {

    public static void main(String[] args) {
        Enumeration forums;
        ArrayList<String> itproCommunities=new ArrayList<>();
        itproCommunities.add("network");
        itproCommunities.add("programming");
        itproCommunities.add("security");
        itproCommunities.add("linux");
        itproCommunities.add("web");
        itproCommunities.add("dba");
        forums=new Enumerator(itproCommunities);
        while (forums.hasMoreElements()){
            System.out.println(forums.nextElement());
        }
    }
    static class Enumerator implements Enumeration<String>{
        private ArrayList<String> strings;
        int index;

        public Enumerator(ArrayList<String> strings) {
            this.strings = strings;
            index=0;
        }

        @Override
        public boolean hasMoreElements() {
            return index<strings.size();
        }

        @Override
        public String nextElement() {
            return strings.get(index++);
        }
    }
}

خروجی برنامه بالا به شکل زیر خواهد بود:

network
programming
security
linux
web
dba

نحوه عملکرد این اینترفیس بسیار شبه به iterator می باشد. که کار آن پیمایش داده های موجود در یک داده ساختار دیگر است.

داده ساختار BitSet

در این مطلب نیز قصد دارم یکی دیگر از داده ساختارهای موجود در زبان قدرتمند جاوا را شرح دهم. داده ساختاری که قصد دارم توضیح دهم BitSet نام دارد.

 معرفی کاربرد BitSet

کلاس BitSet یک گروه از بیت ها و فلگ ها را تعریف می کند که می تواند یک مجموعه باشد. این کلاس زمانی که می خواهید مقادیر منطقی و بولین را نگهداری کنید بسیار مفید خواهد بود. به این شکل که شما به ازای هر مقدار یک بیت را صفر یا یک می کنید.

به عبارت دیگر این کلاس یک آرایه از بیت ها را نگهداری می کند. آرایه موجود در BitSet می تواند به هر اندازه که لازم باشد بزرگ شود. این کلاس یک کلاس قدیمی است ولی در زمان نسخه دوم جاوا بازمهندسی شد. این کلاس دو constructor دارد که یکی همان constructor پیش فرض کلاس ها می باشد و دیگری یک ورودی از نوع int دریافت می کند که سایز آرایه BitSet می باشد. متدهایی که این کلاس تعریف می کند شامل اعمال منطقی مختلفی است که بر روی بیت ها انجام می شود که در ادامه به شرح آنها می پردازیم.

آموزش استفاده از متدهای کلاس BitSet

  1. متد and: این متد یک ورودی از نوع BitSet دارد و بیت های شئ فراخونی کننده را با بیت های شئ ورودی and می کند و نتیجه را در شئ فراخوانی کننده می ریزد.
  2. متد andNot: این متد مانند متد and عمل می کند و دقیقا شبیه متد and است با این تفاوت که عمل andNot را بر روی بیت ها انجام می دهد نه عمل and
  3. متد cardinality این متد تعداد بیتهای شئ را برمی گرداند.
  4. متد clear این متد سه شکل دارد در شکل اول بدون ورودی بوده همه ی بیتهای یک شئ را صفر می کند و در شکل دوم یک مقدار int به عنوان ورودی دریافت می کند که این ورودی شماره بیتی است که قرار است صفر شود. و در شکل سوم دو ورودی دارد که ورودی اول نقطه شروع و ورودی دوم نقطه پایان بازه ای است که می خواهیم صفر کنیم. کلاس BitSet همچنین دارای متد equals برای مقایسه بین دوشئ می باشد.
  5. متد flip این متد دارای دو شکل است. یکی با یک ورودی و دیگری با دو ورودی در شکل تک ورودی این متد یک شماره بیت به متد داده می شود و وظیفه متد این است که ان را تغییر حالت بدهد یعنی اگر صفر است به یک و بالعکس تغییر دهد. در حالت دوم این متد اندیس شروع و اندیس پایان به عنوان ورودی دریافت شده و بازه بین شروع و پایان تغییر داده می شود.
  6. متد get نسخه اول این متد دارای یک ورودی است که اندیس یک بیت را مشخص می کند و مقدار آن بیت را برمی گرداند. و نسخه دوم این متد اندیس شروع و پایان را گرفته و بیت های آن بازه را در قالب یک شئ BitSet برمی گرداند دقت داشته باشید که در نسخه اول این متد خروجی به صورت بولین خواهد بود.
  7. متد intersects این متد یک ورودی از نوع BitSet دارد و خروجی آن از نوع بولین است. وظیفه این متد این است که اگر حداقل یک بیت در هر کدام از دو شئ فراخوانی کننده و شئ ورودی با اندیس برابر یک باشد مقدار true را برمی گرداند.
  8. متد isEmpty این متد مشخص می کند که آیا همه بیت های شئ صفر هستند یا خیر. اگر همه ی بیت ها صفر باشند مقدار true برگردانده خواهد شد.
  9. برای گرفتن طول آرایه کلاس Bitset از متد size استفاده می کنیم و برای پیدا کردن اندیس آخرین بیت 1 از متد length استفاده می نماییم.
  10. متدهای nextClearBit, nextSetBit این متدها یک اندیس ورودی دارند که اندیس شروع عملیات را مشخص می کند. وظیفه این متدها این است که از اندیس شروع شروع کرده و متد nextClearBit اندیس اولین بیت صفر و متد nextSetBit اندیس اولین بیت 1 را برمی گرداند.
  11. متد or این متد شبیه همان عمل متد and است با این تفاوت که بیت ها را با هم or می کند.
  12. متد set: این متد دارای سه شکل است و برعکس متد clear عمل می کند.
  13. متد xor این متد یک شئ از نوع BitSet را دریافت می کند و دو شئ BitSet را با هم xor می نماید. عمل xor به شکلی است که اگر هر دو بیت با هم 0 باشند مقدار 0 و اگر دو بیت با هم 1 باشند مقدار 0 و اگر یکی 0 و یکی 1 باشد مقدار 1 برمی گرداند.

برای درک بهتر متدهای گفته شده به برنامه زیر دقت کنید.

import java.util.BitSet;

public class BitSetDemo {

  public static void main(String args[]) {
     BitSet bits1 = new BitSet(16);
     BitSet bits2 = new BitSet(16);
      
     // set some bits
     for(int i=0; i<16; i++) {
        if((i%2) == 0) bits1.set(i);
        if((i%5) != 0) bits2.set(i);
     }
     System.out.println("Initial pattern in bits1: ");
     System.out.println(bits1);
     System.out.println("\nInitial pattern in bits2: ");
     System.out.println(bits2);

     // AND bits
     bits2.and(bits1);
     System.out.println("\nbits2 AND bits1: ");
     System.out.println(bits2);

     // OR bits
     bits2.or(bits1);
     System.out.println("\nbits2 OR bits1: ");
     System.out.println(bits2);

     // XOR bits
     bits2.xor(bits1);
     System.out.println("\nbits2 XOR bits1: ");
     System.out.println(bits2);
  }
}

خروجی برنامه بالا به شکل زیر خواهد بود:

Initial pattern in bits1:
{0, 2, 4, 6, 8, 10, 12, 14}

Initial pattern in bits2:
{1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14}

bits2 AND bits1:
{2, 4, 6, 8, 12, 14}

bits2 OR bits1:
{0, 2, 4, 6, 8, 10, 12, 14}

bits2 XOR bits1:
{}

داده ساختار Vector

در ادامه مباحث داده ساختار های موجود در جاوا در این مطلب به بررسی داده ساختار Vector خواهیم پرداخت. کلاس vector بسیار شبیه به آرایه ها در جاوا می باشد. تفاوتی که این داده ساختار با آرایه دارد این است که طول آرایه ثابت است ولی این داده ساختار می تواند بزرگ تر شود و داده های بیشتری را در خود جای دهد.

مانند آرایه ها عناصر vector می تواند توسط اندیس مورد دسترسی قرار بگیرد. چیزی که در این داده ساختار وجود دارد این است که شما نگران جا برای عناصر نخواهید بود. اندازه داده ساختار vector به صورت اتوماتیک و هروقت که لازم باشد کوچک و بزرگ می شود.

وکتور شامل بسیاری از متدهای قدیمی می باشد که در حال حاضر در مجموعه ها وجود ندارد. وقتی که شما اندازه آرایه را نمی دانید و می خواهید در زمان اجرا بتوانید به راحتی اندازه آرایه را کم یا زیاد کنید این داده ساختار می تواند بسیار مناسب باشد. کلاس Vector دارای چندین contructor است که عبارتند از

  • constructor بدون ورودی: در این نوع constructor یک وکتور پیش فرض ساخته می شود که اندازه اولیه آن 10 می باشد.
  • constructor با یک ورودی int.: در این constructor وکتور یک مقدار عددی دریافت می کند که اندازه اولیه وکتور را مشخص می کند.
  • constructor با دو ورودی int: در این نوع constructor یک وکتور ساخته می شود که اندازه اولیه آن برابر همان ورودی اول می باشد و ورودی دوم برای این است که اگر زمانی همه ی خانه های وکتور پر شدند چندخانه به فضای کنونی وکترو اضافه گردد.
  • constructor با یک ورودی از کلاس collection. یک وکتور در این نوع ساخته می شود که همه ی عناصر موجود در کلاس collection را دارا می باشد.

آموزش استفاده از متدهای کلاس Vector

کلاس vector دارای متدهای زیر می باشد.:

  • متد add: این متد دارای دو ورودی است یکی عددی و دیگری object. ورودی عددی نشانگر اندیس و object ورودی نشان دهنده داده مورد نظر است. وظیفه این متد این است که داده مورد نظر را در اندیس مشخص شده در vector درج می نماید. یک نوع دیگر این متد فقط یک ورودی دارد و آن هم یک object است که در انتهای vector درج می شود.
  • متد addAll. این متد دارای دو شکل گوناگون است که در یکی فقط یک شئ از کلاس collection به عنوان ورودی دریافت می کنیم و در دیگری یک عدد به عنوان اندیس نیز علاوه بر آن شئ collection نیز دریافت می کند. وظیفه این متد این است که عناصر موجود در شئ collection را در vector درج می کند. اگر ما با اندیس مشخص کرده باشیم که عناصر در کجا درج شوند در آن نقطه درج خواهند شد و در غیر این صورت در انتهای vector درج می شوند.
  • متد addElement: این متد یک ورودی object دارد که آن را به انتهای وکتور اضافه می کند و اندازه وکتور را یکی بیشتر می کند.
  • متد capacity: این متد ظرفیت کنونی وکتور را نشان می دهد.
  • متد clear: این متد همه ی عناصر موجود در وکتور را پاک می کند.
  • متد contains: این متد یک شئ را به عنوان ورودی می گیرد و مشخص می کند که شئ ورودی در داخل وکتور موجود می باشد یا نه.
  • متد containsAll: این متد یک شئ از کلاس collection را دریافت می کند که مجموعه ای از اشیاء دیگر است سپس چک می کند که همه ی اشیاء در وکتور موجود هستند یا خیر.
  • متد copyInto: این متد یک آرایه را به عنوان ورودی دریافت می کند و همه ی عناصر وکتور را در درون آرایه ورودی کپی می کند.
  • متد elementAt: این متد یک اندیس ورودی دارد و عنصر موجود در آن اندیس را برمی گرداند.
  • متد elements: این متد یک Enumeration برمی گرداند که می توان با استفاده از حلقه به همه ی اعضای وکتور دسترسی داشت.
  • متد firstElement: این متد اولنی عنصر از وکتور (عنصر با اندیس 0 را برمی گرداند).
  • متد get: این متد یک اندیس را گرفته و عنصر متناسب با آن اندیس را برمی گرداند.
  • متد indexOf: این متد یک شئ را به عنوان ورودی دریافت می کند و آن شئ را در داخل وکتور جستجو می کند و وقتی که شئ مورد نظر را پیدا کرد اندیس آن را به عنوان نتیجه برمی گرداند. این متد همچنین یک شکل دیگر هم دارد که علاوه بر شئ ورودی یک عدد نیز می گیرد که آن عدد اندیس محل شروع جستجو می باشد و از آن اندیس به بعد در وکتور به دنبال شئ مورد نظر می گردد. اگر بخواهیم که این متد از آخر به اول جستجو را انجام دهد و اندیس آخر شئ پیدا شده را به ما بدهد از متد lastIndexOf استفاده می کنیم که این متد نیز دقیقا مانند متد indexOf می باشد.
  • متد isEmpty: این متد مشخص می کند که وکتور خالی است یا خیر.
  • متد remove این متد یک اندیس دریافت کرده و شئ مورد نظر را از وکتور حذف می کند و همچنین آن شئ را برمی گرداند. همچنین این متد شکلی دیگر دارد که یک شئ را دریافت کرده و در وکتور به دنبال آن می گردد و اگر شئ مورد نظر پیدا شد و حذف شد مقدار true برمی گرداند.
  • متد trimToSize: این متد ظرفیت وکتور را با تعداد عناصر آن یکی می کند. به عبارتی خانه های خالی را از ظرفیت آن حذف می کند.
  • متد set: این متد یک اندیس و یک شئ می گیرد و شئ گرفته شده را با عنصر موجود در آن اندیس وکتور جایگزین می کند.

در ادامه یک مثالی از استفاده از وکتور آورده ایم که باعث می شود درک استفاده از این داده ساختار در جاوا راحت تر شود.

import java.util.*;

public class VectorDemo {

   public static void main(String args[]) {
      // initial size is 3, increment is 2
      Vector v = new Vector(3, 2);
      System.out.println("Initial size: " + v.size());
      System.out.println("Initial capacity: " +
      v.capacity());
      v.addElement(new Integer(1));
      v.addElement(new Integer(2));
      v.addElement(new Integer(3));
      v.addElement(new Integer(4));
      System.out.println("Capacity after four additions: " +
          v.capacity());

      v.addElement(new Double(5.45));
      System.out.println("Current capacity: " +
      v.capacity());
      v.addElement(new Double(6.08));
      v.addElement(new Integer(7));
      System.out.println("Current capacity: " +
      v.capacity());
      v.addElement(new Float(9.4));
      v.addElement(new Integer(10));
      System.out.println("Current capacity: " +
      v.capacity());
      v.addElement(new Integer(11));
      v.addElement(new Integer(12));
      System.out.println("First element: " +
         (Integer)v.firstElement());
      System.out.println("Last element: " +
         (Integer)v.lastElement());
      if(v.contains(new Integer(3)))
         System.out.println("Vector contains 3.");
      // enumerate the elements in the vector.
      Enumeration vEnum = v.elements();
      System.out.println("\nElements in vector:");
      while(vEnum.hasMoreElements())
         System.out.print(vEnum.nextElement() + " ");
      System.out.println();
   }
}

خروجی برنامه بالا به شکل زیر خواهد بود:

Initial size: 0
Initial capacity: 3
Capacity after four additions: 5
Current capacity: 5
Current capacity: 7
Current capacity: 9
First element: 1
Last element: 12
Vector contains 3.

Elements in vector:
1 2 3 4 5.45 6.08 7 9.4 10 11 12

داده ساختار Stack (پشته)

یکی از داده ساختار هایی که در نرم افزار ها و همه سیستم عامل ها مورد استفاده قرار می دهند داده ساختار پشته است. پشته مکانیزم last in first out یا (LIFO) را پیاده سازی می کند. به این شکل که پشته فقط یک راه ورود و خروج برای داده ها دارد.

پس آخرین داده ای که وارد پشته می شود هنگام خروج اولین داده ای است که خارج می شود. به عبارت دیگر وقتی که داده ای را به پشته اضافه می کنیم به سرپشته اضافه می شود. پشته یک زیرکلاس از وکتور است ولی نوع ذخیره سازی داده ها فرق می کند. نام کلاس پشته Stack است. که فقط دارای یک constructor است که دارای هیچ پارامتری نیست. علاوه بر متدهایی که کلاس Stack از کلاس Vector به ارث برده است کلاس Stack متدهای زیر را تعریف می کند.

  • متد empty: این متد چک می کند که پشته خالی است یا خیر. اگر پشته خالی باشد مقدار true و در غیر این صورت مقدار false را برمی گرداند.
  • متد peek این متد عنصر بالای پشته را برمی گرداند ولی آن را حذف نمی کند.
  • متد pop این متد عنصر بالای پشته را برمی گرداند و همچنین آن را حذف می کند.
  • متد push این متد یک ورودی از نوع object می گیرد و آن را در بالای پشته قرار می دهد و همچنین آن عنصر را برمی گرداند.
  • متد search این متد یک شئ را گرفته و آن را در پشته جستجو می کند و اگر عنصر مورد نظر پیدا شد فاصله آن را از سر پشته برمی گرداند و اگر پیدا نشد مقدار 1 برمی گرداند.

برای مثال و درک بهتر کلاس Stack به مثال زیر در مورد پشته دقت کنید

import java.util.*;

public class StackDemo {

   static void showpush(Stack st, int a) {
      st.push(new Integer(a));
      System.out.println("push(" + a + ")");
      System.out.println("stack: " + st);
   }

   static void showpop(Stack st) {
      System.out.print("pop -> ");
      Integer a = (Integer) st.pop();
      System.out.println(a);
      System.out.println("stack: " + st);
   }

   public static void main(String args[]) {
      Stack st = new Stack();
      System.out.println("stack: " + st);
      showpush(st, 42);
      showpush(st, 66);
      showpush(st, 99);
      showpop(st);
      showpop(st);
      showpop(st);
      try {
         showpop(st);
      } catch (EmptyStackException e) {
         System.out.println("empty stack");
      }
   }
}

خروجی برنامه بالا به شکل زیر خواهد بود:

stack: [ ]
push(42)
stack: [42]
push(66)
stack: [42, 66]
push(99)
stack: [42, 66, 99]
pop -> 99
stack: [42, 66]
pop -> 66
stack: [42]
pop -> 42
stack: [ ]
pop -> empty stack

داده ساختار Dictionary

یکی دیگر از داده ساختار های موجود در جاوا dictionary می باشد. این داده ساختار با داده ساختار هایی که تاکنون گفتیم فرق دارند. به این شکل که این داده ساختار به گونه ای است که یک عنصر کلید دارد و یک عنصر مقدار که این المان ها با هم هستند یعنی به شکلی که هر عضو از کلاس dictionary یک کلید دارد و یک مقدار.

از طرفی مقادیر کلیدها باید همیشه یکتا باشد. این برای زمانی که شما قصد دارید با استفاده از کلید به داده های خودتان دسترسی داشته باشید بسیار مناسب است. به علت این که کلاس dictionary یک کلاس abstract است نمی توان از آن یک شئ ساخت که بتوان از استفاده نمود و باید از آن ارث بری کرد.

ولی این کلاس یک فریمورک خوب برای جفت کلید و مقدار برای ما فراهم کرده است که بتوان با استفاده از آن کلاس دیکشنری اختصاصی خود را تعریف نمود. برای این که بتوانید یک مقدار را به دست آورید باید کلید آن را داشته باشید. متدهایی که در این کلاس معرفی شده است به شرح زیر است:

  • متد size: این متد تعداد عناصر موجود در دیکشنری را برمی گرداند.
  • متد isEmpty: این متد مشخص می کند که dictionary ما خالی است یا خیر.
  • متد keys: این متد همه ی کلید های موجود را به صورت یک Enumeration برمی گرداند که می توان آنها را پیمایش کرد.
  • متد elements: این متد مجموعه مقادیر را به صورت یک Enumeration برمی گرداند که می توان آنها را پیمایش کرد.
  • متد get: این متد یک کلید می گیرد و مقدار مطابق با آن را برمی گرداند.
  • متد put: این متد یک کلید و یک مقدار را دریافت کرده و آن ها را در dictionary قرار می هد.
  • متد remove: این متد یک کلید دریافت کرده و عنصر آن را از مجموعه حذف می کند.

دقت داشته باشید که کلاس Ditionary می تواند به صورت generic هم پیاده سازی شود ولی ما در اینجا فعلا این کار را نمی کنیم. Generic ها را در مطالب بعدی به طور مفصل شرح خواهیم داد.

کلاس های متعددی مانند HashSet در جاوا هستند که از کلاس dictionary ارث بری کرده اند ولی ما برای این که با کل متدها و مفاهیم این کلاس آشنا شوید یک ارث بری جداگانه از این کلاس داشته و پیاده سازی کرده ایم که در ادامه آن را آورده ایم:

import java.util.ArrayList;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Iterator;

public class DictionaryTest {
    public static void main(String[] args) {
        MyDictionary dictionary = new MyDictionary();
        dictionary.put(1, "Itpro");
        dictionary.put(2, "Itpro.ir");
        dictionary.put(3, "Itpro java");
        System.out.println(dictionary.size());
        System.out.println(dictionary.get(2));
        Object lastValue = dictionary.put(2, "Persian IT Community");
        System.out.println(lastValue);
        System.out.println(dictionary.get(2));
    }
}

class MyDictionary extends Dictionary {
    private ArrayList keyList = new ArrayList();
    private ArrayList valueList = new ArrayList();

    @Override
    public int size() {
        return keyList.size();
    }

    @Override
    public boolean isEmpty() {
        return keyList.isEmpty();
    }

    @Override
    public Enumeration keys() {
        Iterator iterator = keyList.iterator();
        return new Enumeration() {
            @Override
            public boolean hasMoreElements() {
                return iterator.hasNext();
            }

            @Override
            public Object nextElement() {
                return iterator.next();
            }
        };
    }

    @Override
    public Enumeration elements() {
        Iterator iterator = valueList.iterator();
        return new Enumeration() {
            @Override
            public boolean hasMoreElements() {
                return iterator.hasNext();
            }

            @Override
            public Object nextElement() {
                return iterator.next();
            }
        };
    }

    @Override
    public Object get(Object key) {
        int i = keyList.indexOf(key);
        if (i == -1)
            return null;
        else return valueList.get(i);
    }

    @Override
    public Object put(Object key, Object value) {
        Object foundKey = get(key);
        if (foundKey == null) {
            keyList.add(key);
            valueList.add(value);
            return null;
        } else {

            Object lastValue = foundKey;
            int index = keyList.indexOf(key);
            valueList.set(index, value);
            return lastValue;
        }
    }

    @Override
    public Object remove(Object key) {
        int index = keyList.indexOf(key);
        if (index == -1)
            return null;
        Object lastValue = valueList.get(index);
        keyList.remove(index);
        valueList.remove(index);
        return lastValue;
    }
}

خروجی برنامه بالا به شکل زیر خواهد بود:

3
Itpro.ir
Itpro.ir
Persian IT Community

داده ساختار Hashtable

داده ساختاری که در این مطلب قصد معرفی آن را داریم Hashtable می باشد. کلاس Hashtable مکانیزمی را فراهم می کند که داده ها بر اساس کلید هایی که از طرف کاربر تعریف شده است مرتب شوند. برای مثال در یک Hashtable که آدرس ها را ذخیره می کند شما می توانید آدرس ها را طبق کدپستی آنها ذخیره و مرتب کنید. می توان گفت که Hashtable یک پیاده سازی و وارث از کلاس dictionary می باشد. کلاس Hashtable در پکیج java.util قرار دارد. اما در نسخه 2 جاوا این کلاس مورد مهندسی مجدد قرار گرفت و اینترفیس Map را هم به آن اضافه کردند.

بنابراین در حال حاضر کلاس Hashtable در داخل فریمورک collections قرار دارد. این کلاس شبیه HashMap است با این تفاوت که این کلاس synchronize شده می باشد. کلاس Hashtable مانند کلاس HashMap داده هار را به صورت جفت های کلیدو مقدار(key value) ذخیره می کند.

وقتی که از Hashtable استفاده می کنید شما باید یک شئ را به عنوان کلید برای آن مشخص کنید و یک شئ را به عنوان مقدار مشخص کنید که به کلید وصل شود. مکانیزم Hashtable به این شکل است که کد hash کلید را به دست آورده و از آن به عنوان اندیس پیدا کردن محل عنصر استفاده می کند. بنابراین سرعت آن بالا می باشد. در ادامه constructor هایی که در کلاس Hashtable قرار دارد آورده شده است.

یکی از constructor هایی که این کلاس دارد نوع پیش فرض آن بوده که هیچ پارامتر ورودی ندارد. نوع دوم آن یک مقدار عددی می گیرد که به عنوان سایز Hashtable می باشد و یک Hashtable به اندازه آن درست می کند. نوع سوم constructor این کلاس به این شکل است که علاوه بر مقدار عددی سایز یک مقدار اعشاری نیز دریافت می کند.

این مقدار اعشاری دوم برای این است که مشخص کنیم که چه مقدار از Hashtable باید پر شود تا Hashtable تغییر اندازه یا resize بدهد. دقت داشته باشید که این مقدار باید بین 0.0 تا 1.0 باشد. متدهایی که این کلاس دارد را نیز در ادامه آورده ایم:

  • متد clear: این متد کل عناصر موجود در Hashtable را حذف می کند.
  • متد containsVlue: این متد یک ورودی می گیرد و مشخص می کند که آیا شئ وارد شده در value ها وجود دارد یا خیر
  • containsKey: این متد یک ورودی می گیرد و مشخص می کند که آیا شئ وارد شده در key ها وجود دارد یاخیر:
  • متد get این متد یک کلید می گیرد و value آن را برمی گرداند و اگر کلید مورد نظر در داخل Hashtable وجود نداشته باشد مقدار null برمی گرداند.
  • سایر متدهای این کلاس به علت این که این کلاس از کلاس Dictionary ارث بری کرده است همانهایی است که در بخش قبل گفتیم متد مهمی که به این مجموعه متدها اضافه شده است متد rehash است که اندازه hash table را افزایش می دهد و همه ی کلید ها را دوباره hash می کند. برای درک بهتر یک مثال از این کلاس در ادامه آورده ایم که به آن توجه کنید:
import java.util.*;

public class HashTableDemo {

    public static void main(String args[]) {
        // Create a hash map
        Hashtable balance = new Hashtable();
        Enumeration names;
        String str;
        double bal;

        balance.put("Nasiri", new Double(3434.34));
        balance.put("Adeli", new Double(123.22));
        balance.put("Ahmadi", new Double(1378.00));
        balance.put("itpro", new Double(99.22));
        balance.put("Itpro.ir", new Double(-19.08));

        // Show all balances in hash table.
        names = balance.keys();
        while(names.hasMoreElements()) {
            str = (String) names.nextElement();
            System.out.println(str + ": " +
                    balance.get(str));
        }
        System.out.println();
        // Deposit 1,000 into Zara's account
        bal = ((Double)balance.get("Adeli")).doubleValue();
        balance.put("Adeli", new Double(bal+1000));
        System.out.println("Adeli's new balance: " +
                balance.get("Adeli"));
    }
}

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

Itpro.ir: -19.08
Ahmadi: 1378.0
itpro: 99.22
Adeli: 123.22
Nasiri: 3434.34

Adeli's new balance: 1123.22

داده ساختار Properites

یکی از داده ساختار های مهم دیگری که در زبان جاوا وجود دارند properties است. داده ساختار خود یک زیر کلاس از کلاس Hashtable است که برای نگهداری یک لیست از کلیدهای رشته ای و مقادیر رشته ای به کار می رود. این داده ساختار در بسیاری از کلاس های جاوا به کار رفته است. برای مثال اگر بخواهید اطلاعات محیطی را که برنامه در آن در حال اجرا است باید از کلاس System.getProperties استفاده کنید. که از properties استفاده می کند. مشخصاتی که اعضای کلاس properties دارد به شرح زیر است:

  • نوع داده همه کلید ها و مقدار ها string است.
  • در کلاس properties می توان یک مقدار پیش فرض یا default داشت که اگر دنبال کلیدی بگردیم و آن پیدا نشود می توان آن را برگرداند.
  • کلاس properties یک کلاس tread-safe می باشد. به این معنی که اگر یک کلاس را بین چند thread به اشتراک بگذاریم به طوری که thread ها به صورت همزمان از آن استفاده کنند مشکلی پیش نمی آید.
  • در درون کلاس properties یک شئ از نوع properties وجود دارد که به صورت projected معرفی شده است و مقادیر پیش فرض را نگهداری می کند.

سازنده های این کلاس به دو شکل بدون پارامتر ورودی و با یک پارامتر وجود دارد که پارامتر مورد نظر یک شئ از نوع properties است و مقادیر پیش فرض را در خود دارد. متدهای این کلاس به شکل زیر است

  • متد getProperty: این متد یک کلید را می گیرد و به دنبال مقدار آن می گردد. اگر ما به عنوان پارامتر دوم یک مقدار رشته ای برای پیش فرض آن وارد کنیم اگر کلید مورد نظر پیدا نشود آن مقدار برگردانده خواهد شد.
  • متد list: این متد یک شئ از کلاس PrintStream و یا printWriter دریافت کرده و کل لیست را در آن می نویسد.
  • متد load: این متد یک شئ از نوع InputStream و یا Reader می گیرد و کل لیست property ها را از آن می خواند.
  • متد loadFromXml: این متد یک شئ InputStream به عنوان ورودی می گیرد که این شئ هندلر یک فایل xml را خواهد داشت. از این فایل property ها را خوانده و در شئ ذخیره می کند.
  • متد propertyNames این متد نام همه کلید های لیست اصلی و لیست default را برمی گرداند.
  • متد setProperty: این متد دو رشته به عنوان کلید و مقدار دریافت کرده و آن را در لیست property ها قرار می دهد.

برنامه زیر به شما کمک می کند تا کلاس properties را بهتر بشناسید و با متدهای آن آشناتر بشوید.

import java.util.*;

public class PropDemo {

    public static void main(String args[]) {
        Properties addresses = new Properties();
        Set urls;
        String str;

        addresses.put("Software development", "programming.tosinso.com");
        addresses.put("Web development", "web.tosinso.com");
        addresses.put("Network administration", "network.tosinso.com");
        addresses.put("Security Tutorial", "security.tosinso.com");
        addresses.put("Virtulization Technologies", "virtualization.tosinso.com");


        urls = addresses.keySet(); // get set-view of keys
        Iterator itr = urls.iterator();
        while(itr.hasNext()) {
            str = (String) itr.next();
            System.out.println("The url of " +
                    str + " is " + addresses.getProperty(str) + ".");
        }
        System.out.println();

        // look for state not in list -- specify default
        str = addresses.getProperty("Sports", "Not Found");
        System.out.println("The url of Sports is "
                + str + ".");
    }
}


خروجی برنامه بالا به شکل زیر خواهد بود:

The url of Virtulization Technologies is virtualization.tosinso.com.
The url of Security Tutorial is security.tosinso.com.
The url of Network administration is network.tosinso.com.
The url of Software development is programming.tosinso.com.
The url of Web development is web.tosinso.com.

The url of Sports is Not Found.

معرفی و آموزش جنریک (Generic)

آیا تا به حال فکر کرده اید که اگر یک متد مرتب سازی داشتیم که اگر داده int به متد می دادیم همان متد می توانست داده های int را مرتب کند و اگر داده string به آن می دادیم می توانست آنها را مرتب کند و یا هر نوع داده را به آن می دادیم می توانست آن را مرتب کند.

دقت کنید که فقط یک متد باشد نه این که با استفاده از overload کردن متدها برای هر نوع داده ای یک متد جدا بنویسیم. فقط یک متد داشته باشیم که بتواند با هر نوع داده ای کار کرده و عمل مرتب سازی را بر روی آن انجام دهد. این کار شدنی است.

با استفاده از متدها و کلاس های جنریک (generic) در جاوا می توان این کار را انجام داد. با استفاده از امکان جنریک شما می توانید یک متد معرفی کنید و این متد برای چندین نوع داده کار خواهد کرد. یا می توانید یک کلاس جنریک تعریف کنید که داخل کلاس یک مجموعه متدها وجود داشته باشد که با انواع داده های مختلف کار کند. همچنین انواع داده جنریک را می توان در زمان کامپایل بررسی کرد تا اگر نوع داده ای نامعتبر است بتوان آن را کنترل کرد.

 معرفی کاربرد متدهای جنریک

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

  • همه ی متدهای جنریک یک نوع داده برای پارامتر دارند که هنگام تعریف به جای این که از انواع داده که قبلا گفتیم استفاده کنند از یک شاخص بین دو کاراکتر <> استفاده می شود و اگر قرار باشد که متدی یک مقدار جنریک برگرداند از همین شاخص به جای انواع داده قبلی استفاده خواهد شد. همچنین برای این که بخواهیم نوع داده پارامتر ها هم جنریک باشد به جای استفاده از انوع داده اولیه از شاخص ها استفاده می کنیم.
  • به شاخصی که به جای نوع داده اصلی قرار می دهیم پارامتر نوع گفته می شود و اگر قرار باشد که از دو نوع داده جدا از هم در برنامه استفاده شود باید از چند پارامتر نوع متفاوت استفاده کرد که آنها را با استفاده از , جدا می کنیم.
  • بدنه یک متد جنریک مانند بدنه بقیه متدها می باشد فقط به جای استفاده از نوع داده ای که قبلا از آن استفاده می شد از پارامتر نوع استفاده می کنیم.

مثال زیر مشخص می کند که چگونه می توانیم یک آرایه از داده های مختلف را در خورجی چاپ کنیم.

public class GenericMethodTest
{
   // generic method printArray                         
   public static < E > void printArray( E[] inputArray )
   {
      // Display array elements              
         for ( E element : inputArray ){        
            System.out.printf( "%s ", element );
         }
         System.out.println();
    }

    public static void main( String args[] )
    {
        // Create arrays of Integer, Double and Character
        Integer[] intArray = { 1, 2, 3, 4, 5 };
        Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
        Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };

        System.out.println( "Array integerArray contains:" );
        printArray( intArray  ); // pass an Integer array

        System.out.println( "\nArray doubleArray contains:" );
        printArray( doubleArray ); // pass a Double array

        System.out.println( "\nArray characterArray contains:" );
        printArray( charArray ); // pass a Character array
    } 
}

خروجی برنامه بالا به شکل زیر خواهد بود:

Array integerArray contains:
1 2 3 4 5 6

Array doubleArray contains:
1.1 2.2 3.3 4.4 

Array characterArray contains:
H E L L O

در مثال بالا حرف E یک پارامتر نوع می باشد که به هنگام استفاده می توان از انواع داده مختلفی به جای این پارامتر نوع استفاده کرد.

آموزش محدود کردن پارامترهای نوع

ممکن است اوقاتی پیش بیاید که بخواهیم پارامترهای نوع را محدود تر کنیم تا در اجرا متد ها و کدهایمان به مشکل برنخوریم. در این صورت پارامتر نوع باید به گونه ای باشد که در حین فراخوانی اگر نوع داده مورد نظر شروط مورد نظر را نداشته باشد اجازه اجرا به برنامه ندهد.

برای مثال ممکن است که یک متد فقط روی اعداد کار کند. بنابراین نوع داده ای که باید به متد داده شود یا باید از کلاس Number باشد و یا یکی از زیرکلاس های آن باشد. برای انجام این کار باید ابتدا نام خود پارامتر نوع را بیاوریم و بعد از آن کلمه کلیدی Extends و بعد از آن نام کلاس پدر را بیاوریم. برای محدود کردن پارامترهای نوع می توان از کلمات کلیدی extends , implements استفاده کرد. برای مثال به کد زیر دقت کنید. این مثال بین 3 شئ بزرگترین آنها را برمی گرداند.

public class MaximumTest
{
   // determines the largest of three Comparable objects
   public static <T extends Comparable<T>> T maximum(T x, T y, T z)
   {                      
      T max = x; // assume x is initially the largest       
      if ( y.compareTo( max ) > 0 ){
         max = y; // y is the largest so far
      }
      if ( z.compareTo( max ) > 0 ){
         max = z; // z is the largest now                 
      }
      return max; // returns the largest object   
   }
   public static void main( String args[] )
   {
      System.out.printf( "Max of %d, %d and %d is %d\n\n", 
                   3, 4, 5, maximum( 3, 4, 5 ) );

      System.out.printf( "Maxm of %.1f,%.1f and %.1f is %.1f\n\n",
                   6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );

      System.out.printf( "Max of %s, %s and %s is %s\n","pear",
         "apple", "orange", maximum( "pear", "apple", "orange" ) );
   }
}

خروجی برنامه بالا به شکل زیر خواهد بود:

maximum of 3, 4 and 5 is 5

maximum of 6.6, 8.8 and 7.7 is 8.8

maximum of pear, apple and orange is pear

 معرفی کاربرد کلاس های جنریک

تعریف یک کلاس جنریک بسیار شبیه به تعریف یک کلاس معمولی است. تنها تفاوت آن این است که بعد از نام کلاس پارامترهای نوع بین <> خواهد آمد. اگر بیش از یک پارامتر نوع داشته باشیم باید آنها را با استفاده کاما (,) جدا کنیم. برای مثال به کد زیر توجه کنید که چگونه یک کلاس جنریک تعریف کرده ایم:

public class Box<T> {

  private T t;

  public void add(T t) {
    this.t = t;
  }

  public T get() {
    return t;
  }

  public static void main(String[] args) {
     Box<Integer> integerBox = new Box<Integer>();
     Box<String> stringBox = new Box<String>();
    
     integerBox.add(new Integer(10));
     stringBox.add(new String("Hello World"));

     System.out.printf("Integer Value :%d\n\n", integerBox.get());
     System.out.printf("String Value :%s\n", stringBox.get());
  }
}

خروجی برنامه بالا به شکل زیر خواهد بود:

Integer Value :10
String Value :Hello World

در زبان جاوا از مفهوم جنریک بسیار استفاده شده است. برای مثال برای داده ساختار هایی مانند لیست هاو set ها از این مفهوم استفاده شده است. نکته ای که باید به آن دقت داشته باشید این است که برای این که از کلاس یا متد جنریک استفاده کنیم نمی توانیم انواع داده های اصلی مانند int و یا double را به آن بدهیم و باید کلاس wrapper آنها یعنی Integer و Double را به کلاس جنریک اختصاص می دهیم. همانطور که در مثال های بالا دیدیم

برنامه نویسی سوکت و شبکه قسمت 1

یکی از قابلیت هایی که باعث می شود یک زبان برنامه نویسی محبوبیت بیشتری داشته باشد این است که آن زبان در شبکه چگونه کار می کند. کار کردن در شبکه یعنی این که برنامه بین چندین دستگاه (کامپیوتر) متصل به هم اجرا شود. منظور از متصل به هم این است که در یک شبکه به هم وصل باشند.

جاوا برای کار با شبکه پکیج java.net را ارائه کرده است که شامل API های j2se یا همان نسخه استاندارد جاوا است. این پکیج شامل کلاس ها و اینترفیس هایی است که به منظور ارتباط سطح پایین بین کامپیوتر ها مورد استفاده قرار می گیرند و به شما اجازه نوشتن برنامه های شبکه ای قوی را می دهد. پکیج java.net دو پروتکل رایج زیر را پشتیبانی می کند.

  • TCP: TCP مخفف Transmission Control Protocol می باشد که یک ارتباط قابل اعتماد و ایمن (reliable) را بین دو برنامه ایجاد می کند. این پروتکل همچنین در بستر اینترنت نیز استفاده می شود که به آن TCP//IP گفته می شود.
  • UDP: UDP مخفف User Datagram Protocol بوده و یک پروتکل connection-less می باشد که اجازه می دهد بسته های اطلاعاتی در شبکه ارسال شوند. دوستانی که در مورد این مفاهیم دچار اشکال هستند به مقالات و آموزش های network+ در وب سایت تخصصی فناوری اطلاعات (Itpro) مراجعه کنند.
با سلام به همه دوستان و همراهان عزیز Itpro. یکی از قابلیت هایی که باعث می شود یک زبان برنامه نویسی محبوبیت بیشتری داشته باشد این است که آن زبان در شبکه چگونه کار می کند. کار کردن در شبکه یعنی این که برنامه بین چندین دستگاه (کامپیوتر) متصل به هم اجرا شود. منظور از متصل به هم این است که در یک شبکه به هم وصل باشند. جاوا برای کار با شبکه پکیج java.net را ارائه کرده است که شامل API های j2se یا همان نسخه استاندارد جاوا است. این پکیج شامل کلاس ها و اینترفیس هایی است که به منظور ارتباط سطح پایین بین کامپیوتر ها مورد استفاده قرار می گیرند و به شما اجازه نوشتن برنامه های شبکه ای قوی را می دهد. پکیج java.net دو پروتکل رایج زیر را پشتیبانی می کند.
* *TCP*: TCP مخفف Transmission Control Protocol می باشد که یک ارتباط قابل اعتماد و ایمن (reliable) را بین دو برنامه ایجاد می کند. این پروتکل همچنین در بستر اینترنت نیز استفاده می شود که به آن TCP//IP گفته می شود.
* *UDP*: UDP مخفف User Datagram Protocol بوده و یک پروتکل connection-less می باشد که اجازه می دهد بسته های اطلاعاتی در شبکه ارسال شوند. دوستانی که در مورد این مفاهیم دچار اشکال هستند به مقالات و آموزش های network+ در وب سایت تخصصی فناوری اطلاعات (Itpro) مراجعه کنند.
||http://tosinso.com/files/get/c5ed6611-32e5-44c2-8b64-f54786f978c6||

!!برنامه نویسی سوکت در جاوا
سوکت ها یک مکانیزم ارتباطی بین دو کامپیوتر را با استفاده از پروتکل TCP فراهم می آورند. برنامه کلاینت یک سوکت تعریف می کند و تلاش می کند به برنامه سرور وصل شود. وقتی که ارتباط برقرار شد برنامه سرور یک شئ سرور ایجاد می کند و با استفاده از این سوکت ها این دو برنامه به تبادل داده مشغول می شوند. ارسال داده ها با نوشتن داده در روی سوکت ها انجام می شود. کلاس java.net.Socket برای ساخت سوکت مورد استفاده قرار می گیرد و کلاس java.net.ServerSocket مکانیزمی را فراهم می آورد تا برنامه سرور بتواند به خط گوش دهد و با کلاینت ها ارتباط برقرار کند. مراحل ایجاد یک ارتباط TCP بین دو کامپیوتر توسط سوکت به شرح زیر است. دقت داشته باشید که منظور از سرور در اینجا سرور فیزیکی نیست که در شبکه مورد بحث واقع می شود بلکه منظور ما از سرور همان برنامه ای است که برنامه های دیگر به آن پیام می فرستند. منظور از پورت هم پورت نرم افزاری بوده که یک شماره دارد و با پورت سخت افزاری اشتباه گرفته نشود.
* سرور یک شئ ServerSocket می سازد و شماره پورت ارتباط را مشخص می کند.
* سرور متد accept را از شئ ServerSocket فراخوانی می کند. این متد منتظر می ماند تا یک کلاینت با استفاده از شماره پورت مشخص شده به سرور متصل شود.
* بعد از این که سرور به حالت انتظار رفت، کلاینت مورد نظر یک شئ از کلاس Socket می سازد که آدرس سرور و شماره پورتی را که قرار است را برای آن مشخص می کند .
* متد constructor کلاس Socket سعی می کند که به سرور مشخص شده با شماره پورت مشخص شده وصل شود. اگر ارتباط برقرار شد برنامه کلاینت یک شئ دارد که با استفاده از آن می تواند به سرور وصل شود و تبادل داده بکند.
* در سمت سرور متد accept یک شئ Socket از سوکت جدید ایجاد شده برمی گرداند. با استفاده از این سوکت می توان با کلاینت مورد نظر ارتباط برقرار کرد.
بعد از این که ارتباط برقرار شد می توان با استفاده از استریم های I//O داده ها را انتقال داد. هر سوکتی هم InputStream و هم OutputStream را دارا می باشد. استریم OutputStream مربوط به کلاینت به استریم InputStream مربوط به سرور وصل می باشد و بالعکس استریم InputStream مربوط به کلاینت به استریم OutputStream مربوط به سرور متصل است. پروتکل TCP یک پروتکل دوراهه است. بنابراین داده ها همزمان می توانند ارسال و دریافت شوند. در ادامه به کلاس ها و متدهایی که برای ارتباط سوکت مناسب هستند می پردازیم.

!!متدهای کلاس ServerSocket
کلاس java.net.ServerSocket در برنامه سمت سرور استفاده می شود و از این کلاس برای گرفتن یک پورت و گوش دادن به درخواست های کلاینت ها به کار می رود. این کلاس 4 متد constructor دارد که این constructor ها به شرح زیر می باشند.
# سازنده با یک پارامتر ورودی عددی
<java>
public ServerSocket(int port) throws IOException
<java>
این سازنده یک شماره پورت می گیرد و یک سوکت می سازد و آن شماره پورت را به سوکت مورد نظر اختصاص می دهد. اگر پورت مورد نظر به برنامه دیگری اختصاص داده شده باشد exception رخ خواهد داد.
# سازنده با دو پارامتر ورودی عددی
<java>
public ServerSocket(int port, int backlog) throws IOException
<java>
این constructor شبیه به قبلی است و پارامتر backlog به این منظور است که مشخص می کند که چند عدد کلاینت در صف انتظار بتوانند منتظر بمانند به عبارت دیگر صف انتظار سرور چندتایی باشد.
# سازنده با دو پارامتر عددی و یک پارامتر از نوع InetAddress
<java>
public ServerSocket(int port, int backlog, InetAddress address) throws IOException
<java>
این constructor مانند قبلی است و پارامتر address برای این است که مشخص کنیم که سرور از کدام IP محلی استفاده کند. این برای زمانی است که در یک کامپیوتر چندین کارت شبکه موجود باشد و هرکدام IP های مختلفی داشته باشند. در این صورت باید یک IP را معرفی کنیم تا سرور به آن مقید شود باید از این constructor استفاده کنیم و به سرور بگوییم که فقط کلاینت های این آدرس را بپذیر.
# سازنده بدون پارامتر این سازنده هیچ پارامتری ندارد حتی شماره پورت. این سازنده یک سوکت سروری می سازد که به هیچ پورتی bind نشده است. وقتی که از این سازنده استفاده می کنید باید بعد از آن با استفاده از متد bind شماره پورت و بقیه قسمت ها را به شئ ServerSocket اختصاص دهید.
اگر سازنده ServerSocket هیچ exceptionی ندهد به این معنی است که سوکت با موفقیت ساخته شده است و به پورت مورد نظر اختصاص داده شده است و آماده است تا درسخواتس های کاربران را دریافت کند. متدهای رایج کلاس ServerSocket در ادامه آورده شده اند.

!!متد های معمول کلاس ServerSocket
* متد getLocalPort: این متد پورتی را که سرور در حال گوش دادن به آن است را برمی گرداند.
* متد accept این متد برای انتظار برای کلاینت های ورودی به کار می رود. این متد به صورت بلوکه شده باقی می ماند تا وقتی که یک کلاینت با پورت مشخص شده به آن وصل شود یا زمان انتظار سوکت به پایان برسد. دقت داشته باشید که اختصاص زمان انتظار با استفاده از متد setSoTimeout انجام می شود و اگر زمان انتظاری برای آن در نظر نگرفته باشیم انتظار به صورت بی نهایت خواهد بود.
* متد setSoTimeout این متد برای مشخص کردن زمان انتظار به کار می رود که یک ورودی int دارد که زمان انتظار را به میلی ثانیه مشخص می کند.
* متد bind: این متد برای زمانی که از constructor بدون پارامتر برای ساخت ServerSocket استفاده کرده باشید مناسب است که با استفاده از آن بتوانید شماره پورت و شماره IP و همچنین backlog را مشخص کنید.
تا به این بخش به معرفی کلاس ServerSocket و متدهای آن و همچنین مفاهیم اصلی socket programming پرداختیم. حال در مطلب بعدی به برنامه نویسی جاوایی سوکت و قسمت کلاینت و نحوه ارتباط خواهیم پرداخت *Itpro باشید*

نویسنده: مهدی عادلی فر 
منبع: |جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو::https://programming.tosinso.com|
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

 معرفی کاربرد برنامه نویسی سوکت در جاوا

سوکت ها یک مکانیزم ارتباطی بین دو کامپیوتر را با استفاده از پروتکل TCP فراهم می آورند. برنامه کلاینت یک سوکت تعریف می کند و تلاش می کند به برنامه سرور وصل شود. وقتی که ارتباط برقرار شد برنامه سرور یک شئ سرور ایجاد می کند و با استفاده از این سوکت ها این دو برنامه به تبادل داده مشغول می شوند.

ارسال داده ها با نوشتن داده در روی سوکت ها انجام می شود. کلاس java.net.Socket برای ساخت سوکت مورد استفاده قرار می گیرد و کلاس java.net.ServerSocket مکانیزمی را فراهم می آورد تا برنامه سرور بتواند به خط گوش دهد و با کلاینت ها ارتباط برقرار کند.

مراحل ایجاد یک ارتباط TCP بین دو کامپیوتر توسط سوکت به شرح زیر است. دقت داشته باشید که منظور از سرور در اینجا سرور فیزیکی نیست که در شبکه مورد بحث واقع می شود بلکه منظور ما از سرور همان برنامه ای است که برنامه های دیگر به آن پیام می فرستند. منظور از پورت هم پورت نرم افزاری بوده که یک شماره دارد و با پورت سخت افزاری اشتباه گرفته نشود.

  • سرور یک شئ ServerSocket می سازد و شماره پورت ارتباط را مشخص می کند.
  • سرور متد accept را از شئ ServerSocket فراخوانی می کند. این متد منتظر می ماند تا یک کلاینت با استفاده از شماره پورت مشخص شده به سرور متصل شود.
  • بعد از این که سرور به حالت انتظار رفت، کلاینت مورد نظر یک شئ از کلاس Socket می سازد که آدرس سرور و شماره پورتی را که قرار است را برای آن مشخص می کند .
  • متد constructor کلاس Socket سعی می کند که به سرور مشخص شده با شماره پورت مشخص شده وصل شود. اگر ارتباط برقرار شد برنامه کلاینت یک شئ دارد که با استفاده از آن می تواند به سرور وصل شود و تبادل داده بکند.
  • در سمت سرور متد accept یک شئ Socket از سوکت جدید ایجاد شده برمی گرداند. با استفاده از این سوکت می توان با کلاینت مورد نظر ارتباط برقرار کرد.

بعد از این که ارتباط برقرار شد می توان با استفاده از استریم های I//O داده ها را انتقال داد. هر سوکتی هم InputStream و هم OutputStream را دارا می باشد. استریم OutputStream مربوط به کلاینت به استریم InputStream مربوط به سرور وصل می باشد و بالعکس استریم InputStream مربوط به کلاینت به استریم OutputStream مربوط به سرور متصل است. پروتکل TCP یک پروتکل دوراهه است. بنابراین داده ها همزمان می توانند ارسال و دریافت شوند. در ادامه به کلاس ها و متدهایی که برای ارتباط سوکت مناسب هستند می پردازیم.

 معرفی کاربرد متدهای کلاس ServerSocket

کلاس java.net.ServerSocket در برنامه سمت سرور استفاده می شود و از این کلاس برای گرفتن یک پورت و گوش دادن به درخواست های کلاینت ها به کار می رود. این کلاس 4 متد constructor دارد که این constructor ها به شرح زیر می باشند.

    1. سازنده با یک پارامتر ورودی عددی
public ServerSocket(int port) throws IOException

این سازنده یک شماره پورت می گیرد و یک سوکت می سازد و آن شماره پورت را به سوکت مورد نظر اختصاص می دهد. اگر پورت مورد نظر به برنامه دیگری اختصاص داده شده باشد exception رخ خواهد داد.

    1. سازنده با دو پارامتر ورودی عددی
public ServerSocket(int port, int backlog) throws IOException

این constructor شبیه به قبلی است و پارامتر backlog به این منظور است که مشخص می کند که چند عدد کلاینت در صف انتظار بتوانند منتظر بمانند به عبارت دیگر صف انتظار سرور چندتایی باشد.

    1. سازنده با دو پارامتر عددی و یک پارامتر از نوع InetAddress
public ServerSocket(int port, int backlog, InetAddress address) throws IOException

این constructor مانند قبلی است و پارامتر address برای این است که مشخص کنیم که سرور از کدام IP محلی استفاده کند. این برای زمانی است که در یک کامپیوتر چندین کارت شبکه موجود باشد و هرکدام IP های مختلفی داشته باشند. در این صورت باید یک IP را معرفی کنیم تا سرور به آن مقید شود باید از این constructor استفاده کنیم و به سرور بگوییم که فقط کلاینت های این آدرس را بپذیر.

  1. سازنده بدون پارامتر این سازنده هیچ پارامتری ندارد حتی شماره پورت. این سازنده یک سوکت سروری می سازد که به هیچ پورتی bind نشده است. وقتی که از این سازنده استفاده می کنید باید بعد از آن با استفاده از متد bind شماره پورت و بقیه قسمت ها را به شئ ServerSocket اختصاص دهید.

اگر سازنده ServerSocket هیچ exceptionی ندهد به این معنی است که سوکت با موفقیت ساخته شده است و به پورت مورد نظر اختصاص داده شده است و آماده است تا درسخواتس های کاربران را دریافت کند. متدهای رایج کلاس ServerSocket در ادامه آورده شده اند.

 معرفی کاربرد متد های معمول کلاس ServerSocket

  • متد getLocalPort: این متد پورتی را که سرور در حال گوش دادن به آن است را برمی گرداند.
  • متد accept این متد برای انتظار برای کلاینت های ورودی به کار می رود. این متد به صورت بلوکه شده باقی می ماند تا وقتی که یک کلاینت با پورت مشخص شده به آن وصل شود یا زمان انتظار سوکت به پایان برسد. دقت داشته باشید که اختصاص زمان انتظار با استفاده از متد setSoTimeout انجام می شود و اگر زمان انتظاری برای آن در نظر نگرفته باشیم انتظار به صورت بی نهایت خواهد بود.
  • متد setSoTimeout این متد برای مشخص کردن زمان انتظار به کار می رود که یک ورودی int دارد که زمان انتظار را به میلی ثانیه مشخص می کند.
  • متد bind: این متد برای زمانی که از constructor بدون پارامتر برای ساخت ServerSocket استفاده کرده باشید مناسب است که با استفاده از آن بتوانید شماره پورت و شماره IP و همچنین backlog را مشخص کنید.

تا به این بخش به معرفی کلاس ServerSocket و متدهای آن و همچنین مفاهیم اصلی socket programming پرداختیم. حال در مطلب بعدی به برنامه نویسی جاوایی سوکت و قسمت کلاینت و نحوه ارتباط خواهیم پرداخت

برنامه نویسی سوکت و شبکه قسمت 2

در مطلب قبلی در مورد مفاهیم برنامه نویسی سوکت توضیحاتی را گفتیم و کلاس ServerSocket را نیز معرفی کردیم در این مطلب قصد داریم کلاس Socket را معرفی کنیم و به ادامه بحث در مورد برنامه نویسی سوکت بپردازیم. در مطلب قبلی گفتیم که باید برای شئ ServerSocket یک پورت مشخص کنیم و بعد از آن متد accept را فراخوانی کنیم.

وقتی که شئ ServerSocket متد accept را فراخوانی می کند این متد تا وقتی که یک کلاینت به آن متصل نشود هیچ مقداری را برنمی گرداند و منتظر می ماند. مقدار بازگشتی متد accept یک شئ از کلاس Socket است و نحوه عمل آن به این شکل است که بعد از این که یک کلاینت وصل شد شئ ServerSocket یک سوکت جدید روی یک پورت نامشخص می سازد و یک ارجاع به این سوکت را برمی گرداند. در این حالت یک ارتباط TCP ساخته شده است و تبادل داده می تواند شروع شود.

 معرفی کاربرد کلاس Socket

کلاس java.net.Socket نمایانگر سوکتی است که هم کلاینت و هم سرور برای برقراری ارتباط از آن استفاده می کند و هردوی سرور و کلاینت از این کلاس استفاده می کنند. کلاینت یک شئ Socket می سازد و سعی می کند با آن به سرور وصل می شود و سرور نیز با یک شئ Socket با استفاده از متد accept به دست می آورد.

پس این کلاس یکی از اصلی ترین کلاس های ارتباط است. این کلاس دارای 5 cosntructor می باشد که در کلاینت می توان از آن استفاده کرد. دقت داشته باشید که در سمت کلاینت باید علاوه بر شماره پورت باید آدرس سرور را نیز مشخص کنیم. در ادامه انواع constructor های مربوط به این کلاس را آورده ایم:

public Socket(String host, int port) throws UnknownHostException, IOException
public Socket(InetAddress host, int port) throws IOException
public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException
public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException
public Socket()

در contructor اولی IP سرور و شماره پورتی را که سرور به آن گوش می دهد داده می شود تا بتوان به آن وصل شد. حال اگر در برقراری ارتباط مشکلی پیش بیاید این constructor یک exception صادر می کند ولی اگر بدون هیچ مشکلی این constructor اجرا شود و شئ Socket ساخته شود به این معنی است که ارتباط با موفقیت انجام شده و می توان ارسال و دریافت پیام ها را انجام داد.

Constructor دومی هم دقیقا همان کار constructor قبلی را انجام می دهد با این تفاوت که به جای این که آدرس IP را به صورت رشته ای بگیرد در قالب یک شئ InetAddress دریافت می کند. constructor سوم نیز مانند دو constructor قبلی می باشد با این تفاوت که در این constructor آدرس IP محلی و پورت همان کامپیوتر نیز گرفته می شود تا با استفاده از آن بتوان وصل شد.

این برای زمانی است که چند کارت شبکه در کامپیوتر موجود باشد و همه دارای IP های متفاوتی باشند. Constructor چهارمی نیز شبیه به قبلی است با این تفاوت که به جای این که شماره IP را به صورت رشته ای بگیرد به صورت یک شئ از کلاس InetAddress دریافت می کند. constructor چهارم هیچ پارامتر ورودی ندارد و باید بعد از این که شئ سوکت ساخته شد با استفاده از متد connect به سوکت مربوط به سرور وصل شد.

وقتی که یک constructor اجرا می شود مانند سایر کلاس ها نیست که یک شئ ساده بسازد. بلکه در زمان ساخت یک شئ سوکت سعی می کند که به سرور مورد نظر وصل شود. در ادامه به برخی از متدهای مهم کلاس سوکت می پردازیم. دقت داشته باشید که هم در سمت سرور هم در سمت کلاینت شئ سوکت ساخته می شود که متدهای زیر می توانند هم در سمت سرور و هم در سمت کلاینت استفاده شوند. این متدها عبارتند از:

 معرفی کاربرد متدهای موجود در کلاس Socket

متد connect

public void connect(SocketAddress host, int timeout) throws IOException

این متد برای زمانی است که از constructor بدون پارامتر استفاده کنیم. با استفاده از این پارامتر آدرس IP و پورت مورد نظر را در قالب یک شئ SocketAddress به آن می دهیم. همچنین یک زمان انتظار نیز برای شئ مشخص می کنیم. که تا زمان مشخص شده منتظر ایجاد اتصال باشد.

متد getInetAddress

public InetAddress getInetAddress()

این متد آدرس IP کامپیوتری را که شی به سوکت آن وصل است را برمی گرداند. مقدار برگشتی این متد یک شئ InetAddress می باشد.

متد getPort

public int getPort()

این متد پورت سوکتی که توسط آن به سرور وصل هستیم را برمی گرداند. مقدار بازگشتی این متد یک عدد است که شماره پورت را نشان می دهد.

  • متد getLocalPort این متد شماره پورت روی کامپیوتر خودمان را نشان میدهد که از چه پورتی وصل شده ایم.
  • متد getRemoteSocketAddress این متد آدرس سوکت سرور و یا راه دور را در قالب یک شئ SocketAddress نشان می دهد.
  • متد getInputStream این متد یک inputStream را برمی گرداند که پیام های فرستاده شده از برنامه راه دور را می توان توسط آن خواند. دقت داشته باشید که منظور ما از برنامه راه دور حتما برنامه ای نیست که بر روی یک کامپیوتر دیگر قرار دارد. منظور ما برنامه ای است که به برنامه ای که در حال اجرا است متصل می شود. این برنامه ممکن است که روی همین کامپیوتری باشد که برنامه خودمان را اجرا می کنیم و یا ممکن است که بر روی یک کامپیوتر دیگر در شبکه باشد.
  • متد getOutpuStream این متد یک OutputStream را برمی گرداند که می توان با استفاده از آن به ماشین راه دور که به آن متصل هستیم پیام هایی را ارسال کرد.
  • متد close این متد سوکت را می بندد و منابع را آزاد می کند و ارتباط را قطع می کند.

در ادامه مثالی آورده ایم که گفته هایی را که تاکنون را داشتیم را بهتر درک کنیم. در این مثال یک برنامه کلاینت می سازیم و یک برنامه سرور می سازیم. که برنامه کلاینت به برنامه سرور با استفاده از سوکت وصل می شود و پیامی می فرستد سپس منتظر می ماند تا پاسخ دهد. برنامه کلاینت به شکل زیر خواهد بود

// File Name GreetingClient.java

import java.net.*;
import java.io.*;

public class GreetingClient
{
   public static void main(String [] args)
   {
      String serverName = args[0];
      int port = Integer.parseInt(args[1]);
      try
      {
         System.out.println("Connecting to " + serverName +
		 " on port " + port);
         Socket client = new Socket(serverName, port);
         System.out.println("Just connected to " 
		 + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(outToServer);
         out.writeUTF("Hello from "
                      + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in =
                        new DataInputStream(inFromServer);
         System.out.println("Server says " + in.readUTF());
         client.close();
      }catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}

حال برنامه سرور به گونه ای است که به کلاینت گوش می دهد و پیام آن را چاپ می کند. به شکل زیر

// File Name GreetingServer.java

import java.net.*;
import java.io.*;

public class GreetingServer extends Thread
{
   private ServerSocket serverSocket;
   
   public GreetingServer(int port) throws IOException
   {
      serverSocket = new ServerSocket(port);
      serverSocket.setSoTimeout(10000);
   }

   public void run()
   {
      while(true)
      {
         try
         {
            System.out.println("Waiting for client on port " +
            serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            System.out.println("Just connected to "
                  + server.getRemoteSocketAddress());
            DataInputStream in =
                  new DataInputStream(server.getInputStream());
            System.out.println(in.readUTF());
            DataOutputStream out =
                 new DataOutputStream(server.getOutputStream());
            out.writeUTF("Thank you for connecting to "
              + server.getLocalSocketAddress() + "\nGoodbye!");
            server.close();
         }catch(SocketTimeoutException s)
         {
            System.out.println("Socket timed out!");
            break;
         }catch(IOException e)
         {
            e.printStackTrace();
            break;
         }
      }
   }
   public static void main(String [] args)
   {
      int port = Integer.parseInt(args[0]);
      try
      {
         Thread t = new GreetingServer(port);
         t.start();
      }catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}

دقت داشته باشید که در این برنامه ها از پارامترهای برنامه main استفاده شده است که اگر بخواهید این برنامه ها را توسط خط فرمان ویندوز اجرا کنید باید برای مثال دستورات زیر را بنویسید و حتما باید یک پنجره برای کلاینت و یک پنجره ی دیگر برای سرور داشته باشید. هنگام اجرای برنامه سرور خروجی به شکل زیر خواهد بود:

java GreetingServer 6066
Waiting for client on port 6066...


و اجرا و خروجی برنامه کلاینت به شکل زیر خواهد بود دقت داشته باشید که خط اول این برنامه ها دستور اجرای آنها است و جزئی از خروجی نیست:

java GreetingClient localhost 6066
Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
Server says Thank you for connecting to /127.0.0.1:6066
Goodbye!

استفاده از Lambda Expression

یکی از قابلیت های جدید که به زبان برنامه نویسی جاوا اضافه شده است lambda expression است و این قابلیت به عنوان یکی از بهترین قابلیت های جاوا شناخته می شود. Lambda expression برنامه نویسی تابعی را آسان تر می کند و باعث می شود که روند برنامه نویسی ساده تر و سریع تر انجام شود.

 معرفی کاربرد نحوه نوشتاری syntax

نحوه نوشتن lambda expression به شکل زیر است:

parameter -> expression body

برای نوشتن متد ها تا قبل از معرفی lambda expression می بایست همه متدها را بایستی به روش قبلی تعریف می کردیم که نام متد و نوع بازگشتی و تعداد پارامتر ها و نوع پارامتر ها باید مشخص می شد و نحوه نوشتن آن باید به شکل زیر می بود

returnType methodNmame(parameterType parameter1,parameterType2 parameter2,...){
    
}

با استفاده از lambda expression این عمل راحت تر شده است. برای این که یک متد را تعریف کنیم می توانیم نوع پارامتر ها را مشخص نکنیم. همچنین می توانیم نوع بازگشتی را مشخص نکنیم. همچنین اجباری در استفاده از کلمه return و براکت شروع و پایان نداریم. Lambda expression برای زمانی استفاده می شود که می خواهیم به یک متد ارجاع دهیم. ارجاع به متد ها را در مطلب بعدی خواهیم گفت. برای درک بهتر این مفهوم به مثال زیر دقت کنید.

public class LambdaExpressionClass {
    public static void main(String args[]){
        LambdaExpressionClass expression = new LambdaExpressionClass();

        //with type declaration
        MathOperation addition = (int a, int b) -> a + b;

        //with out type declaration
        MathOperation subtraction = (a, b) -> a - b;

        //with return statement along with curly braces
        MathOperation multiplication = (int a, int b) -> { return a * b; };

        //without return statement and without curly braces
        MathOperation division = (int a, int b) -> b==0?0:a / b;

        System.out.println("10 + 5 = " + expression.operate(10, 5, addition));
        System.out.println("10 - 5 = " + expression.operate(10, 5, subtraction));
        System.out.println("10 x 5 = " + expression.operate(10, 5, multiplication));
        System.out.println("10 / 5 = " + expression.operate(10, 5, division));

        //with parenthesis
        GreetingService greetService1 = message -> System.out.println("Hello " + message);

        //without parenthesis
        GreetingService greetService2 = (message) ->
                System.out.println("Hello " + message);

        greetService1.sayMessage("Mehdi");
        greetService2.sayMessage("Itpro");
    }

    interface MathOperation {
        int operation(int a, int b);
    }

    interface GreetingService {
        void sayMessage(String message);
    }

    private int operate(int a, int b, MathOperation mathOperation){
        return mathOperation.operation(a, b);
    }
}

اگر این برنامه را اجرا کنیم خروجی به شکل زیر خواهد بود:

10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Mehdi
Hello Itpro

تعریف های متدهای addition یک نوع استفاده از lambda expression می باشد. می بینید که در این متد از کلمه return استفاده نمی شود. در متد subtraction نوع داده های ورودی نیز مشخص نشده است. در تعریف متد multiplication هم نوع ورودی ها مشخص شده است و هم کلمه return و علامت براکت آورده شده است. همینطور می توان علامت پرانتز مربوط به پارامتر های ورودی را نیز استفاده نکرد برای مثال در تعریف greetService1 برای message از پرانتز استفاده نشده است. می بینید که استفاده از lambda expression برنامه نویسی راحت تر می شود.

آموزش جاوا (Java) قسمت 52 : Thread و Multi-Threading

زبان برنامه نویسی جاوا یک زبان multi thread(چند نخی) است. این به این معنی است که می توان با استفاده از این زبان می توان برنامه هایی نوشت که چندین thread را با هم اجرا نمایند. هر واحد که یک قسمت از کد را اجرا می کند را یک thread یا نخ نام دارد.

یک برنامه multi thread شامل چند بخش است که می توانند با هم و موازی اجرا شوند و هرکدام یک وظیفه جدا در یک زمان انجام دهند و این باعث می شود که برنامه در زمان کمتری اجرا شود و از منابع موجود استفاده بهتری بکنند. برای درک بهتر این مفهوم ابتدا مفهوم چندوظیفه ای بودن یا multitasking را تعریف می کنیم.

چندوظیفه ای بودن به این معنی است که چند برنامه یک CPU را به اشتراک بگذارند و هرکدام از آن به گونه ای استفاده کنند که بقیه پردازش ها و برنامه ها نیز به اندازه نیاز خود از آن استفاده نمایند. این عمل توسط سیستم عامل انجام می شود.

حال اگر بخواهیم این چندوظیفه ای را در سطح یک برنامه پیاده کنیم به آن چندنخی یا multi-threading می گویند. به این شکل که کل برنامه را به بخش های مختلفی تقسیم می کنیم و برای اجرای هر بخش یک thread می سازیم. این thread ها به طور موازی باهم اجرا خواهند شد. سیستم عامل علاوه بر این که زمان پردازش CPU را بین برنامه ها تقسم می کند همچنین زمان یک برنامه را بین thread های مختلف آن نیز تقسیم می نماید.

 معرفی کاربرد دوره حیات یک thread

یک thread مراحل مختلفی در طول حیات خود طی می کند برای مثال یک thread ساخته می شود و استارت می خورد و اجرا می شود و سپس از بین می رود. تصویر زیر کل مراحل حیات یک ترد را نشان می دهد.