tamasha

آموزش جاوا – اپراتورهای افزایشی و دستوری در جاوا (فیلم آموزشی)

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

یادگیری و آموزش جاوا امروزه برای برنامه نویس ها تبدیل به یک باید شده است. زبان جاوا (Java) یکی از زبان های پرطرفدار در میان برنامه نویس هاست و خیلی ها…

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

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

بهترین دوره آموزش جاوا (Java) | صفر تا صد + گواهینامه و پشتیبانی

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

عدد e یک عدد با اعشار طولانی است که می توانید مقدار آن را با استفاده از Math.E به دست آورید. اگر نام ورودی متد exp را x بگذاریم خروجی این متد e^x خواهد بود. ورودی و خروجی این متد از نوع double خواهد بود. برای مثال به کد زیر توجه کنید:

در این کد برای چاپ کردن مقادیر برای اولین بار از متد printf استفاده شده است. با استفاده از این متد می توان متن خروجی را فرمت بندی کرد. به این شکل که اگر دقت کنید در خط اولی که متد printf به کار برده شده است در داخل متن عبارت “%.4f” به کار برده شده است

و در انتها یک عبارت عددی به عنوان ورودی به متد داده شده است که در اینجا عبارت عددی Math.E می باشد. معنی این خط این است که یک عبارت اعشاری با 4 رقم اعشار به جای “%4f” قرار می گیرد که آن عدد به عنوان ورودی داده شده است. در خط دوم printf نیز دو عدد با 3 رقم اعشار در داخل متن قرار گرفته است. خروجی کد بالا به شرح زیر خواهد بود:

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

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

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

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

این متد جذر عدد داده شده را برمی گرداند به عبارت دیگر این متد همان متد pow است با این تفاوت که آرگومان ورودی آن 0.5 می باشد. اعداد ورودی و خروجی این متد double می باشد. کد زیر یک مثال از این متد می باشد.

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

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

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

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

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

همان گونه که در کد بالا مشاهده می کنید از متدهایی به نام های toRadians و toDegrees در این برنامه استفاده شده است. این دو متد برای تبدیل زاویه از واحد درجه به رادیان و از رادیان به درجه به کار می روند. به شکلی که متد toDegrees زاویه رادیان را گرفته و به درجه تبدیل می کند و متد toRadins عکس این عمل را انجام می دهد. دقت داشته باشید که ورودی و خروجی این دو متد از نوع double می باشد.

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

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

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

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

در استفاده از نوع داده کاراکتر مانند انواع داده عددی که ما دارای کلاس های wrapper بودیم برای نوع داده char هم کلاس wrapper داریم. نام کلاس wrapper نوع کاراکتر Character می باشد. کلاس Character چندین متد مفید برای کار با کاراکتر ها ارائه می دهد. شما می توانید یک شئ از کلاس Character را به شکل زیر بسازید:

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

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

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

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

در ادامه به بیان متد هایی که در کلاس wrapper کاراکتر وجود دارد می پردازیم.

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

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

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

همان گونه که در داخل کد نشان داده شده است مقدار رشته باید در داخل علامت های دابل کوتیشن(“) قرار بگیرد. در کد بالا یک شئ از کلاس String ساخته شده است که مقدار آن Hello world! می باشد. البته ما در مطالب قبلی گفتیم که برای ساخت اشیا از کلمه کلیدی new استفاده می شود. حال برای ساخت رشته نیز می توان از این کلمه کلیدی استفاده کرد. برای مثال به کد زیر توجه کنید:

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

در کد بالا یک آرایه کاراکتری به یک شی رشته ای تبدیل شده است.

متدهایی در جاوا تعریف شده اند که بتوانند برخی اطلاعات در مورد یک شئ را به ما بدهند. به این متد ها متد های accessor گفته می شود. ایشاء کلاس String هم دارای متدهای accessor متعددی هستند. یکی از این متد ها متد length() می باشد که این متد طول رشته داده شده را بر می گرداند. منظور از طول رشته تعداد کاراکترهای به کار رفته در یک رشته است. مثالی از متد length در ادامه آورده شده است:

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

اگر بخواهیم دو رشته را به یکدیگر الحاق کنیم یا به عبارت ساده تر دو رشته را به یکدیگر بچسبانیم، از متد concat استفاده می کنیم و نحوه نوشتن این متد به شکل زیر است:

این متد یک شئ رشته ای جدید برمی گرداند که مقدار آن الحاق دو رشته String1 و string2 می باشد. همچنین شما می توانید از متد concat در مقدار یک رشته نیز استفاده کنید. مانند شکل زیر:

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

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

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

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

این دو متد یک رشته و تعدادی شئ دریافت می کنند که رشته وارد شده فرمت بندی شده است. خروجی این متد ها از نوع string می باشد یعنی خروجی این متدها یک شئ رشته ای است. تفاوت printf با format این است که printf رشته را فرمت بندی کرده و در همان حال آن را چاپ می کند بنابر این ما نمی توانیم که رشته تولید شده را در داخل یک متغیر ریخته و چند بار از آن استفاده کنیم. اما با استفاده از متد format این کار شدنی است. بنابر این می توان به جای استفاده از کد زیر :

دقت داشته باشید که متغیر های floatVar, intVar, stringVar از قبل تعریف و مقداردهی شده اند. حال به جای استفاده از کد بالا می توان از کد زیر استفاده کرد.

خروجی کد بالا اگر floatVar=5.2, intVar=45, stringVar=”MehdiAdeli” باشد برابر مقدار زیر خواهد بود:

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

خروجی این کد حرف a خواهد بود. به این دلیل که کاراکتر اندیس 8 کاراکتر a در ابتدای کلمه are می باشد.

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

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

اگر در حالت کلی از متد compareTo استفاده کنیم جاوا بین حروف بزرگ و کوچک تفاوت قایل خواهد شد. به این معنی که اگر از compareTo استفاده کنیم کلمات Hello و hello با هم فرق خواهند داشت. حال اگر بخواهیم که جاوا بین حروف بزرگ و کوچک فرقی نگذارد از متد compareToIgnoreCase استفاده می کنیم. این متد همانند متد compareTo بوده و خروجی های آن نیز شبیه به همان متد است. برای مثالی از این متد به کد زیر توجه نمایید:

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

وظیفه این متد هم مقایسه دو رشته با یکدیگر می باشد با این تفاوت که آرگومان ورودی این متد یک شئ از نوع StringBuffer می باشد. خروجی این متد یک مقدار Boolean می باشد به این شکل که اگر مقدار ورودی با رشته صدا زننده برابر باشد نتیجه true و در غیر این صورت نتیجه false خواهد بود. برای مثال به کد زیر توجه نمایید:

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

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

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

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

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

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

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

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

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

وظیفه این متد مقایسه است. به شکلی که رشته داده شده را با آرگومان ورودی مقایسه می کند. زبان برنامه نویسی جاوا برای هرشئ از هر نوعی می توان یک hashcode تولید کند. حال متد equals اگر مقدار hashcode دو شئ با هم برابر باشد آن دو را با هم برابر در نظر می گیرد و مقدار true را برمی گرداند

و در غیر این صورت مقدار false برمی گرداند. به عبارت دیگر اگر دو رشته با هم برابر باشند این متد مقدار true و اگر برابر نباشند این متد مقدار False برمی گرداند. آرگومان ورودی این متد می تواند هر شئی باشد. و مقدار بازگشتی آن یک مقدار Boolean است. برای مثال به کد زیر توجه کنید:

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

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

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

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

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

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

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

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

این متد یک کد به ازای برای رشته تولید می کند که به آن hashCode گفته می شود. این hashCode برای اشیا Stringی به شکل زیر محاسبه می شود:

در فرمول بالا s[i] کاراکترهای رشته می باشد، n طول رشته می باشد و ^ علامت توان می باشد. مقدار hashCode برای رشته خالی صفر است. این متد هیچ آرگومان ورودی ندارد. خروجی این متد یک عدد int می باشد. مثالی از این متد در کد زیر آورده شده است:

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

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

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

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

به دلیل اهمیت متدهای کلاس String در این مطلب به ادامه متدهای کلاس String پرداخته شد. در مطالب آینده نیز به توضیح ادامه متدها می پردازیم.

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

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

ولی زمانی که کاراکتر یا رشته مورد جستجو بیش از یک بار در متن آمده باشد متد indexOf اولین جایی را که کاراکتر یا رشته مورد نظر وجود دارد را برمی گرداند ولی متد lastIndexOf آخرین مکانی از متن را که کاراکتر یا رشته مورد نظر در آن قرار دارد را برمی گرداند. در هر دو متد اگر کاراکتر یا رشته مورد نظر پیدا نشود عدد -1 بازگردانده خواهد شد. مثالی از این متد در کد زیر آورده شده است. از هر 4 شکل این متد استفاده شده است.

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

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

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

این متد در آرگومان ورودی یک regular expression دریافت کرده و مشخص می کند که رشته مورد نظر با این regular expression همخوانی دارد یا خیر. کار این متد دقیقا شبیه به عمل

می باشد. خروجی این متد یک مقدار Boolean می باشد که اگر رشته با regular expression همخوانی داشته باشد مقدار true و اگر رشته همخوانی نداشته باشد مقدار false برگردانده می شود. مفاهیم regular expression در مطالب بعدی به صورت کامل شرح داده خواهد شد ولی برای آشنایی اولیه با این متد به مثال زیر توجه نمایید:

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

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

پارامترهای ورودی این متد به شرح زیر خواهد بود:

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

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

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

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

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

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

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

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

در ادامه مطالب در مورد کلاس String زبان برنامه نویسی جاوا به ادامه توضیحات متدهای موجود در این کلاس می پردازیم.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

همان گونه که دیده می شود در متن Str در ابتدا و انتهای آن فاصله خالی وجود دارد ولی خروجی متد trim به گونه ای است که این فواصل از ابتدا و انتها حذف شده اند. خروجی کد به شکل زیر است:

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

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

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

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

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

این کلاس ها StringBuffer و StringBuilder می باشند. این کلاس ها زمانی استفاده می شوند که لازم است که روی رشته های اعمال بسیار زیادی انجام شود. کلاس String به گونه ای است که وقتی از آن استفاده می کنید ممکن است اشیا بسیار زیادی ساخته شود که بسیاری از آن ها بی استفاده و غیر مفید است. ولی اشیائی که از این دو کلاس ساخته می شود این گونه نیست و به همین دلیل استفاده از آن می تواند performance را افزایش دهد. مثلا در کد زیر سه شئ String ساخته می شود. که دو عدد از آن ها بی استفاده هستند.

کلاس StringBuilder با جاوای 5 معرفی شد. تفاوت بین StringBuffer و StringBuilder در این است که متدهای موجود در کلاس StringBuilder ویژگی tread Safe بودن را ندارند به عبارت دیگر متدهای این کلاس باهم سنکرون نیستند. اما باید گفت که کلاس StringBuilder سرعت بیشتری دارد. پس تا حد امکان از این کلاس استفاده کنید. اما اگر سنکرون بودن و tread safe بودن برایتان اهمیت دارد از کلاس StringBuffer استفاده کنید. روش استفاده از این کلاس ها برای الحاق رشته ها با هم یا concat کردن رشته ها به شکل کد زیر است:

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

متدهای کلاس StringBuffer عبارتند از:

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

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

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

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

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

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

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

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

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

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

اگر برای اندیس مقدار -1 قرار داده شود مقدار در آخر رشته ثبت می شود

این متد قسمتی از متن موجود در شئ StringBuffer را با متن داده شده جایگزین می کند. این متد سه آرگومان ورودی دارد که ابتدا و انتهای رشته انتخابی و رشته جایگزین شونده را مشخص می کند. در کد زیر یک مثال از این متد آورده شده است.

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

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

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

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

آرایه یک نام دارد و هرکدام از داده ها را در یک خانه ذخیره می کند که این خانه با یک اندیس مشخص می شود. اندازه آرایه در جاوا ثابت است. برای مثال برای ذخیره 100 عدد باید 100 عدد متغیر تعریف کرد مانند num1, num2, …..,num100 در حالی که وقتی از آرایه استفاده می کنیم می توانیم یک آرایه 100 تایی معرفی کنیم و برای دسترسی به هرکدام از اندیس آن استفاده کنیم مثل num[0], num[1], num[2],….,num[99]. دقت داشته باشید که اولین خانه آرایه از0 شروع می شود و برای یک آرایه 100 تایی خانه آخر خانه 99 است یعنی یکی کمتر.

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

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

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

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

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

عناصر آرایه همانطور که گفته شد با استفاده از اندیس قابل دسترس هستند که اندیس از 0 شروع می شود.در کد زیر یک آرایه double به نام myList ساخته شده است که 10 خانه دارد.

شکل زیر ساختار آرایه myList را نشان می دهد که مقادیر double در داخل آن ریخته شده است.

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

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

در زمان jdk 1.5 حلقه foreach معرفی شد تا بتواند حلقه for را بهبود دهد. در این نوع از حلقه می توان کل آرایه را بدون این که اندیس ها را دانست پیمایش کرد. برای مثال به کد زیر توجه نمایید:

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

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

با استفاده از تابع بالا شما می توانید عناصر هر آرایه ای را که از نوع int ساخته شده است را به متد ارسال کرده و متد عناصر آن را چاپ می کند.

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

این کلاس در پکیج java.util قرار دارد که شامل متدهای برای مرتب سازی آرایه و یا جستجو و مقایسه آرایه ها و پر کردن خانه های آرایه می باشد. این متدها برای انواع داده های اصلی می تواند قابل اعمال باشد. در ادامه به چند عدد از مهمترین این متدها پرداخته ایم

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

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

متد fill این متد یک مقدار و یک آرایه می گیرد و همه ی خانه های آرایه را با آن مقدار پر می کند. این متد به شکل زیر نوشته می شود:

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

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

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

این کلاس در پکیج java.util می باشد. کلاس Date دارای دو constructor می باشد که در یکی آرگومان ورودی وجود ندارد و در دیگری یک آرگومان ورودی وجود دارد. اگر از constructor ی استفاده شود که آرگومان ورودی ندارد، در شئی که ساخته می شود تاریخ کنونی سیستم قرار داده می شود.

در شکل دوم constructor کلاس Date یک مقدار long دریافت می کند که این عدد تعداد میلی ثانیه هایی است که از روز 1 ژانويه سال 1970 می گذرد. اگر از این constructor استفاده کنیم زمانی که میلی ثانیه های مشخص شده گفته اند در داخل شئ مورد نظر ریخته می شود.

متد after این متد یک ورودی از کلاس Date میگیرد. وظیفه این متد این است که مشخص می کند که تاریخ شئ صدا زننده بعد از تاریخ ورودی است یا خیر. اگر تاریخ شئ صدا زننده بعد از تاریخ ورودی باشد مقدار true برمی گرداند و در غیر این صورت مقدار false برمی گرداند. شکل نوشتاری این متد به شکل زیر است

متد before این متد برعکس متن قبلی است و اگر تاریخ شئ صدا زننده قبل از تاریخ ورودی باشد مقدار true برمی گرداند. شکل نوشتاری این متد دقیقا شبیه به متد بالا است.

متد clone شئ تاریخ مورد نظر را به همراه داده های درونی اش کپی می کند و شکل نوشتاری آن مانند کد زیر است:

متد compareTo این متد یک شئ تاریخ به عنوان ورودی می گیرد و با تاریخ شئ صدا زننده متد مقایسه می کند. اگر دو تاریخ با هم برابر بودند مقدار 0 را برمی گرداند و اگر تاریخ شئ صدا زننده قبل از تاریخ ورودی باشد یک مقدار منفی و اگر تاریخ شئ صدا زننده متد بعد از تاریخ ورودی باشد یک مقدار مثبت برمی گرداند. شکل نوشتاری این متد به شکل زیر است:

به متد compareTo می توان یک شئ دیگر به عنوان ورودی داد که کامپایلر سعی می کند آن را به کلاس Date تبدیل کند که اگر تبدیل شد تاریخ ها را با هم مقایسه می کند و اگر عمل تبدیل موفقیت آمیز نباشد یک exception از نوع ClassCastException رخ می دهد.

متد equals این متد یک شئ به عنوان ورودی دریافت کرده و اگر دو مقدار از نظر تاریخ و زمان باهم مساوی بودند مقدار true برمی گرداند.

متد getTime این متد اختلاف زمانی تاریخ شئ داده شده را نسبت به 1 ژانویه 1970 محاسبه کرده و به تعداد میلی ثانیه برمی گرداند. شکل نوشتاری این متد در ادامه آورده شده است:

متد setTime این متد یک آرگومان ورودی می گیرد که یک عدد است که تعداد میلی ثانیه هایی را که از زمان اول ژانویه 1970 می گذرد است و تاریخ مطابق آن را در شئ ذخیره می کند. فرم این متد به شکل زیر است:

برای این که تاریخ یک شئ را به صورت متن دربیاوریم از متد toString استفاده می کنیم که این متد در مطالب قبلی توضیح داده شده است.

یک راه آسان برای پیدا کردن تاریخ و زمان جاری در جاوا وجود دارد و آن استفاده از یک شئ Date و استفاده از متد toString می باشد که شکل آن در کد زیر آورده شده است:

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

سه راه برای مقایسه دو مقدار تاریخ در جاوا وجود دارد که آن ها را شرح می دهیم.

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

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

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

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

مثالی از قالب بندی با استفاده از printf در کد زیر آمده است.

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

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

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

کتاب خانه های دیگری هم در مورد تاریخ در جاوا وجود دارند که از آوردن آنها صرف نظر کرده ایم.

کلاس SimpleDateFormat متدهایی مانند parse دارد که متن را به تاریخی با فرمت داده شده تبدیل می کند. برای مثال به کد زیر دقت کنید:

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

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

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

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

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

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

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

برای حل این مشکل از عبارات منظم یا regular expression ها استفاده می کنیم. جاوا کتابخانه های regular expression را در پکیج java.util.regex قرار داده است. نحوه استفاده از این کتابخانه مانند برنامه نویسی به زبان پرل است و به راحتی قابل یادگیری است. Regular expression یک ترتیب مخصوص از کاراکتر ها است که کمک می کند که رشته ها را با الگوی مورد نظر تطبیق دهید. از این تکنیک می توان در جستجو و ویرایش رشته ها استفاده کرد. پکیج java.util.regex سه کلاس اصلی دارد که عبارتند از:

این کلاس constructor خارجی ندارد. نحوه کار این کلاس این است که ابتدا شما باید یک regular expression به آن داده و کامپایل کنید. سپس می توانید از آن و متدهای آن استفاده کنید. برای کامپایل regular expression در این کلاس شما باید از متد compile استفاده کنید.

یک شئ Matcher یک موتور است که الگو ها را با رشته های ورودی تطبیق می دهد. این کلاس هم مانند کلاس Pattern هیچ constructor عمومی ندارد. شما برای این که شئ matcher خود را مقداردهی کنید باید متد matcher را از کلاس Pattern فراخوانی نمایید.

اشیاء این کلاس مشکلات سینتکسی و نوشتاری را داخل الگوی regular expression مشخص می کند.

اگر یک دنباله از کارکتر ها را در داخل پرانتز قرار دهیم به عنوان یک گروه شناخته می شود که با گروه ها به عنوان یک واحد رفتار خواهد شد. برای مثال گروه (dog) یک گروه است که از سه کاراکتر d, o, g ساخته شده است. پیدا کردن گروه ها با شمارش پرانتز های باز از سمت چپ به راست انجام می شود. شمارش گروه ها با تعداد پرانتز های باز شده از چپ به راست محاسبه می شود. برای مثال در عبارت زیر 4 گروه را می توان مشخص کرد.

گروه های به دست آمده از عبارت بالا به شرح زیر است:

برای این که بدانیم یک عبارت چند گروه دارد متد groupCount را از شئ matcher فراخوانی می کنیم. این متد یک عدد صحیح برمی گرداند که تعداد گروه های به موجود در عبارت می باشد. یک گروه گروهی است که کل عبارت را در نظر می گیرد که به آن گروه 0 گفته می شود. این گروه در شمارش گروه ها در متد groupCount نمی آید. در مثال زیر کدی آورده شده است که نحوه استفاده از کلاس های گفته شده را نشان می دهد.

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

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

در ادامه به معرفی متدهای موجود در کلاس Matcher می پردازیم.

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

در مثال بالا مشاهده می کنید که تعداد کلمات را شناخته و محل شروع و پایان آن ها را نشان می دهد. همانطور که درکد قابل مشاهده است با کلمه cat به شکل سه عدد کاراکتر c , a , t که از هم جدا باشند رفتار نمی شود و به شکل یک واحد یکتا با آن رفتار می شود.

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

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

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

در ادامه مثالی آورده شده است که کاربرد متدهای replaceFirst, replaceAll را نشان می دهد. این دو متد برای جایگزینی رشته با قسمتی که با الگو تطبیق داده شده است به کار می رود.

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

ممکن است هنگامی که از regular expression استفاده می کنیم خطاهای دستوری در الگوهای ما باشد که ما برای آن خطاها فکری نکرده باشیم. تشخیص این خطاها ممکن است کمی سخت باشد. کلاس PatternSyntaxException به ما کمک می کند تا بفهمیم در کدام قسمت از الگو خطا رخ داده است و چه خطایی در آن قسمت رخ داده است. متدهای این کلاس که به ما کمک می کنند عبارتند از:

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

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

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

در کد بالا کلمه های public , static دو modifier هستند که modifier ها را در معرفی Modifierها در جاوا توضیح دادیم. سپس نوع داده int آورده شده است. این نوع داده مشخص می کند که نوع داده بازگشتی متد از چه نوعی می باشد. methodName نام متد می باشد که این نام متد از قواعد نامگذاری متغیر ها که قبلا توضیح داده شد پیروی می کند.

a,b پارامترهای ورودی هستند که باید هنگام تعریف متد مشخص کنیم از چه نوعی هستند. دقت داشته باشید که این متد دارای دو عدد پارامتر ورودی از نوع int می باشد که متدها می توانند هیچ یا چند پارامتر ورودی داشته باشند و نوع آنها می تواند از انواع مختلف داده باشد.

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

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

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

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

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

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

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

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

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

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

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

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

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

دقت داشته باشید که اشیا در جاوا به صورت pass by reference ارسال می شوند ولی انواع اولیه به صورت pass by value ارسال خواهند شد.

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

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

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

همانگونه که دیده می شود دو عدد متد به نام minFuction وجود دارد.

در ادامه مطالب متدها در جاوا مباحثی را مطرح کردیم و در این مطلب قصد داریم به ادامه مطالب در مورد متدها در جاوا می پردازیم.

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

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

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

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

حال برای این که بتوانید این برنامه را تحت خط فرمان اجرا کنید آن را با استفاده از ابزار های گفته شده مانند IntelliJ idea کامپایل می کنیم تا فایل های .class ساخته شوند. سپس برای اجرای این برنامه کد زیر را در خط فرمان command prompt می نویسیم:

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

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

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

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

که در هنگام نوشتن برنامه و استفاده از کلاس مورد نظر به صورت زیر اشیاء را تعریف می کنیم.

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

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

در کد بالا کلمه کلیدی this برای مقدار دهی به فیلدهای موجود در شئ به کار گرفته می شود. همچنین می توان برای فراخوانی یک constructor از داخل یک constructor دیگر نیز این کلمه کلیدی را می توان استفاده کرد. مانند مثال زیر

همچنین در ادامه مثالی آورده شده است که از کلمه کلیدی this برای دستیابی به اعضای کلاس مورد استفاده قرار می گیرد.

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

از نسخه jdk 1.5 شما می توانید برای ورودی متدها پارامترهایی از یک نوع تعریف کنید به شکلی که هر تعداد ورودی از یک نوع می توانید به تابع بدهید. این نوع ورودی ها آرگومان های متغیر نام دارد که به شکل زیر تعریف می شود.

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

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

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

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

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

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

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

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

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

همان گونه که گفتیم استریم های بایتی برای خواندن و نوشتن داده های بایتی با تعداد 8 بیت مورد استفاده قرار می گرفتند ولی استریم های کاراکتری برای خواندن و نوشتن داده هایی که تعداد 16 بیت طول دارند انجام می شود. کلاس هایی که برای کار با این نوع داده ها بسیار مورد استفاده قرار می گیرد کلاس های FileReader, FileWriter هستند.

کلاس FileReader به شکل داخلی از کلاس FileInputStream استفاده می کند و کلاس FileWriter نیز به طور داخلی از کلاس FileOutputStream استفاده می کند ولی یک تفاوت عمده بین این دو دسته کلاس وجود دارد و آن هم این است که کلاس های استریم کاراکتری در واحد زمان با دو کاراکتر کار می کنند یعنی FileReader در واحد زمان دو بایت می خواند و FileWriter در واحد زمان 2 بایت در خروجی می نویسد. در قطعه کد زیر مثال بالا با استفاده از دو کلاس گفته باز نویسی شده است که فایل ورودی را در فایل خروجی کپی می کند.

حال اگر در مسیر گفته شده فایل input.txt موجود باشد محتویات آن در فایل output.txt ریخته می شود.

همه ی زبان های برنامه نویسی از IO استاندارد پشتیبانی می کنند. IO استاندارد به این معنی است که بتوان کلید ها و کاراکترهای وارد شده از کیبورد را خواند و کاراکترهایی را که لازم داریم در صفحه نمایش نشان دهیم. اگر شما با زبان c یا C++ کار کرده باشید باید با STDIN, STDOUT, STDERR آشنا باشید. در جاوا نیز برای کار با کیبورد و صفحه نمایش استریم های استاندارد زیر وجود دارد.

در ادامه یک برنامه ساده آورده شده است که با استفاده از InputStreamReader داده های استاندارد را از کیبورد می خواند و تا وقتی که کاربر حرف q را وارد نکرده ادامه می یابد. این برنامه نحوه استفاده از استریم های استاندارد را نمایش می دهد.

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

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

در این مطلب دو استریم مهم را بررسی می کنیم که آنها FileInputStream و FileOutputStream خواهد بود.

این استریم برای خواندن داده ها از فایل ها استفاده می شود. اشیای این استریم می توانند با استفاده از کلمه کلیدی new ساخته شودن و دارای constructor های متنوعی هستند برای مثال constructor زیر مسیر فایل را به صورت متنی دریافت می کند و یک شئ استریم می سازد. تا بتواند فایل را بخواند.

در constructor زیر ابتدا یک شئ فایل می سازیم و سپس برای فایل ساخته شده یک استریم می سازیم تا بتوانیم آن را بخوانیم. برای ساخت شئ فایل از کلاس File استفاده می کنیم و باید هنگام ساخت شئ فایل مسیر فایل را به آن بدهیم.

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

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

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

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

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

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

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

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

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

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

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

در مثال زیر نحوه ساخت دایرکتوری ها را آورده ایم. در این برنامه دایرکتوری های e:itproirprogrammingjava ساخته می شود.

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

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

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

با سلام به همه دوستان و همراهان Itpro. در قسمت های قبل در مورد پکیج java.io و فایل ها و استریم ها صحبت کردیم. در این مطلب قصد داریم که یکی از کلاس های مهم در مورد استریم ها را توضیح دهیم و نحوه کار کردن با آن را مشخص کنیم.

کلاس ByteArrayInputStream این اجازه را به کاربر می دهد که از بافر حافظه به عنوان استریم ورودی استفاده کند. به این معنی که استریم ورودی یک آرایه از نوع byte خواهد بود. این کلاس دارای constructor های زیر است.

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

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

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

متد reset که در کد بالا آورده شده است این وظیفه را دارد که اگر قبلا از متد mark استفاده کرده ایم محل خواندن استریم را به آن محل انتقال دهد و در غیر این صورت محل خواندن را 0 کند. در باره ی ByteArrayOutputStream در مطالب بعدی توضیح خواهیم داد

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

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

این Constructor یک شئ از کلاس file می گیرد که شئ جاری فرزند آن کلاس خواهد بود به عبارت دیگر شئ File جاری در داخل دایرکتوری شئ پدر می باشد. ورودی دوم این constructor یک رشته است که نام فایل فرزند کنونی را مشخص می کند.

این constructor مسیر فایل را به عنوان ورودی دریافت می کند و با تفسیر این مسیرشئ فایل مورد نظر را با آن می سازد.

این constructor دو رشته را به عنوان ورودی دریافت می کند که یکی آدرس پدر و دیگری آدرس خود فرزند است که قرار است از آن شیئی ساخته شود.

این constructor یک شئ از URI داده شده را می سازد. متدهایی که یک شئ File دارد به عبارت دیگر متدهایی که در کلاس File تعریف شده اند، عبارتند از:

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

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

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

حتما شما این مثال ها را در برنامه های خود دیده اید. برای مثال در زمان ویندوز xp حالاتی اتفاق می افتاد که برنامه ها خطای به اصطلاخ Don’t send پیدا می کردند و یا در سیستم عامل اندروید برنامه ای stopped working می شود. این ها حالاتی هستند که در برنامه استثنایا exception رخ می دهد.

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

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

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

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

در این صورت برنامه خطای زیر را به شما خواهد داد:

دقت داشته باشید که چون متدهای read, close در کلاس FileReader ممکن است exception از نوع IOException را تولید کنند کامپایلر از کاربر می خواهد که این exception را نیز مدیریت نماید.

یک exception چک نشده exceptionی است که در زمان اجرا اتفاق می افتد که شامل خطاهای برنامه نویسی مانند خطاهای منطقی یا استفاده نادرست از API ها می باشد. می توان این exception ها را در زمان کامپایل نادیده گرفت. برای مثال اگر شما یک آرایه را با سایز 5 معرفی کرده باشید و بخواهید از خانه 6ام آن استفاده کنید exception ی به نام ArrayIndexOutOfBoundsExceptionexception رخ خواهد داد. برای مثال به کد زیر دقت کنید

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

البته این نوع خطاها exception محسوب نمی شوند. اما مشکلاتی هستند که به خاطر عدم کنترل توسط کاربر و یا برنامه نویس رخ می دهد اتفاق می افتند. خطاها هنگام کامپایل توسط کامپایلر نادیده گرفته می شوند به خاطر این که به ندرت اتفاق می افتند. برای مثال اگر خطایی مانند سرریز شدن پشته (stack overflow) رخ دهد یک خطا اتفاق می افتد.

مانند بقیه قسمت های زبان برنامه نویسی جاوا که از کلاس ها تشکیل شده اند exception ها نیز هرکدام دارای کلاس خاص خود می باشند. که همه ی کلاس های Exception ها از کلاس java.lang.Exception ارث بری کرده اند. کلاس exception نیز خود زیر کلاسی از کلاس Throwable می باشد.

به غیر از کلاس Exception کلاس Error نیز از کلاس Throwable مشتق شده است. خطاها شرط های غیر طبیعی هستند که در زمان های خرابی اتفاق می افتند و فکری به حال آنها نشده است و آنها پیش بینی نشده اند. کلاس Exception دو زیرکلاس اصلی دارد. کلاس IOException و کلاس RuntimeException دو زیرکلاس کلاس Exception هستند که بقیه کلاس های Exception از آنها ارث بری کرده اند. در شکل زیر سلسله مراتب این کلاس ها آورده شده است.

همانطور که گفته شد یکی از مهمترین و معمول ترین Exception ها از نوع RuntimeException می باشد. Exception های زیر مجموعه ای از Exception های چک نشده زیرکلاس RuntimeException هستند.

Exception های زیر نیز exceptionهای چک شده معمول هستند.

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

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

گفتیم که همه ی Exception ها از کلاس Throwable مشتق شده اند و متدهای زیر متدهای کلاس Throwable می باشد که در همه ی exception ها وجود دارد.

برای این که بتوانیم در هنگام وقوع یک exception آن را تشخیص داده و عمل خاصی را انجام دهیم از کلمات کلیدی try, catch استفاده می کنیم. Try, catch اسم بلوک های کد است که برای مدیریت exception ها به کار می رود. کدهایی را که ممکن است exception تولید کنند را داخل بلوک try قرار می دهیم و عمل مربوط به هرکدام از exception ها را داخل بلوک های catch می نویسیم. نحوه نوشتن و استفاده از این بلوک ها در برنامه جاوا به شکل زیر خواهد بود:

به کدی که داخل بلوک try قرار می گیرد کد محافظت شده می گویند. دقت داشته باشید که بلوک های catch باید بلافاصله بعد از بلوک try قرار بگیرند. بعد از هر بلوک try هم باید بلوک های catch ویا بلوک finally بیاید. بلوک های catch برای درگیر شدن با exception ها به کار می روند.

اصولا هر بلوک catch برای مدیریت یک Exception به کار می رود. وقتی که در داخل کدهای بلوک try خطایی رخ دهد بلوک catch مربوط به آن بلوک اجرا خواهد شد. در کد زیر مثالی از مدیریت exception ها را با استفاده از بلوک های try, catch آورده ایم. در این مثال ما یک آرایه 2 خانه ای تعریف کرده ایم ولی در داخل برنامه قصد داریم که به خانه سوم آن دسترسی داشته باشیم که برنامه exception تولید می کند و ما آن exception را مدیریت می کنیم.

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

یک بلوک try می تواند چندین بلوک Catch را به دنبال داشته باشد. سینتکس نوشتاری چندین بلوک catch به شکل زیر خواهد بود:

در کد بالا 3 بلوک catch وجود دارد که هرکدام از آنها برای یک Exception خاص است. شما به هر تعداد که بخواهید می توانید بلوک catch بعد از یک بلوک try داشته باشید. زمانی که در کد داخل بلوک catch یک exception رخ دهد برنامه به دنبال اولین بلوک catch می رود.

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

از نسخه 7 جاوا به بعد این امکان به وجود آمده است که به عنوان ورودی یک بلوک Catch بتوان چند exception را فرستاد و هرکدام از exception ها را با استفاده از | جدا نمود. برای مثال به کد زیر دقت کنید:

اگر داخل متدی از کدهایی استفاده کردیم که امکان رخ دادن exception چک شده داشته باشد و آن را داخل try, catch قرار ندهیم باید از کلمه کلیدی throws استفاده کنیم. این کلمه کلیدی هنگام تعریف تابع و در خط اول قرار می گیرد. اما کاربرد کلمه کلیدی throw به طور کامل با throwsتفاوت دارد.

این کلمه کلیدی برای زمانی است که بخواهیم به طور دستی یک exception را بسازیم و با استفاده از throw می توان کاری کرد که یک exception رخ دهد. به عبارت دیگر کلمه کلیدی throws برای این است که نوشتن try, catch را به عقب بیندازیم ولی کلمه throw برای ساختن یک exception به طور دستی است. یک مثال از کلمه کلیدی throwsو throw برای RemoteException در کد زیر آورده ایم.

متدی که می سازیم ممکن است که چندین exception را تولید کند که می توان هنگام تعریف آن در جلوی کلمه کلیدی throws این exception ها را به ترتیب آورد. برای مثال به کد زیر دقت کنید که دو exception را در جلوی throws آورده است.

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

در ادامه مباحث در مورد Exception ها در این مطلب نیز به ادامه آموزش نحوه مدیریت exception ها در جاوا خواهیم پرداخت.

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

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

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

در مورد بلوک های try, catch , finally به نکات زیر توجه کنید:

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

حال نسخه دیگری از try وجود دارد که ما را از بستن کانکشن ها و استریم ها در قسمت finally راحت می کند. این نوع try به صورت اتوماتیک منابع را مدیریت می کند. این نوع try در زمان جاوا نسخه 7 به جاوا اضافه شده است. این نوع try پس از این که بلوک try, catch به اتمام رسید منابع را آزاد می کند.

نحوه استفاده از این امکان بسیار ساده است. برای این کار شما باید منابعی را که تعریف می کنید در یک پرانتز در جلوی try بیاورید. با این کار منبع معرفی شده در پایان بلوک های try, catch آزاد خواهد شد. نحوه نوشتن این نوع try به شکل زیر است:

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

در استفاده از این نوع try باید نکاتی را در نظر داشت که در ادامه این نکات آورده شده است.

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

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

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

نحوه استفاده از exception تعریف شده توسط کاربر را در مثال زیر نشان داده ایم. دقت داشته باشید که متد withdraw() یک excetption از نوع InsufficientFundsException تولید خواهد کرد.

برنامه زیر نحوه استفاده از متدهای deposite و withdraw را برای چک کردن حساب نشان می دهد.

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

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

در جاوا هر کلاس می تواند اعضای خود را داشته باشد. این اعضا می توانند متغیر ها و فیلد ها و متدها و کلاس های داخلی باشند. شما می توانید در یک کلاس یک کلاس دیگر تعریف کنید. کلاسی که در داخل کلاس دیگر تعریف می شود را nested class گویند و کلاسی که در برگیرنده کلاس داخلی است را outer class می گویند. نحوه نشوتن کلاس های داخلی به شکل زیر خواهد بود. در این تعریف کلاس داخلی Nested و نام کلاس خارجی را Outer نامگذاری کرده ایم.

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

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

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

در این مثال مشاهده می کنید که کلاس OuterDemo یک کلاس Outer است و کلاس InnerDemo یک کلاس داخلی است که در داخل کلاس OuterDemo قرار دارد. متد displayInner متدی است که از کلاس داخلی استفاده می کند و این متد از داخل متد main فراخوانی می شود. اگر کد بالا را اجرا کنید نتیجه اجرای کد بالا به شکل زیر خواهد بود:

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

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

و داخل آن یک کلاس داخلی تعریف می کنیم که این کلاس داخلی یک متد به نام getValue دارد. از داخل این متد می توان به اعضای کلاس outer دسترسی داشت. حال برای این که در خارج از کلاس به اعضای داخلی کلاس Outer دسترسی داشته باشیم یک شئ از کلاس داخلی می سازیم و متد getValue را فراخوانی می کنیم. برای درک بهتر و راحت تر این مفهوم به کد زیر دقت کنید.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

برای این که وراثت در کلاس ها در زبان جاوا را بهتر بیان کنیم مثالی در ادامه آورده ایم.در این مثال دو کلاس آورده ایم که یکی Calculation و دیگری MyCalculation نام دارد. با استفاده از کلمه extends کلاس MyCalcuation متدهای addition و subtraction را از کلاس Calculation به ارث می برد.

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

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

برای مثال در برنامه بالا اگر شیئی از کلاس Calculation ساخته شده باشد. این شئ نمی تواند به متد multiplication دسترسی داشته باشد. زیرا که این متد مربوط به کلاس فرزند یعنی MyCalculation می باشد. دقت داشته باشید که یک کلاس فرزند همه ی اعضا(فیلدها و متدها و کلاس های داخلی) را از کلاس والد به ارث می برد. Constructor ها جزء این اعضا محسوب نمی شوند و به ارث برده نمی شوند اما سازنده کلاس والد می تواند از داخل کلاس فرزند فراخوانی شود.

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

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

برای درک بهتر این کلمه کلیدی و استفاده از آن برای تفاوت قایل شدن بین اعضای کلاس والد و فرزند مثالی آورده ایم که در کد زیر مشاهده می کنید. در این برنامه یک کلاس به نام SubClass و یک کلاس دیگر به نام SuperClass داریم که هر دوی آن ها بک متد به نام display دارد. هر کدام از این متدها دارای پیاده سازی جداگانه ای هستند. در برنامه زیر می بینید که هرکدام از این متد ها را چگونه فراخوانی می کنیم و چگونه بین آنها تفاوت می گذاریم.

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

اگر یک کلاس از کلاس دیگری ارث برده باشد، کلاس فرزند به طو پیشفرض کلاس والد را با constructor پیشفرض که بدون پارامتر ورودی است به ارث می برد. اما اگر بخواهید یکی از constructor های کلاس والد که دارای پارامتر ورودی است را فراخوانی کنید باید از کلمه کلیدی super استفاده کنید.

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

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

اگر بخواهیم بگوییم این شئ یک نوع از شئ دیگری است یک راه آن استفاده از رابطه از Is-A است. برای مثال ببر یک حیوان است. مرغ یک پرنده است. این رابطه در برنامه نویسی کاربرد بسیار دارد. این روش را می توان با استفاده از ارث بری و کلمه کلیدی extends می توان ساخت. برای مثال به تعریف کلاس های زیر که تعریف حیوانات است توجه کنید:

با توجه به تعاریف بالا و طبق قوانین شئ گرایی جمله های زیر صادق است:

* Dog یک Mammal است.

با استفاده از کلمه کلیدی extends کلاس های فرزند همه ی خصوصیات کلاس های والد را به ارث می برند. به طور مثال در کد بالا کلاس Dog از کلاس Mammal ارث برده است ولی از آنجا که کلاس Mammal خود از کلاس Animal به ارث برده است پس کلاس Dog خصوصیات کلاس Animal را نیز به ارث خواهد برد. دقت داشته باشید که کلاس فرزند نمی تواند اعضای private کلاس والد را به ارث ببرد. برای مثال به کد زیر دقت کنید.

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

پس از این که با مفهوم extends آشنا شدیم به بیان مفهوم implements می پردازیم. این کلمه کلید زمانی به کار برده می شود که بخواهیم خصوصیات موجود در یک اینترفیس را به ارث ببریم. برای اینترفیس ها نمی توان از کلمه کلیدی extends استفاده کرد. خود اینترفیس نیز نمی تواند از کلاسی ارث ببرد. برای مثال به کد زیر دقت کنید:

دقت داشته باشید که برای این که مشخص کنیم که یک کلاس از کلاس دیگر به ارث برده است یا خیر از کلمه کلیدی instaceof استفاده می کنیم.

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

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

ارث بری انواع مختلفی دارد که در تصویر زیر مشاهده می کنید

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

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

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

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

در مثال بالا می بینید که شئ b خود یک از نوع کلاس Animal است ولی با شیئی از کلاس Dog مقداردهی شده است. پس هنگامی که این متد move از این کلاس را فراخوانی می کنیم متد move مربوط به کلاس Dog اجرا می شود. دلیل این عمل این است که عمل چک کردن نوع شئ هنگام کامپایل بررسی می شود و چون نوع شئ را با کلاس Dog مقدار دهی کردیم متد مربوط به این کلاس اجرا می شود. بنابراین در کلاس بالا چنین اتفاقی می افتد. حال به مثال زیر توجه کنید:

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

اجرای این برنامه ممکن نبوده و خطا می دهد. زیرا که شئ b یک شئ از کلاس Animal بوده و کلاس Animal متدی به نام bark ندارد و این متد مربوط به کلاس Dog است. پس اگر متدی در کلاس والد موجود باشد و ما آن را در کلاس فرزند override نماییم، حال اگر شئی از نوع کلاس والد تعریف کنیم ولی با یک شئ کلاس فرزند مقدار دهی نماییم در این صورت متدهایی که فراخوانی می کنیم متدهای کلاس فرزند خواهد بود. اما اگر متدی فقط مربوط به کلاس فرزند باشد با استفاده از این روش نمی توان آن متد را فراخوانی نمود.

قواعد و قوانین زیر هنگام override کردن متدها صادق است.

به عنوان یاد آوری می گوییم که برای این که در داخل متد override شده بتوانیم متد کلاس والد را فراخوانی کنید از کلمه کلیدی super استفاده می کنیم برای مثال به برنامه زیر توجه کنید:

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

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

هر شئ جاوا که از کلاسی ساخته شده باشد به گونه ای که آن کلاس حد اقل دو کلاس فرزند داشته باشد که با کلاس پدر رابطه IS-A داشته باشد قابلیت چندریختی را می تواند داشته باشد. در زبان جاوا همه ی اشیاء قابلیت چندریختی و یا polymorphism را دارد.

دلیل این ادعا این است که همه ی کلاس های تعریف شده در جاوا از کلاس Object ارث بری کرده اند و با آن کلاس خاصیت Is-A دارند. به یاد داشته باشید که تنها راه دسترسی به یک شئ این است که یک متغیر از کلاس آن بسازیم.متغیری که ساخته می شود دارای یک نوع خاص است.

به یاد داشته باشید که اگر یک متغیر را در جاوا تعریف کرده باشیم دیگر نمی توانیم نوع آن متغیر را تغییر بدهیم. اگر یک متغیر به صورت final تعریف نشده باشد می توان شیئی را که در آن ریخته شده است را تغییر داد و یک شئ دیگر را در درون آن ریخت.

نوع متغیری که متغیر از آن ساخته شده است مشخص می کند که چه متدهایی را می توانیم فراخوانی کنیم. می توان هر شیئی را که از نوع متغیر است را در داخل یک متغیر ریخت همچنین می توان هر شیئی که از یک کلاس که کلاس فرزند نوع تعریف شده متغیر است را نیز داخل متغیر ریخت (یا خدا خودمم به سختی فهمیدم این جمله رو :D) یک متغیر را می توان از نوع کلاس یا اینترفیس معرفی کرد. برای مثال به کد زیر توجه نمایید.

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

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

همه ی اعمال بالا در جاوا مجاز بوده و به شئ d در برنامه اشاره می کنند. این عمل چندریختی و یا polymorphism نام دارد.

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

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

حال در کد زیر از کلاس Employee به شکل زیر ارث بری می کنیم.

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

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

در این کد ما دو متغیر از کلاس Salary معرفی کرده ایم. یکی برای این که شئ Salary در داخل آن قرار بگیرد که نام آن s می باشد و دیگری یک شئ از کلاس Employee در درون آن قرار می گیرد و نام آن e می باشد. هنگامی که متد

را فراخوانی می کنیم. کامپایلر متد mailCheck در درون کلاس Salary را اجرا می کند ولی زمانی که متد mailCheck را از شئ e را فراخوانی می کنیم با این که باید متد مربوط به Employee را اجرا کند ولی نتیجه متفاوت می گیریم و دلیل آن این است که متد mailCheck مربوط به کلاس Salary اجرا خواهد شد. در جاوا همه ی متدها این قابلیت را دارند که override شوند و به این رفتار فراخوانی متدهای virtual گفته می شود

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

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

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

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

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

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

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

شما فقط همین را بدانی که چگونه باید ایمیل را ارسال کنید کافی است. به این مفهوم انتزاع یا abstraction می گویند. Abstraction به این معنی است که شما با ایده ها کار کنید نه رخدادها. در برنامه نویسی شئ گرا ما بسیار از abstraction استفاده می کنیم.

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

کلاسی که با کلمه کلیدی abstract تعریف می شود کلاس abstract نامیده می شود. کلاس های abstract دارای خصوصیاتی هستند که این خصوصیات عبارتند از:

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

در کد بالا مشاهده می کنید که به غیر از متدهای abstract کلاس Employee مانند بقیه کلاس ها در جاوا می باشد. این کلاس یک کلاس abstract است ولی همین کلاس 3 فیلد و 7 متد و یک constructor دارد. حال اگر از این کلاس بخواهید با کلمه کلیدی new یک شئ بسازید و به شکل زیر از آن استفاده کنید :

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

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

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

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

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

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

در کد زیر یک مثال از متد abstract آورده شده است.

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

یکی از مهمترین مفهوم از چهار مفهوم اصلی برنامه نویسی شئ گرا encapsulation یا کپسول بندی می باشد و سه مفهوم دیگر وراثت و چندریختی و abstraction می باشد. کپسول بندی در جاوا مکانیزمی است که داده ها (متغیرها) و پردازش های داده ها (متدها) را در یک بخش قرار می دهد.

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

متدهای set, get که به صورت public تعریف شده اند نقاط دسترسی به متغیرهای عضو کلاسEncapTest می باشد. معمولا به این متدها متدهای getter, setter می گویند. بنابراین اگر کلاسی بخواهد به متغیرهای عضو کلاس دسترسی داشته باشد باید از طریق متدهای getter و setter اقدام کنیم. به شکل زیر می توان به متغیرهای کلاس EncapTest دسترسی داشت:

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

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

در برنامه های کوچک شاید برای شما مهم نباشد که داده های خود را کپسول بندی نمایید. ولی در برنامه هایی که بزرگ هستند و توسط چندین نفر نوشته شده اند این گونه مسائل بسیار مهم می شوند زیرا که هم قابلیت خوانایی برنامه را بالا می برند و هم این که امنیت برنامه افزایش پیدا می کند که از رخ دادن خطاهای غیر منتظره و دسترسی های غیر مجاز جلوگیری خواهد شد.

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

همانند کلاس های abstract در داخل اینترفیس می توان ثابت و متد پیش فرض و متد استاتیک و .. داشت. متدهای استاتیک را می توان در داخل اینترفیس تعریف کرد. نوشتن یک اینترفیس شبیه نوشتن یک کلاس است. اما یک کلاس ویژگی ها و رفتارهای اشیاء را شرح می دهد ولی یک اینترفیس شامل رفتارهایی است

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

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

در کد زیر تعریف اینترفیس آورده شده است:

اینترفیس ها مشخصات زیر را دارند.

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

و در غیر این صورت برنامه خطا خواهد داشت. یک کلاس برای این که یک اینترفیس را پیاده سازی نماید از کلمه کلیدی implements استفاده خواهد کرد. این کلمه کلیدی در زمان تعریف کلاس آورده می شود و مانند کد زیر خواهد بود:

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

قوانینی برای پیاده سازی متدهای موجود در اینترفیس وجود دارد که این قوانین عبارتند از:

هنگام پیاده سازی اینترفیس ها به قوانین زیر توجه کنید:

یک اینترفیس می تواند از اینترفیس دیگر ارث بری داشته باشد. با استفاده از کلمه کلیدی extends یک اینترفیس می تواند از اینترفیس دیگر ارث ببرد. در مثال زیر اینترفیس های football و hokey از اینترفیس sports ارث بری داشته اند.

اینترفیس Hokey دارای 4 متد است اما این اینترفیس 2 متد را نیز از اینترفیس Sports به ارث برده است. بنابراین کلاسی که اینترفیس Hokey را پیاده سازی می کند باید 6 متد را پیاده سازی نماید. همانطور برای اینترفیس Football نیز هر کلاسی که بخواهد این اینترفیس را پیاده سازی کند باید 5 متد را پیاده سازی نماید.

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

به اینترفیس هایی که هیچ متدی ندارند اینترفیس تگ می گویند. برای مثال اینترفیس MouseListener یک اینترفیس تگ است که در کتابخانه java.awt قرار دارد و از java.util.EventListener ارث بری کرده است که به صورت زیر تعریف شده است:

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

یکی دیگر از مفاهیم برنامه نویسی شئ گرا در جاوا مفهوم پکیج یا بسته بندی package می باشد. فرض کنید که یک کلاس به نام Data دارید که در تمام برنامه های خود برای کار با داده ها از آن استفاده می کنید. پس شما دیگر نمی توانید هیچوقت کلاسی به نام Data را تعریف کنید.

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

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

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

پس کلاس ها و اینترفیس ها و enum های خود را با توجه به عمل و هدفشان طبقه بندی نمایید. به خاطر این که پکیج ها یک فضای نام (namespace) مخصوص به خود را تعریف می کنند پس احتمال هم نام شدن کلاس ها کاهش پیدا می کند و شما باید دقت کنید که در داخل پکیج کلاس یا اینترفیس همنام نداشته باشید نه در کل پروژه. همچنین استفاده از پکیج ها برنامه نویسی را آسان تر می کند زیرا که دسترسی به کلاس ها آسانتر خواهد بود.

هر پکیج یک نام دارد. پس هنگامی که می خواهید یک پکیج بسازید باید یک نام برای آن تعیین کنید. برای این که یک پکیج بسازید در برنامه intellij idea باید در قسمت project بر روی پوشه src کلیک راست کنید و گزینه New را انتخاب کنید و از زیرمنو package را انتخاب کنید. سپس اسم پکیج از شما پرسیده خواهد شد که نامی را به آن اختصاص می دهید.با این کار یک پکیج با نامی که شما انتخاب کرده اید برای شما ساخته می شود. که شکل آن را در تصویر زیر می بینید.

دقت داشته باشید که ما نام پکیج خود را ItProPackage قرار داده ایم. همه کلاس ها و اینترفیس هایی را که می خواهیم در این پکیج باشد را باید در داخل این پکیج بسازیم. به شکلی که بر روی این پکیج کلیک کرده و new , class را انتخاب کنیم و یا کلاس هایی را که قبلا ساخته ایم را به داخل این پکیج drag کنیم. دقت داشته باشید که خط اول کلیه کلاس ها و اینترفیس هایی که در یک پکیج قرار دارند باید به شکل کد زیر باشد که این کد نام پکیج را مشخص می کند.

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

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

اگر یک کلاس بخواهد از کلاسی در همان پکیج استفاده کند لازم نیست کاری انجام دهید. ولی برای این که کلاسی از یک کلاس در پکیج دیگر استفاده کند باید با استفاده از کلمه کلیدی import پکیج مورد نظر را به فایل اضافه کرد. برای مثال اگر ما در داخل پکیج ItProPackage یک کلاس به نام ItproClass داشته باشیم که کد آن به شکل زیر باشد:

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

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

دقت داشته باشید که با عبارت import که در کد بالا نوشته ایم همه ی کلاس های پکیج به داخل کلاس لود می شود ولی اگر فقط بخواهیم که از کلاس ItproClass استفاده کنیم و با بقیه کلاس های پکیج کاری نداشته باشیم باید این خط را به شکل زیر تغییر دهیم:

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

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

قسمت اولی که مورد بررسی خواهیم داد مکانیزم هایی است که برای دسته بندی و سازماندهی داده ها استفاده می شود. به این مکانیزم های Data structure گفته می شود که ترجمه فارسی آن داده ساختار است (بعضیا بهش میگن ساختمان داده ها که توی دانشگاه چند واحدشون رو براش میذارن :D) داده ساختارهایی که جاوا در درون خود دارد در پکیج utility قرار دارند و بسیار قدرتمند و پرکاربرد هستند. این داده ساختار ها عبارتند از:

همه این کلاس ها در جاوا وجود دارند و همه ی آنها برای نگهداری داده ها به شکل های گوناگون می باشند که به توضیح آنها خواهیم پرداخت. البته این ها داده ساختار های پیچیده زبان جاوا هستند. داده ساختار های ساده در جاوا عبارتند از متغیر ها و آرایه ها و ArrayList ها که قبلا به توضیح آنها در Itpro پرداخته ایم.

اینترفیس Enumeration به خودی خود یک داده ساختار نیست. اما در مجموعه داده ساختار ها بسیار مهم است. این اینترفیس یک ابزاری را برای استخراج داده های ترتیبی از یک داده ساختار را فراهم می کند. برای مثال اینترفیس Enumeration متد nextElement را تعریف می کند که این متد برای به دست آوردن عنصر بعدی از یک داده ساختار که چندین عنصر داردد به کار می رود.

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

در برنامه زیر نحوه پیاده سازی و استفاده ازاین اینترفیس را نشان داده ایم.

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

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

در این مطلب نیز قصد دارم یکی دیگر از داده ساختارهای موجود در زبان قدرتمند جاوا را شرح دهم. داده ساختاری که قصد دارم توضیح دهم BitSet نام دارد.

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

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

برای درک بهتر متدهای گفته شده به برنامه زیر دقت کنید.

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

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

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

وکتور شامل بسیاری از متدهای قدیمی می باشد که در حال حاضر در مجموعه ها وجود ندارد. وقتی که شما اندازه آرایه را نمی دانید و می خواهید در زمان اجرا بتوانید به راحتی اندازه آرایه را کم یا زیاد کنید این داده ساختار می تواند بسیار مناسب باشد. کلاس Vector دارای چندین contructor است که عبارتند از

کلاس vector دارای متدهای زیر می باشد.:

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

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

یکی از داده ساختار هایی که در نرم افزار ها و همه سیستم عامل ها مورد استفاده قرار می دهند داده ساختار پشته است. پشته مکانیزم last in first out یا (LIFO) را پیاده سازی می کند. به این شکل که پشته فقط یک راه ورود و خروج برای داده ها دارد.

پس آخرین داده ای که وارد پشته می شود هنگام خروج اولین داده ای است که خارج می شود. به عبارت دیگر وقتی که داده ای را به پشته اضافه می کنیم به سرپشته اضافه می شود. پشته یک زیرکلاس از وکتور است ولی نوع ذخیره سازی داده ها فرق می کند. نام کلاس پشته Stack است. که فقط دارای یک constructor است که دارای هیچ پارامتری نیست. علاوه بر متدهایی که کلاس Stack از کلاس Vector به ارث برده است کلاس Stack متدهای زیر را تعریف می کند.

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

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

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

از طرفی مقادیر کلیدها باید همیشه یکتا باشد. این برای زمانی که شما قصد دارید با استفاده از کلید به داده های خودتان دسترسی داشته باشید بسیار مناسب است. به علت این که کلاس dictionary یک کلاس abstract است نمی توان از آن یک شئ ساخت که بتوان از استفاده نمود و باید از آن ارث بری کرد.

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

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

کلاس های متعددی مانند HashSet در جاوا هستند که از کلاس dictionary ارث بری کرده اند ولی ما برای این که با کل متدها و مفاهیم این کلاس آشنا شوید یک ارث بری جداگانه از این کلاس داشته و پیاده سازی کرده ایم که در ادامه آن را آورده ایم:

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

داده ساختاری که در این مطلب قصد معرفی آن را داریم 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 باشد. متدهایی که این کلاس دارد را نیز در ادامه آورده ایم:

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

یکی از داده ساختار های مهم دیگری که در زبان جاوا وجود دارند properties است. داده ساختار خود یک زیر کلاس از کلاس Hashtable است که برای نگهداری یک لیست از کلیدهای رشته ای و مقادیر رشته ای به کار می رود. این داده ساختار در بسیاری از کلاس های جاوا به کار رفته است. برای مثال اگر بخواهید اطلاعات محیطی را که برنامه در آن در حال اجرا است باید از کلاس System.getProperties استفاده کنید. که از properties استفاده می کند. مشخصاتی که اعضای کلاس properties دارد به شرح زیر است:

سازنده های این کلاس به دو شکل بدون پارامتر ورودی و با یک پارامتر وجود دارد که پارامتر مورد نظر یک شئ از نوع properties است و مقادیر پیش فرض را در خود دارد. متدهای این کلاس به شکل زیر است

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

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

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

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

با استفاده از متدها و کلاس های جنریک (generic) در جاوا می توان این کار را انجام داد. با استفاده از امکان جنریک شما می توانید یک متد معرفی کنید و این متد برای چندین نوع داده کار خواهد کرد. یا می توانید یک کلاس جنریک تعریف کنید که داخل کلاس یک مجموعه متدها وجود داشته باشد که با انواع داده های مختلف کار کند. همچنین انواع داده جنریک را می توان در زمان کامپایل بررسی کرد تا اگر نوع داده ای نامعتبر است بتوان آن را کنترل کرد.

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

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

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

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

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

برای مثال ممکن است که یک متد فقط روی اعداد کار کند. بنابراین نوع داده ای که باید به متد داده شود یا باید از کلاس Number باشد و یا یکی از زیرکلاس های آن باشد. برای انجام این کار باید ابتدا نام خود پارامتر نوع را بیاوریم و بعد از آن کلمه کلیدی Extends و بعد از آن نام کلاس پدر را بیاوریم. برای محدود کردن پارامترهای نوع می توان از کلمات کلیدی extends , implements استفاده کرد. برای مثال به کد زیر دقت کنید. این مثال بین 3 شئ بزرگترین آنها را برمی گرداند.

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

تعریف یک کلاس جنریک بسیار شبیه به تعریف یک کلاس معمولی است. تنها تفاوت آن این است که بعد از نام کلاس پارامترهای نوع بین <> خواهد آمد. اگر بیش از یک پارامتر نوع داشته باشیم باید آنها را با استفاده کاما (,) جدا کنیم. برای مثال به کد زیر توجه کنید که چگونه یک کلاس جنریک تعریف کرده ایم:

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

در زبان جاوا از مفهوم جنریک بسیار استفاده شده است. برای مثال برای داده ساختار هایی مانند لیست هاو set ها از این مفهوم استفاده شده است. نکته ای که باید به آن دقت داشته باشید این است که برای این که از کلاس یا متد جنریک استفاده کنیم نمی توانیم انواع داده های اصلی مانند int و یا double را به آن بدهیم و باید کلاس wrapper آنها یعنی Integer و Double را به کلاس جنریک اختصاص می دهیم. همانطور که در مثال های بالا دیدیم

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

جاوا برای کار با شبکه پکیج java.net را ارائه کرده است که شامل API های j2se یا همان نسخه استاندارد جاوا است. این پکیج شامل کلاس ها و اینترفیس هایی است که به منظور ارتباط سطح پایین بین کامپیوتر ها مورد استفاده قرار می گیرند و به شما اجازه نوشتن برنامه های شبکه ای قوی را می دهد. پکیج java.net دو پروتکل رایج زیر را پشتیبانی می کند.

سوکت ها یک مکانیزم ارتباطی بین دو کامپیوتر را با استفاده از پروتکل TCP فراهم می آورند. برنامه کلاینت یک سوکت تعریف می کند و تلاش می کند به برنامه سرور وصل شود. وقتی که ارتباط برقرار شد برنامه سرور یک شئ سرور ایجاد می کند و با استفاده از این سوکت ها این دو برنامه به تبادل داده مشغول می شوند.

ارسال داده ها با نوشتن داده در روی سوکت ها انجام می شود. کلاس java.net.Socket برای ساخت سوکت مورد استفاده قرار می گیرد و کلاس java.net.ServerSocket مکانیزمی را فراهم می آورد تا برنامه سرور بتواند به خط گوش دهد و با کلاینت ها ارتباط برقرار کند.

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

بعد از این که ارتباط برقرار شد می توان با استفاده از استریم های I//O داده ها را انتقال داد. هر سوکتی هم InputStream و هم OutputStream را دارا می باشد. استریم OutputStream مربوط به کلاینت به استریم InputStream مربوط به سرور وصل می باشد و بالعکس استریم InputStream مربوط به کلاینت به استریم OutputStream مربوط به سرور متصل است. پروتکل TCP یک پروتکل دوراهه است. بنابراین داده ها همزمان می توانند ارسال و دریافت شوند. در ادامه به کلاس ها و متدهایی که برای ارتباط سوکت مناسب هستند می پردازیم.

کلاس java.net.ServerSocket در برنامه سمت سرور استفاده می شود و از این کلاس برای گرفتن یک پورت و گوش دادن به درخواست های کلاینت ها به کار می رود. این کلاس 4 متد constructor دارد که این constructor ها به شرح زیر می باشند.

این سازنده یک شماره پورت می گیرد و یک سوکت می سازد و آن شماره پورت را به سوکت مورد نظر اختصاص می دهد. اگر پورت مورد نظر به برنامه دیگری اختصاص داده شده باشد exception رخ خواهد داد.

این constructor شبیه به قبلی است و پارامتر backlog به این منظور است که مشخص می کند که چند عدد کلاینت در صف انتظار بتوانند منتظر بمانند به عبارت دیگر صف انتظار سرور چندتایی باشد.

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

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

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

در مطلب قبلی در مورد مفاهیم برنامه نویسی سوکت توضیحاتی را گفتیم و کلاس ServerSocket را نیز معرفی کردیم در این مطلب قصد داریم کلاس Socket را معرفی کنیم و به ادامه بحث در مورد برنامه نویسی سوکت بپردازیم. در مطلب قبلی گفتیم که باید برای شئ ServerSocket یک پورت مشخص کنیم و بعد از آن متد accept را فراخوانی کنیم.

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

کلاس java.net.Socket نمایانگر سوکتی است که هم کلاینت و هم سرور برای برقراری ارتباط از آن استفاده می کند و هردوی سرور و کلاینت از این کلاس استفاده می کنند. کلاینت یک شئ Socket می سازد و سعی می کند با آن به سرور وصل می شود و سرور نیز با یک شئ Socket با استفاده از متد accept به دست می آورد.

پس این کلاس یکی از اصلی ترین کلاس های ارتباط است. این کلاس دارای 5 cosntructor می باشد که در کلاینت می توان از آن استفاده کرد. دقت داشته باشید که در سمت کلاینت باید علاوه بر شماره پورت باید آدرس سرور را نیز مشخص کنیم. در ادامه انواع constructor های مربوط به این کلاس را آورده ایم:

در contructor اولی IP سرور و شماره پورتی را که سرور به آن گوش می دهد داده می شود تا بتوان به آن وصل شد. حال اگر در برقراری ارتباط مشکلی پیش بیاید این constructor یک exception صادر می کند ولی اگر بدون هیچ مشکلی این constructor اجرا شود و شئ Socket ساخته شود به این معنی است که ارتباط با موفقیت انجام شده و می توان ارسال و دریافت پیام ها را انجام داد.

Constructor دومی هم دقیقا همان کار constructor قبلی را انجام می دهد با این تفاوت که به جای این که آدرس IP را به صورت رشته ای بگیرد در قالب یک شئ InetAddress دریافت می کند. constructor سوم نیز مانند دو constructor قبلی می باشد با این تفاوت که در این constructor آدرس IP محلی و پورت همان کامپیوتر نیز گرفته می شود تا با استفاده از آن بتوان وصل شد.

این برای زمانی است که چند کارت شبکه در کامپیوتر موجود باشد و همه دارای IP های متفاوتی باشند. Constructor چهارمی نیز شبیه به قبلی است با این تفاوت که به جای این که شماره IP را به صورت رشته ای بگیرد به صورت یک شئ از کلاس InetAddress دریافت می کند. constructor چهارم هیچ پارامتر ورودی ندارد و باید بعد از این که شئ سوکت ساخته شد با استفاده از متد connect به سوکت مربوط به سرور وصل شد.

وقتی که یک constructor اجرا می شود مانند سایر کلاس ها نیست که یک شئ ساده بسازد. بلکه در زمان ساخت یک شئ سوکت سعی می کند که به سرور مورد نظر وصل شود. در ادامه به برخی از متدهای مهم کلاس سوکت می پردازیم. دقت داشته باشید که هم در سمت سرور هم در سمت کلاینت شئ سوکت ساخته می شود که متدهای زیر می توانند هم در سمت سرور و هم در سمت کلاینت استفاده شوند. این متدها عبارتند از:

متد connect

این متد برای زمانی است که از constructor بدون پارامتر استفاده کنیم. با استفاده از این پارامتر آدرس IP و پورت مورد نظر را در قالب یک شئ SocketAddress به آن می دهیم. همچنین یک زمان انتظار نیز برای شئ مشخص می کنیم. که تا زمان مشخص شده منتظر ایجاد اتصال باشد.

متد getInetAddress

این متد آدرس IP کامپیوتری را که شی به سوکت آن وصل است را برمی گرداند. مقدار برگشتی این متد یک شئ InetAddress می باشد.

متد getPort

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

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

حال برنامه سرور به گونه ای است که به کلاینت گوش می دهد و پیام آن را چاپ می کند. به شکل زیر

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

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

یکی از قابلیت های جدید که به زبان برنامه نویسی جاوا اضافه شده است lambda expression است و این قابلیت به عنوان یکی از بهترین قابلیت های جاوا شناخته می شود. Lambda expression برنامه نویسی تابعی را آسان تر می کند و باعث می شود که روند برنامه نویسی ساده تر و سریع تر انجام شود.

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

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

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

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

تعریف های متدهای addition یک نوع استفاده از lambda expression می باشد. می بینید که در این متد از کلمه return استفاده نمی شود. در متد subtraction نوع داده های ورودی نیز مشخص نشده است. در تعریف متد multiplication هم نوع ورودی ها مشخص شده است و هم کلمه return و علامت براکت آورده شده است. همینطور می توان علامت پرانتز مربوط به پارامتر های ورودی را نیز استفاده نکرد برای مثال در تعریف greetService1 برای message از پرانتز استفاده نشده است. می بینید که استفاده از lambda expression برنامه نویسی راحت تر می شود.

زبان برنامه نویسی جاوا یک زبان multi thread(چند نخی) است. این به این معنی است که می توان با استفاده از این زبان می توان برنامه هایی نوشت که چندین thread را با هم اجرا نمایند. هر واحد که یک قسمت از کد را اجرا می کند را یک thread یا نخ نام دارد.

یک برنامه multi thread شامل چند بخش است که می توانند با هم و موازی اجرا شوند و هرکدام یک وظیفه جدا در یک زمان انجام دهند و این باعث می شود که برنامه در زمان کمتری اجرا شود و از منابع موجود استفاده بهتری بکنند. برای درک بهتر این مفهوم ابتدا مفهوم چندوظیفه ای بودن یا multitasking را تعریف می کنیم.

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

حال اگر بخواهیم این چندوظیفه ای را در سطح یک برنامه پیاده کنیم به آن چندنخی یا multi-threading می گویند. به این شکل که کل برنامه را به بخش های مختلفی تقسیم می کنیم و برای اجرای هر بخش یک thread می سازیم. این thread ها به طور موازی باهم اجرا خواهند شد. سیستم عامل علاوه بر این که زمان پردازش CPU را بین برنامه ها تقسم می کند همچنین زمان یک برنامه را بین thread های مختلف آن نیز تقسیم می نماید.

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

مفاهیم هرکدام از مراحلی که در تصویر آمده است رادر ادامه توضیح داده ایم:

هر ترد در جاوا یک اولویت دارد. این اولویت بندی ترد ها به سیستم عامل کمک می کند تا بتواند تردها را زمانبندی نماید. در جاوا اولویت تردها یک عدد بین MIN__PRIORITY(که عدد یک است) تا MAX__PRIORITY(که عدد 10 است) می باشد.

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

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

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

در عوض به جای متد stop متدی به نام interrupt ارائه شده است که این متد باعث می شود که درخواست کنیم که ترد متوقف شود. وقتی که متد interrupt برای تردی فراخوانی شود وضعیت interrupted ترد تغییر می کند که می توان با استفاده از متد isInterrupted به این وضعیت دسترسی داشت.

دقت داشته باشید که زمانی که یک ترد بلوکه شده است نمی توان وضعیت interrupt آن را چک کرد. در این حالت InterruptedException رخ خواهد داد. در این مطلب به بررسی مفهوم multi-thread پرداخته شد. یکی از مسائلی که در مواجهه با ترد ها در جاوا وجود دارد این است که وقتی که دو یا چند ترد با هم در حال اجرا هستند باید چگونه بین آنها همگام سازی انجام شود.

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

در مطلب قبل درباره ی مفاهیم Thread ها و Multi-threading صحبت کردیم. در این مطلب قصد داریم تا یکی از راه های پیاده سازی تردها در جاوا را توضیح دهیم. اولین راه ساختن ترد پیاده سازی اینترفیس Runnable می باشد. اگر شما قصد داریم که کلاسی که تعریف کرده اید توسط ترد اجرا شود باید اینترفیس Runnable را پیاده سازی نمایید. برای این کار شما باید سه مرحله کار انجام دهید که این سه مرحله عبارتند از:

دقت داشته باشید که threadObj یک شئ از کلاسی است که اینترفیس Runnable را پیاده سازی می کند و threadName نام همان تردی هست که به آن اختصاص داده می شود.

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

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

دقت کنید که با استفاده از متد sleep می توان ترد را به مدت زمان معینی از کار انداخت یا به حالت waiting برد. این متد یک مقدار عددی دریافت می کند که مشخص می کند که ترد چند میلی ثانیه باید متظر بماند

در مطلب قبل درباره ی multi-threading یا چندنخی در جاوا صحبت کردیم و گفتیم که با استفاده از اینترفیس Runnable می توان از این قابلیت استفاده کرد. در این مطلب قصد داریم که راه دیگری را برای استفاده از قابلیت تردها در زبان جاوا را بیان کنیم.

این روش استفاده از کلاس Thread است. استفاده از این روش به این شکل است که باید یک کلاس بسازیم و کلاسی که ساخته ایم فرزند کلاس Thread باشد.(کلاس Thread را extends کرده باشد). این روش قابلیت های بیشتر و انعطاف بیشتری به برنامه نویسان می دهد. استفاده از این روش دارای مراحل زیر است:

برای درک بهتر استفاده از کلاس Thread یک مثال در ادامه آورده ایم که به آن توجه کنید. دقت کنید که این مثال شبیه به همان مثالی است که برای پیاده سازی با runnable آورده بودیم:

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

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

برای این که با این متد ها بهتر آشنا شویم برنامه ای نوشته ایم که از چند کلاس تشکیل شده است. دقت کنید که نام کلاس ها و نام فایل های آن ها را به صورت توضیحات مشخص کرده ایم. در این برنامه از هر دو روش استفاده از تردها استفاده کرده ایم. تردی که با استفاده از اینترفیس Runnable ساخته شده است:

تردی که با استفاده از کلاس Thraed ساخته شده است:

متد main که از تردهای تعریف شده استفاده می کند :

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

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

آموزش جاوا اسکریپت فیلم رایگان فارسی pdf javascript جامع کامل گام به گام تصویری

دانلود رایگان فیلم آموزشی جاوا اسکریپت فارسی آموزش pdf رایگان پروژه محور بهترین سریع جاوا دانلود javascript برنامه نویسی کاربردی حرفه ای

آموزش جاوا اسکریپت فیلم رایگان فارسی pdf javascript جامع کامل گام به گام تصویری

آموزش جاوا اسکریپت فیلم رایگان فارسی

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

منبع : وبسایت سریع و آسان

لینک دانلود 

منبع : CodeFriend

دانلود “دانلود آموزش کامل جاوا اسکریپت JavaScript به زبان فارسی”

منبع و رمز فایل  :   www.p30vel.ir 

کانال آپارات خانه مطلب

معرفی دوره و جاوا اسکریپ ۰۰:۱۴:۰۰رایگانــ ۲ ساختار و قواعد دستوری زبان جاوا اسکریپت ۰۰:۱۶:۰۰رایگانــ ۳ متغیر ها و تابع ها در جاوا اسکریپت ۰۰:۱۱:۰۰رایگانــ ۴ آرایه ها در جاوا اسکریپت ۰۰:۱۰:.

۵ عملگرهای محاسباتی در جاوا اسکریپت ۰۰:۱۳:۰۰رایگانــ ۶ function ها در جاوا اسکریپت ۰۰:۰۹:۰۰رایگانــ ۷ object ها در جاوا اسکریپت ۰۰:۰۶:۰۰رایگانــ ۸ Event ها در جاوا اسکریپت ۰۰:۰۹:۰۰رایگانــ ۹ دستورات شرطی در جاوا اسکریپت .

– بررسی if 00:16:00رایگانــ ۱۰ دستورات شرطی در جاوا اسکریپت – بررسی Switch 00:11:00رایگانــ ۱۱ حلقه ها در جاوا اسکریپت – بررسی For 00:13:00رایگانــ ۱۲ حلقه ها در جاوا اسکریپت – بررسی While 00:12:.

. ۱۳ مدیریت خطا ها در جاوا اسکریپت ۰۰:۲۰:۰۰رایگانــ ۱۴ کلمه کلیدی this و let در جاوا اسکریپت ۰۰:۲۲:۰۰رایگانــ ۱۵ معرفی و استفاده از Const در جاوا اسکریپت ۰۰:۱۰:۰۰رایگانــ ۱۶ Debug کردن جاوا اسکریپت ۰۰:۰۷:.

۱۷ اعتبار سنجی فرم ها با جاوا اسکریپت ۰۰:۱۳:۰۰رایگانــ ۱۸ JavaScript Object Constructors 00:17:00رایگانــ ۱۹ Function ها در javaScript 00:14:00رایگانــ ۲۰ ورودی های Function ها ۰۰:۱۰:.

۲۱ شروع کار با DOM در JavaScript 00:15:00رایگانــ ۲۲ شروع کار با DOM در JavaScript – بخش دوم ۰۰:۱۷:۰۰رایگانــ ۲۳ بررسی کامل Event ها در جاوا اسکریپت ۰۰:۱۹:۰۰رایگانــ ۲۴ نحوه استفاده از Event Listener 00:14:.

۲۵ ایجاد المان جدید با جاوا اسکریپت ۰۰:۱۱:۰۰رایگانــ ۲۶ HTML DOM Collections در جاوا اسکریپت ۰۰:۰۷:۰۰رایگانــ ۲۷ شروع کار با BOM در JavaScript 00:11:00رایگانــ ۲۸ Window History در JavaScript 00:07:.

۲۹ Popup Box در JavaScript 00:10:00رایگانــ ۳۰ Timer در جاوا اسکرریپت ۰۰:۱۰:۰۰رایگانــ ۳۱ استفاده از Cookie در جاوا اسکریپت ۰۰:۰۷:۰۰رایگانــ ۳۲ شروع کار با Ajax 00:08:00رایگانــ ۳۳ دریافت و نمایش اطلاعات با Ajax 00:20:.

۳۴ بررسی و آشنایی با Ajax 00:11:00رایگانــ ۳۵ استفاده از XHR Request در جاوا اسکریپت ۰۰:۱۲:۰۰رایگانــ ۳۶ نحوه ارسال درخواست Async در Ajax 00:07:00رایگانــ ۳۷ بروز رسانی DOM با Ajax 00:12:00رایگانــ ۳۸ بروز رسانی DOM با Ajax -.

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

ها کار با تاریخ کار با اشیاء درک مدل شیء سند DOM چیست؟ کار با گره ها و عناصر کار با مدل Object Document دسترسی به عناصر DOM تغییر عناصر DOM ایجاد عناصر DOM کار با رویدادها و رویداد Listeners مقدمه ای برای مدیریت رویداد جاوااسکریپت کار با رویدادهای onClick و onLoad کار با رویدادهای onBlur و onFocus کار با تایمر خطایابی جاوااسکریپت خطاهای معمول جاواسکریپت استفاده از Firebug رفتن از طریق یک.

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

فایل جاوا اسکریپت معرفی jQuery استفاده از یک شبکه توزیع محتوا برای ارائه فایلهای جاوا اسکریپت جاوا اسکریپت و HTML5 جاوا اسکریپت در HTML5 استفاده از Modernizr استفاده از حالت سخت ویژگی های پیشرفته جاوا اسکریپت دانستن JavaScript برای جلوگیری معرفی عبارات منظم کار با AJAX کار با اشیاء و نمونه های اولیه رایگانــ ۳۹ استفاده XML در Java Script Ajax 00:10:00رایگانــ ۴۰ استفاده Json در Java Script Ajax 00:08:00رایگانــ ۴۱ استفاده از رویداد ها در Ajax 00:10:00رایگانــ ۴۲ فصل جدید – ساخت ۵ بازی با جاوا اسکریپت ۰۰:۰۵:۰۰رایگانــ ۴۳ ساخت بازی پرتاب سکه – بخش اول ۰۰:۱۰:۰۰رایگانــ ۴۴٫

ساخت بازی پرتاب سکه – بخش آخر ۰۰:۱۲:۰۰رایگانــ ۴۵ ساخت بازی Magic 8 Ball 00:12:00رایگانــ ۴۶ ساخت بازی حدس اعداد – بخش اول ۰۰:۱۲:۰۰رایگانــ ۴۷ ساخت بازی حدس اعداد – بخش دوم ۰۰:۰۹:۰۰رایگانــ ۴۸ ساخت بازی حدس اعداد – بخش سوم ۰۰:۱۰:۰۰رایگانــ ۴۹ ساخت بازی حدس اعداد – بخش آخر ۰۰:۰۹:۰۰رایگانــ مزایای جاوا اسکریپت : جاوا اسکریپت بر خلاف vbscript در همه browser ها قابل استفاده

و خوانده شدن است. جاوا اسکریپت قابلیت برنامه نویسی را به صفحات HTML شما میدهد. جاوا اسکریپت صفحات HTML شما را پویا میکند. جاوا اسکریپت به رویدادها پاسخ میدهد ( مثل کلیک موس.،load شدن صفحه و …) جاوا اسکریپت قابلیت ارزیابی و تغییر روی اطلاعات را دارد. جاوا اسکریپت قابلیتهای زیادی در کنترل browser بیننده دارد. جاوا اسکریپت میتواند cookie بسازد و استفاده کند. بازی حدس کلمات با جاواو دانلود رایگان فیلم آموزشی جاوا اسکریپت فارسی

اسکریپت ۰۰:۱۲:۰۰رایگانــ ۵۱ بازی حدس کلمات با جاوا اسکریپت – بخش دوم ۰۰:۱۵:۰۰رایگانــ ۵۲ بازی حدس کلمات با جاوا اسکریپت – بخش آخر ۰۰:۱۰:۰۰رایگانــ ۵۳ بازی تایمر معکوس – بخش اول ۰۰:۱۰:۰۰رایگانــ ۵۴ بازی تایمر معکوس – بخش دوم ۰۰:۱۴:۰۰رایگانــ ۵۵ بازی تایمر معکوس – بخش سوم ۰۰:۱۴:۰۰رایگانــ ۵۶ بازی تایمر معکوس – بخش آخر ۰۰:۱۰:۰۰رایگانــ ۵۷ ساخت ماشین حساب با جاوا اسکریپت ۰۰:۱۱:۰۰رایگانــ ۵۸ شروع فصل جدید – جاوا اسکریپت برای طراحان وب ۰۰:۰۵:۰۰رایگانــ ۵۹ کارکردن با Input ها توسط Java Script 00:17:00رایگانــ ۶۰ کارکردن با Select Box ها توسط Java Script 00:11:00رایگانـو

ـ ۶۱ کارکردن با Radio ها و CheckBox توسط Java Script 00:08:00رایگانــ ۶۲ مدیریت رویداد Submit تگ Form 00:09:00رایگانــ ۶۳ اعتبارسنجی Input ها با جاوا اسکریپت ۰۰:۰۹:۰۰رایگانــ ۶۴ غیر فعال کردن المان ها با جاوا اسکریپت ۰۰:۰۹:۰۰رایگانــ ۶۵ جمع آوری اطلاعات فرم با جاوا اسکریپت ۰۰:۰۷:۰۰رایگانــ ۶۶ محاسبه جمع فاکتور با جاوا اسکریپت ۰۰:۱۷:۰۰رایگانــ ۶۷ رفع باگ محاسبه فاکتور ۰۰:۰۹:۰۰رایگانــ ۶۸ تکمیل و

سبد خرید با جاوا اسکریپت ۰۰:۰۷:۰۰رایگانــ ۶۹ کوکی ها در جاوا اسکریپت ۰۰:۲۰:۰۰رایگانــ ۷۰ آشنایی و استفاده از BOM 00:15:00رایگانــ ۷۱ تغییر سایز و جابجایی window در جاوا اسکریپت ۰۰:۰۸:۰۰رایگانــ ۷۲ ساختو

شمارنده معکوس با جاوا اسکریپت ۰۰:۱۱:۰۰رایگانــ ۷۳ ساخت برنامه ToDo 00:23:00رایگانــ ۷۴ ساخت بازیه دایناسور مروگر کروم با جاوا اسکریکپ ۰۰:۲۸:۰۰رایگانــ ۷۵ ساخت اسلایدر با جاوا

آموزش جاوا – اپراتورهای افزایشی و دستوری در جاوا (فیلم آموزشی)