آموزش مقدماتی برنامه نویسی به زبان جاوا

Drago

پیشکسوت فعال فناوری اطلاعات
کاربر ممتاز
من قبلا که دانشجوی کارشناسی بودم عقیده داشتم که برنامه نویسی برای یه مهندس IT لازم نیست. یعنی فقط یه درک ابتدایی از کد داشته باشه و بفهمه که توش داره چه اتفاقی میفته کافیه، لازم نیست بلد باشه خودش کد بنویسه. اما بعد از اتمام دوره کارشناسی و ورود به ارشد نظرم عوض شد. بلد بودن حداقل یک زبان برنامه نویسی لازمه. داشتن این دانش به افراد ابزار کار میده. یه کارشناس ارشد تجارت الکترونیک رو تصور کنید که یه ایده‌ی خیلی ناب داره...چطور می‌خواد پیاده اش کنه؟ آیا باید از روز اول و مراحل خیلی خیلی ابتدایی، برای یه کار ساده محتاج یه برنامه نویس حرفه ای باشه؟ یه کارشناس ارشد شبکه که می‌خواد یه مسئله رو تست بگیره چی؟ نباید بتونه برنامه ای بنویسه که براش داده مورد نیاز رو ایجاد کنه؟
به
هر حال من خودم دنبال جاوا رفتم و انتخاب زبان برنامه نویسی هم از روی علاقه شخصی بوده. جاوا رو می‌تونم روی لینوکس راحت بنویسم و با یه jre هم روی هر سیستمی اجرا خواهد شد. جاوا بهترین زبان برنامه نویسی دنیا نیست، بدترینشون هم نیست، یکی از هزاران زبان برنامه نویسیه، مزایا و معایب خودش رو هم داره.

سه تا نکته رو من اول کار با صراحت بگم :
  1. توی این تاپیک در مورد مفاهیم صحبت زیادی نخواهد شد. اینکه jre چیه و چجوری کار میکنه، سیستم عامل با برنامه ای که به زبان جاوا نوشته شده چطور برخورد می‌کنه، چرا syntax جاوا این شکلیه و ... رو اگه می‌خواید بفهمید باید برید خودتون بخونید( و توصیه اکید دارم که حتما این کار رو بکنید)، منابع خوبی برای این مطالب هست. اما به نظر من جای این مطالب توی این تاپیک نیست، چون یا باید کپی پیست کنیم از منابع یا باید اطلاعات کم و بیش ناقصی بدیم.
  2. توی این مطلب در مورد مسائل پایه و اینکه شی‌گرایی چیه و شی و کلاس و وراثت و کپسوله سازی و غیره توضیح مفهومی داده نخواهد شد. اگر واقعا در مورد شی‌گرایی اطلاعات ندارین برید و کتاب مطالعه کنید.
  3. من مدرس جاوا نیستم. ادعایی هم توی این زمینه ندارم، من فقط بلدم با این زبان برنامه بنویسم. این تاپیک واسه این درست شده که «دور هم یه کدی بزنیم حالشو ببریم». اگه می‌خواید واقعا و درست حسابی جاوا رو یاد بگیرید باید حداقل یه کتاب در این زمینه بخونید. این تاپیک آموزش استاندارد نمیده اما اگه دنبالش کنید به احتمال قریب به یقین آخر بحث می‌تونید یه برنامه جاوایی ساده بنویسید.

حالا که با هم اتمام حجت کردیم بریم کار رو شروع کنیم.
اولین چیزی که ما نیاز داریم Java SDK هست، و بعدش هم یه IDE.
Java SDK رو میتونید رایگان از سایت خود Oracle دانلود کنید (منتها فیلتـرشکن می‌خواد).
واسه IDE هم پیشنهادم اینه که از Eclipse استفاده کنیم. چون هم رایگانه و راحت دانلود میشه، هم روی همه پلتفرمها (ویندوز و لینوکس و ...) کار می‌کنه و هم فردا خواستید برنامه اندرویدی بنویسید خیلی به دردتون می‌خوره.
خیلی از منابع آموزشی IDE خاصی رو معرفی نمیکنن، میگن کد رو توی notepad یا امثال اون بنویسید و با خط فرمان کامپایل کنید. اما این کار یه مزیت داره و هزار عیب. مزیتش اینه که به آماده خوری و کامل شدن کدتون توسط IDE عادت نمی‌کنین، عیبش اینه که وقت و انرژی آدم رو بیخود به هدر میده.

از دانیال عزیز خواهش کردم که یه مطالب و توضیحاتی در مورد Java SDK،JRE, IDE, Eclipse برامون بزاره که به عنوان پیش زمینه بخونیدش و بعد بریم سراغ کد.

یه چیز دیگه : من توی مطلب بالا هی نوشتم برید کتاب بخونید، اما کتابی معرفی نکردم. من خودم کلاس مهندس صدیقی رفتم واسه جاوا و واقعا لذت بردم.الان هم که توی کار هستم گاهی وقتا از کسانی که کلاس افراد دیگه رفتن و هزینه های تقریبا ۲ برابر دادن یه چیزهایی بیشتر بلدم! ایشون هنوز هم کلاس برگزار می‌کنه و ۴ کتاب هم در زمینه جاوا داره. برای شروع هم کتاب برنامه نویسی به زبان جاوا ایشون رو توصیه می‌کنم.
 

danialfx

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

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

اولین پست رو اختصاص میدم به لینکی که امیر معرفی کرد :

<< فکر میکنم شماره 2 و 3 و 4 مهم هستن. و باید قبل از شروع بخونیمشون >>
10 مطلبی ای که هر برنامه نویس جاوا باید بداند
نویسنده: احمدرضا صدیقی

بر اساس تجربه ای که نویسنده در طول سالیان متمادی در محیطهای جاوا کسب کرده است، بسیاری از برنامه نویسان جاوا برخی از مفاهیم کلیدی و پایة جاوا را نمی دانند درحالیکه برخی از آنها چندین سال در حال توسعة جاوا هستند. به نظر نویسنده، هر برنامه نویس جاوا که جاوای استاندارد را آموخته است یا در حال پیاده سازی با استفاده از جاوای استاندارد است باید نکات کلیدی و پایة زیر را بداند.
1)هر برنامه نویس جاوا باید تاریخچه، شیوه و هدف ایجاد جاوا را بداند. جاوا حدود سال 1992 در شرکت سان میکروسیستمز توسط جمز گاسلینگ اختراع شد. هدف جاوا ارایه زبانی بود که مستقل باشد، یعنی برنامه های آن روی هر سیستم عامل و سخت افزاری نصب و اجرا شود. در ابتدا نام آن را Oak گذاشتند اما بعد از این وکلای شرکت اعلام کردند این نام قبلا توسط زبان دیگری ثبت شده است نام جاوا را برای آن برگزیدند. جاوا نام جزیره ای در اندونزی در جنوب شرق آسیاست که قهوه های آن مشهور است. نقل است که جمز گاسلینگ وقتی با دوستان خود در حال خوردن قهوة اندونزیایی بود با دیدن نام جاوا روی بستة قهوه، جاوا را به عنوان نام زبان خود برگزید.

2) هر برنامه نویس جاوا باید معنی و کاربرد JVM، JRE و JDK را بداند. JDK مخفف Java Development Kit است و در واقع بسته ای است که برای برنامه نویسی جاوا به آن نیاز دارید. این بسته، شامل کتابخانه های جاوا، کامپایلر جاوا، دیباگر جاوا، و مجموعه ای از ابزارهای دیگر است که در توسعة یک برنامة جاوا ممکن است به آن نیازمند شوید. JRE نیز مخفف Java Runtime Environment است و در واقع زیرمجموعه ای از JDK است که برای اجرای برنامه های جاوا به آن نیاز دارید. به عبارت دیگر، اگر فقط قصد اجرای یک برنامة جاوا را دارید قبل از آن باید JRE را روی سیستم خود نصب کنید. اما اگر قصد تولید یک برنامه را دارید یعنی می خواهید برنامه ای بنویسد، آنرا کامپایل و اجرا کنید باید JDK را نصب کرده باشید. JRE زیرمجموعه ای از JDK است و وقتی شما JDK را نصب کنید JRE نیز به عنوان قسمتی از آن نصب می شود. JVM مخفف Java Virtual Machine است که به آن ماشین مجازی جاوا نیز گفته می شود. JVM مسئولیت اجرای بایت کدهای برنامه (کدهای کامپایل شده) را به عهده دارد و خود قسمتی از JRE است.

3)هر برنامه نویس جاوا باید نسخه های مختلف زبان جاوا و کاربرد آنها را بداند. جاوا به صورت رسمی در سه نسخه ارایه می شود الف-جاوای استاندارد که به آن Java SE گفته می شود ب-جاوای میکرو که به آن Java ME گفته می شود ج-جاوای Enterprise که به آن Java EE گفته می شود. جاوای استاندارد نسخة پایة جاواست و شامل کتابخانها های اصلی جاوا می شود، کتابخانه هایی که برای نوشتن هر برنامة جاوا (چه ساده باشد و چه پیچیده) به آن نیاز دارید. جاوای میکرو نسخه ای از جاواست که برای برنامه نویسی روی موبایل، لوازم خانگی، و سخت افزارهای خاص استفاده می شود. جاوای Enterprise نسخه ای از جاواست که برای برنامه نویسی روی سرور استفاده می شود. این برنامه ها عموما تحت وب هستند و معمولات تعداد کاربران زیاد دارند.

4)هر برنامه نویس جاوا باید پکیج های اصلی جاوای استاندارد را بشناسد. پکیج java.util شامل مجموعه ای از کلاسها و اینترفیسهای عمومی و کاربردی است. پکیج java.io و java.nio شامل مجموعه ای از کلاسها و اینترفیسها برای ورودی و خروجی در برنامه های جاواست. پکیج java.security شامل کلاسها و اینترفیسهای مربوط رمزنگاری، رمزگشایی است. پکیج java.sql و javax.sql شامل کلاسها و اینترفیسهای لازم برای ارتباط با پایگاه داده است. پکیج java.util.concurrent شامل کلاسهایی برای پیاده سازی و کنترل همزمانی و استفاده از Thread در جاواست. پکیج javax.script برای اجرای اسکریپتها و برنامه هایی است که با زبانهای اسکریپتی نوشته شده اند. javax.swing و java.awt پکیجهایی شامل کلاسها و اینترفیسها برای ایجاد واسط کاربری هستند.

5)هر برنامه نویس جاوا باید واسط های کاربری مختلفی که در جاوا وجود دارد را بشناسد. در جاوا انواع مختلفی از واسط کاربری را می توان ایجاد نمود که عبارتند از : اپلت، واسط کاربری سیستمی، Java Web Start، صفحات دینامیک وب. اپلتهای برنامه های جاوایی هستند که واسط کاربری آنها در مرورگر وب نمایش داده می شود (شبیه Flash). واسط کاربری سیستمی، واسط کاربری است که برای برنامه های رومیزی شبیه آن چیزی که اغلب برنامه های ویندوز یا لینوکس دارند استفاده می شود. Java Web Start را شاید بتوان شکل دیگری از اجرای برنامه های رومیزی قلمداد نمود Java Web Start امکان می دهد تا یک برنامة رومیزی را از طریق کلیک کردن روی یک لینک وب اجرا نمود. نوع آخر واسط کاربری واسط کاربری وب است که با استفاده از زبان جاوا می توان به صورت دینامیک آنرا ایجاد نمود.

6)هر برنامه نویس جاوا باید مسیر یادگیری جاوا را بداند. طبیعی است که هر فردی برای یادگیری جاوا باید ابتدا جاوای استاندارد یعنی همان Java SE را بیاموزد. بعد از آن، می تواند سراغ جاوای میکرو (Java ME) ، اندروید یا برنامه نویسی وب برود. هیچ کدام از این سه پیشنیازی به جز جاوای استاندارد ندارند. در مرحلة بعد، دانشجو می تواند به سراغ برنامه نویسی Java EE برورد باید دقت کنید که برنامه نویسی وب قسمتی از Java EE محسوب می شود و در اغلب منابع به صورت غیر رسمی به عنوان پیش نیاز Java EE نام برده می شود که از نظر بنده صحیح است. یعنی قبل از اینکه دانشجو تکنولوژیهای دیگر Java EE را بیاموزد می بایست مفاهیم برنامه نویسی وب در جاوا را آموخته باشد.

7)هر برنامه نویس جاوا باید Java SandBoxرا بداند. به محیط اجرای اپلت گفته می شود که شامل سطوحی از مجوزهای امنیتی است که مشخص می کند اپلت به کدامیک از منابع سیستم دسترسی دارد. وجود sandbox از نفوذ هکرهایی که با استفاده از اپلت قصد نفوذ و خرابکاری دارند جلوگیری می کند.

8)هر برنامه نویس جاوا باید Java HotSpot رابداند. قسمتی از JVM است که کار آن بهینه سازی کدهای کامپایل شده بر اساس پلتفرمی (سیستم عاملی) که کد روی آن اجرا می شود است. بهینه سازی که HotSpot انجام می دهد شامل برخی تنظیمات برای اجرای سریعتر کد و به حداقل رساندن سربار حاصل از اجرای قسمتهای با کارایی پایین است.

9)هر برنامه نویس جاوا باید OpenJDK را بشناسد. JDKای که به صورت رسمی توسط شرکت اوراکل انتشار می یابد به صورت کامل منبع باز نیست علت آن این است که بخشهایی از آن JDK توسط شرکتهای ثانوی تهیه شده و با مجوز (licence) متفاوتی در اختیار شرکت اوراکل (سان میکروسیستمز) قرار داده شده است. بنابراین شرکت اوراکل حق انتشار سورس آنها را همراه با JDK ندارد. OpenJDK مشابه Oracle JDK است با این تفاوت که قسمتهایی که Oracle JDK منبع باز نیستند در OpenJDK منبع باز هستند.

10)هر برنامه نویس جاوا باید، Assertion و Logging را بداند. از JDK 1.4 خصوصیتی به جاوا اضافه شده که به آن Logging گفته می شود. Logging امکان می دهد تا لابلای کدهای اجرایی برنامه عباراتی متنی را مشخص نمود تا در زمان اجرای برنامه در کنسول برنامه، در فایل، در پایگاه داده یا هر منبع دیگری نوشته شوند. این جملات به مدیر نرم افزار امکان می دهد تا وضعیت اجرای برنامه، خطاهای احتمالی در حین اجرای برنامه ، یا وضعیت کاربران برنامه و کارهایی که آنها در نرم افزار انجام داده اند را پیگیری کند. در تنظیمات Logging به سادگی می توان آنها را فعال یا غیرفعال کرد یا اینکه مقصد پیغام را کنسول برنامه، فایل، پایگاه داده یا به هر جای دیگری تغییر داد.
Assertion خصوصیتی است که به برنامه نویس امکان تست برنامه را می دهد در واقع جملات assert لابلای کدهای برنامه نوشته می شوند و یک شرط را بررسی می کنند در زمان اجرای برنامه اگر شرط برقرار نباشد خطا تولید می کند.

منبع : http://www.atlassoft.ir/papers/10_tips_every_java_developer_should_know.html
 

danialfx

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

IDE چیست :

ide به محیط برنامه نویسی گفته میشود که ما کدهای خود را در آن محیط مینویسم.
از ide هایی که جاوا را ساپورت میکنن . میتوان از Eclipse . Netbeans و ... نام برد.

بنا بر گفته ی استاد , ما در این دوره اموزشی از Eclipse استفاده خواهیم کرد که نسخه portable اون رو میتونید از سایت زیر دانلود کنید :
http://eclipse.org/downloads/

اخرین نسخه در حال حاضر اون : Eclipse Standard 4.3.1, که حجم 199 مگابایتی دارد


JRE و JDK چیست :
مورد شماره 2 پست بالا رو مطالعه کنید.

اخرین نسخه jre و Jdk رو میتونید از لینک زیر دریافت کنید : (البته نیاز به فیلتر شکن داره. )
http://www.oracle.com/technetwork/java/javase/downloads/index.html

ولی خب برای اینکه برای دانلود به فیلتر شکن نیاز نداشته باشیم. میتونید از لینک زیر دانلود کنید :
http://soft98.ir/software/692-sun-java-se-runtime-environment.html

از 2 تا لینک اخر استفاده کنید. یعنی . برای نسخه 32 بیتی:
http://dl2.soft98.ir/soft/JDK.7.Update.51.x86.exe

برای نسخه 64 بیت :
http://dl2.soft98.ir/soft/JDK.7.Update.51.x64.exe

java sdk : اگر اشتباه نکنم اشاره به همون java se development kit داره که همان ابزار توسعه نسخه استاندارد جاوا هست.

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

Drago

پیشکسوت فعال فناوری اطلاعات
کاربر ممتاز
java sdk : اگر اشتباه نکنم اشاره به همون java se development kit داره که همان ابزار توسعه نسخه استاندارد جاوا هست.
SDK در کل به Software Developement Kit گفته می‌شه، فارق از زبان برنامه نویسیش. کلا اصطلاحه. در جاوا معمولا به جای Java SDK میگن JDK.

===============
ما می‌خوایم آخر این دوره بتونیم یه برنامه چت ساده بنویسیم که دو نفر به وسیله اون به هم پیام می‌دن. اینجوری هم ارسال و دریافت در شبکه رو پوشش می‌دیم، هم واسط گرافیکی و هم thread (نخ؟!) . اگه درست پیش بریم شاید متون ارسالی رو رمزنگاری هم کردیم...
 
آخرین ویرایش:

Drago

پیشکسوت فعال فناوری اطلاعات
کاربر ممتاز
علاقه مندان به تاپیک :
همه Eclipse (یا هر IDE دیگه که دوست دارید) رو نصب کردید؟
همه JDK رو نصب کردید؟ شروع کنیم؟

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

danialfx

عضو جدید
کاربر ممتاز
علاقه مندان به تاپیک :
همه Eclipse (یا هر IDE دیگه که دوست دارید) رو نصب کردید؟
همه JDK رو نصب کردید؟ شروع کنیم؟

رو pc من از قبل ok بود.
بی صبرانه منتظر شروع هستم.


SDK در کل به Software Developement Kit گفته می‌شه، فارق از زبان برنامه نویسیش. کلا اصطلاحه. در جاوا معمولا به جای Java SDK میگن JDK.

نمیدونستم. ممنون که گفتی. :gol:
 

Drago

پیشکسوت فعال فناوری اطلاعات
کاربر ممتاز
۱. من با نصب Eclipse مشکل دارم؟؟ ارور میگیره
۲. محیطش چطوره؟؟ یکم توضیح میدید؟؟
۳. من اول JDK رو نصب کردم ولی اصن نمیدونم کجا رفت!!!
۱. شما با نصب Eclipse مشکل نداری، با JDK مشکل داری. البته مشکل هم نداری، فقط نصب نیست روی سیستمت :|
۲. اسکرین شات محیطش توی اینترنت زیاده... راستش نمیدونم چی می‌خواید ازش بدونید.
۳. نمی‌دونید کجا رفت؟ :| انتظار ندارید که مثلا توی all programs یه آیکون بیاد که روش نوشته باشه JDK که؟ توی قسمت برنامه های نصب شده برو ببین هست یا نه.

آخرین نکته : راستش ورژن هایی که من از Eclipse دیدم هیچکدوم نصب لازم نداشته. فایل آرشیو شده رو یه جا extract میکنی، بعد روی آیکونش دابل کلیک میکنی ران میشه.
 

Drago

پیشکسوت فعال فناوری اطلاعات
کاربر ممتاز
پیش نوشت : Eclipse من نسخه لینوکس ورژن 3.7.2 است و اسکرین شات هایی که میذارم هم مربوط به همونه، ممکنه در ظاهرش و منوها تفاوت های جزئی مشاهده بشه، اما در سطحی که ما کار می‌کنیم تفاوتی وجود نداره.
===============================
خب، حالا پیش نیازها رو نصب کردیم و می‌خوایم برنامه بنویسیم.
وقتی که Eclipse رو باز می‌کنید ازتون می‌خواد که یه مسیر برای Workstation انتخاب کنید، این مسیر پروژه شماست. عموما یه مسیر انتخاب می‌کنن و همه پروژه ها رو توی اون میذارن.
اول از همه باید یه پروژه بسازیم، یه پروژه مجموعه ای از کلاسها و فایل های دیگه است.
برای ساختن پروژه یا از منوی فایل اقدام کنید file => new => Java Project یا روی اون آیکون که زیر منوی فایله (یه چیزی شبیه پنجره است که یه چیزی مثل ستاره روشه) کلیک کنید و Java Project رو بزنید.
با چیزی شبیه این روبرو می‌شید :

قبل از اینکه ادامه ساخت پروژه رو بریم یه سری چیزهای رو بگم :
شماره ۱ پروژه های مختلفی که دارید رو با جزئیاتشون نشون میده.
شماره ۲ محل کنسول و چیزای دیگه است. کنسول برای اینکه ببینید چه اتفاقاتی داره میفته، چه خطاها یا Exception هایی رخ داده و ... مفید و لازمه. توی برنامه می‌تونید روی این کنسول چیزهایی چاپ کنید، به زودی میبینید.
شماره ۳ محل Text Editor های شماست (بعدا اگه وب کار کنید بروزر داخلی Eclipse هم همینجا اجرا میشه). می‌تونید چندین ویرایشگر رو با هم داشته باشید، حتی اگه مربوط به پروژه های مختلف باشن.

حالا ما رفتیم یه پروژه جدید اضافه کنیم و صفحه ای شبیه صفحه بالا اومده. توی این آموزش انتظار نداشته باشید توضیح واضحات بدم و مثلا بگم باید توی Project Name اسم پروژه رو نوشت...
قسمتی که قابل توجه است اون قسمتیه که با کادر قرمز مشخص کردم. اگه به صورت پیشفرض JRE مناسب انتخاب نشده خودتون باید انتخابش کنید(انتظار نداشته باشید دقیقا مثل مال من باشه، ممکنه فرق داشته باشه).
اگه خواستید بیشتر بازی کنید میتونید Next بزنید، اما چیز خاصی نیست که بخوام بگم، پس تصور می‌کنم که Finish رو زدید و پروژه ساخته شده.

پروژه رو که باز کنید، یه چیزی مثل دایرکتوری هست که نوشته src. تمام سورس های شما توی این فولدر باید قرار بگیره.
حالا بیاید اولین برنامه امون رو بنویسم.
جاوا تماما شی‌گرا است. برای هر کاری باید یه کلاس داشته باشیم. پس بیاید یه کلاس درست کنیم. روی src کلیک راست کنید و new و بعد Java Class رو انتخاب کنید (یا می‌تونید اون آیکون سبزه که روش یه C هست و یه + زرد بالاش هست رو بزنید). به هر حال یه پنجره باز می‌شه که مشخصات کلاس رو ازتون می‌خواد.
اولین چیزی که می‌خواد اسم پکیج هست، پکیج چیه؟ جلسه بعد توضیح میدم، فعلا می‌تونید خالی بزاریدش(هرچند که اون بالا بهتون می‌گه استفاده از پکج دیفالت توصیه نمیشه). بعد از اون اسم کلاس رو می‌خواد. بیاید در مورد قوانین نام گذاری توی جاوا یه کم بحث کنیم.
جاوا حساس به بزرگ و کوچیک بودن حروف(Case Sensitive) است.توی جاوا اسم کلاس باید با حروف بزرگ شروع بشه. اسم متد باید با حروف کوچیک شروع بشه. اسم متغیر هم باید با حروف کوچیک شروع بشه. اسم پکیج هم باید با حروف کوچیک شروع بشه. Camel Case نوشتن هم شدیدا توصیه میشه، مثلا myFirstMethod. تا دیر نشده بگم که از انتخاب اسامی با مفهوم حتی اگه خیلی طولانی بشه نترسید و نپرهیزید، همه IDE استفاده می‌کنن و IDE ها هم همه Auto Complete دارن (چه برای کلاس و چه برای متد و چه متغیر). میتونید یه سرچی در مورد رسوم و قوانین نامگذاری در جاوا هم بکنید.
پس یه اسم مناسب که با حروف بزرگ شروع می‌شه برای کلاسمون انتخاب می‌کنیم، مثلا من گذاشتم MyFirstClass.
بقیه گزینه ها و باکس ها رو برای این برنامه لازم نیست دست بزنید، اما یه کم که جلو بریم و بفهمید به چه درد می‌خورن، دوست دارم خودتون داوطلبانه ازشون به شیوه مناسب استفاده کنید.
پس Finish رو می‌زنیم و یه Editor باز می‌شه که کلاسمون رو بهمون نشون میده. اما همینجوری که نمی‌شه کد نوشت. هرکدی باید توی یه متد باشه. مهم ترین متد، متد Main هست که شروع اجرای برنامه ماست.
امضا (در واقع Signature) متد Main مشخص و ثابته، نمی‌تونیم هرجور دلمون خواست بنویسم، باید اینطور نوشته بشه :
کد:
public static void main(String[] args) {

}
حالا ما میایم و یه تیکه کد می‌نویسم که توی کنسول چاپ بشه :

کد:
public static void main(String[] args) {	
		System.out.print("Hello World!");
		
	}
امتحان کنید! اول فایل رو سیو کنید (اون دیسکته یا ctrl+s) بعد ctrl+f11 رو بزنید یا از منوی run گزینه run رو انتخاب کنید. جواب باید توی کنسول باشه.

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

Drago

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

هر دو تاپیک مرتبط با جاوا , مهم شد .
 
آخرین ویرایش توسط مدیر:

Drago

پیشکسوت فعال فناوری اطلاعات
کاربر ممتاز
با تشکر از همه دوستانی که توی تاپیک «سوال، انتقاد، پیشنهاد و رفع خطاهای آموزش جاوا» تمرینشون رو گذاشتن، قسمت بعدی رو شروع می‌کنیم.
از اون مدیر (احتمالا امیرحسین) هم که تاپیک ها رو مهم کرد تشکر می‌کنم.
=================
خب اول از همه برسیم به پکیج (یا در واقع پکج).
پکیج در واقع یه فولدره. یعنی اگه پروژه رو هم نگاه کنید می‌بینید به ازای هر پکجی که ساختید یه فولدر ایجاد شده.
خب، حالا واسه چی باید پکج بسازیم؟ دلیل اولش ساده است : مرتب شدن کلاسها و سایر منابع. حالا توی پروژه ای که روی هم ۱۰ تا کلاس داره ممکنه به چشم نیاد اما وقتی شد ۴۰۰۰تا کلاس اونوقت پکج شدن خیلی مهم میشه!
Eclipse یه چیزی داره به اسم پکج دیفالت (Default Package) که کلاسهایی که توی هیچ پکجی نباشن رو توی همون پکج دیفالت درنظر میگیره. بعضی IDE های دیگه شما رو مجبور می‌کنن حتما یه پکج درست کنین.

تصور کنید که ما مثلا یه برنامه مدیریت حسابهای بانکی می‌خوایم بنویسیم. یه قسمتی از کار ارتباط با GUI داره و یه قسمتی هم با دیتابیس و یه قسمتی هم عملیات هست. می تونیم واسه هرکدوم از اینها یه پکج داشته باشیم.
وقتی که از IDE ها استفاده می‌کنید اینکه کدوم کلاس توی کدوم پکج هست خیلی راحت و تصویری کنترل می‌شه، اما اگه خواستید توی کد این موضوع رو کنترل کنید کافیه بالای کلاستون بنویسید :
کد:
package myPackage;
مثلا توی این عکس میبینید که بالای کلاس همچین کدی هست.
دقت کنید که ما میتونید تا چندین و چند سطح تو در تو پکج داشته باشیم و برای آدرس دادن پکج های داخلی کافیه که از نقطه استفاده کنیم.مثلا پکج project شامل پکج های ui و operations است و ما میخوایم به پکج ui اشاره کنیم، کافیه بنویسیم project.ui
حالا که داریم با پکج آشنا میشیم بیایم با رسوم نامگذاری پکیج هم آشنا بشیم. برنامه نویس باید به برنامه های بقیه، فریم ورک ها و غیره سر بزنه، دانلود کنه، ببینه و استفاده کنه. ندونستن بعضی از این رسوم ممکنه باعث تعجب بشه.
رسم کلاسهای جاوا اینجوریه که از برعکس دامین (واقعی یا خیالی) اون برنامه نویس یا شرکت سازنده شروع میشه بعد هم اسم پروژه و جزئیات میاد. مثلا من ممکنه یه پروژه داشته که اینجوری پکج براش درست کنم : com.drago.project.ui
===========
خب توی بحث پکج فکر نمیکنم چیزی باقی مونده باشه، سوالی داشتید توی تاپیک خودش بپرسید.
برسیم به انواع داده. توی جاوا دو نوع داده داریم. انواع اولیه (primitive) مثل : int, long, double, float, byte و ...
اما انواع داده انتزاعی رو هم داریم که در واقع تمام کلاس های ما رو شامل میشن. مثلا توی پکج java.lang کلاسهایی مثل String و Object. تمام کلاسها به طور پیشفرض از Object ارث میبرند...اما ارث بری چیه؟ بعدا توضیح میدیم.
==========
این رو داشته باشید تا سریع بریم سراغ ساختارهای کنترلی.
 

Drago

پیشکسوت فعال فناوری اطلاعات
کاربر ممتاز
توی این پست میخوام اول یه کم در مورد ساختارهای کنترلی مثل if و while و switch صحبت کنم، این وسط در مورد بعضی عملگرها هم بحث میشه و حلقه رو هم میگیم.
=======
ساختاریهای کنترلی که ما توی Java داریم شامل if-then و if-then-else و while و do-while و switch است.
سینتکس if-then خیلی ساده است :
کد:
if ([expression]){			[operation]
		}
که توی این کد [expression] یه عبارته که جوابش true یا false هست. مثلا :
کد:
public static void main(String[] args){
		int x = 6;
		if (x>5){
			System.out.print("X is higher than 5");
		}
	}
اما اگه x از ۶ کوچیکتر بود چی؟ اونوقت میشه if-then-else :
کد:
if([expression1]){
		[operation1]
	}else{
		[operation2]
	}
مثلا :
کد:
public static void main(String[] args){
		int x = 6;
		if (x>5){
			System.out.print("X is higher than 5");
		}else{
			System.out.print("X is not higher than 5")
		}
	}
حالا ممکنه ما بخوایم اون else هم شرطی بشه. مثلا اگه عدد بین ۰ تا ۵ بود یه چیز، اگه خود ۵ بود یه چیز و اگه بیشتر بود یه چیز دیگه چاپ بشه :
کد:
public static void main(String[] args){
		int x = 6;
		if(x < 5){
			System.out.print("X is lower than 5.");
		}else if (x==5){
			System.out.print("X is 5");
		}else {
			System.out.print("X is higher than 5");
		}
	}
میتونیم تعداد خیلی زیادی if داشته باشیم که هر کدوم یه چیزی رو چک می‌کنه، اما این کار کثیف کاریه. وقتی تعداد if ها از یه تعدادی بیشتر شد می‌تونیم از switch استفاده کنیم. توی دستور switch ما یه مقدار رو میگیریم و بنابر حالتهای مختلف تصمیم میگیریم :
کد:
public static void main(String[] args){
		int x = 0;
		switch (x) {
		case 0:
			System.out.print("X is zero.")
			break;
		case 1:
			System.out.print("X is one.")
			break;
		case 2:
			System.out.print("X is two.")
		default:
			System.out.print("X is not zero or one on two.")
			break;
		}
	}
مثال قبل رو اگه می‌خواستیم با if بنویسیم این شکلی میشد :
کد:
if (x==0){
			System.out.print("zero");
		}else if(x==1){
			System.out.print("one");
		}else if(x==2){
			System.out.print("two");
		}else{
			System.out.print("X is not zero or one on two.");
		}
ممکنه به نظر کوتاهتر بیاد، اما کثیفتره.
چند تا نکته در مورد switch :
۱. چرا باید آخر هر عملیاتی که توی switch مینویسیم break بزاریم؟ چون در واقع اون case فقط یه لیبله (label) و عملیات خاصی رو اجرا نمیکنه. اگه break نذاریم همه عملیاتی که بعد از اون label هست اجرا خواهد شد. میتونید امتحان کنید خودتون.
۲.اون دیفالت آخرین مورد باید نوشته بشه و کارش هم اینه که اگر کلیدمون (در اینجا x) در هیچکدوم از value ها (در اینجا ۰ و ۱و ۲) نبود متوجه بشیم و شاید بخوایم یه عملیاتی رو انجام بدیم.

اما اگه اون کلید ما فقط دوحالت داشت چی؟ مثلا true یا false بود. اگه بخوایم با if یا سوییچ بنویسیم این شکلی میشه :
کد:
public static void main(String[] args){
		int x = 1;
		switch (x) {
		case 1:
			System.out.print("X is one.");
			break;
		default:
			System.out.print("X is two.");
			break;
		}
		
		if (x==1){
			System.out.print("X is one.");
		}else {
			System.out.print("X is two.");
		}
اما یه چیزی داریم به اسم ternary if یا if سه گانه.
دستورش اینجوریه :
کد:
([expression] ? [true operation] : [false operation])
توی قسمت expression یه عبارتی که جواب true/false داره قرار میدیم. اگه جواب true بود اولیه برمی‌گرده، اگه فالس بود دومیه. اما دقت کنید که در این روش حتما یه چیزی برمی‌گرده، یعنی بحث عملیات نیست. مثلا :
کد:
public static void main(String[] args){		int x = 1;
		boolean y;
		 y = (x==1 ? true : false);
		 System.out.print(y);
	}
توی این کد اگه x برابر ۱ باشه true واگه نباشه false برمیگیرده. دقت کنید که گفتیم عملیات نمیشه انجام داد توی if سه گانه، یعنی کد زیر غلطه :
کد:
public static void main(String[] args){
		int x = 1;
		
		(x==1 ? System.out.print(true) : System.out.print(false));
		
	}
حلقه while رو فکر می‌کنم همه آشنایی دارید، تا وقتی که شرط برقراره، عملیات ادامه پیدا می کنه:
کد:
public static void main(String[] args){
		int x = 5;
		
		while (x>0){
			System.out.print(x);
			x = x-1; // or x--
		}
	}
do - while هم شبیه اینه، با این تفاوت که حتما عملیات یه بار اجرا میشه. مثلا توی مثال بالا اگه x صفر باشه، عملیات چاپ هیچوقت انجام نمیشه اما همین رو با do-while مینویسیم :
کد:
public static void main(String[] args){
		int x = 5;
		
		do{
			System.out.print(x);
			x = x-1; // or x--
		}
		while (x>0);
	}
توی این مثال اگه x=0 باشه هم حلقه یه بار اجرا میشه (اگه هر عددی باشه، حتی منفی ۱۰۰۰ هم باشه باز هم یه بار اجرا میشه).

حالا این جاهایی که یه عبارت می‌نویسیم که جواب صحیح یا غلط باید بده، اگه خواستیم چندتا موضوع با هم رو چک کنیم چی؟ یعنی مثلا هم x>0 و هم Y>0 باشه باید چیکار کنیم؟
عملگر and توی java به صورت && هست. عملگر & هم داریم که استفاده اش متفاوته و به کار ما نمیاد، میتونین مستنداتش رو خودتون بخونین.
عملگر or هم به صورت || مشخص میشه. عملگر | هم داریم که استفاده اش متفاوته و به کار ما نمیاد، میتونین مستنداتش رو خودتون بخونین.
===========
حلقه for رو هم بگم.
تاحالا کسی براش سوال پیش نیومده که اون آرایه استرینگ که اسمش رو گذاشتیم args و توی متد main هست چیه و به چه درد می خوره؟
ببینید اصولا اگه ما از IDE استفاده نکنیم، باید برنامه رو توی کامند لاین اجرا کنیم. اول باید فایلهایی که درست کردیم و پسوند java. دارند (مثل همین کلاسی که ساختیم) رو کامپایل کنیم تا تبدیل به class. بشه (تبدیل به بایت کد بشه) تا JRE بتونه اونها رو بخونه و بفهمه. بعد هم اون class. رو اجرا میکنیم.
کار عجیب و سختی هم نیست، کافیه بنویسیم :
کد:
برای کامپایل کردن :
javac MyFirstClass.java

و برای اجرا :
java MyFirstClass
اما جلوی این دستور دوم میتونیم یه سری آرگومان هم بفرستیم. این آرگومانها همونها هستند که میان و میرن توی اون آرایه استرینگ میشینن!
اما ما که از کامند لاین استفاده نمی‌کنیم چطور می‌تونیم این آرگومانها رو بفرستیم؟ توی Eclipse از منوی run گزینه ...Run Configurations رو انتخاب کنید.
بعد توی تب Arguments آرگومانهاتون رو بنویسید. دقت کنید که در این حالت هر کلمه که بعدش یه اسپیس بزنید یه آرگومان حساب میشه.
مثلا توی این تصویر ما ۳ تا آرگومان نوشتیم (میتونستیم هر کدوم رو توی یک خط هم ننویسیم).


حالا چرا این آرگومانها رو معرفی کردیم؟ که هم آرگومانها رو یاد بگیرید و هم یه loop بنویسیم.
یه حلقه‌ی for دستورش اینجوریه :
کد:
for([variable];[condition];[step]){			[operation]
		}
مثلا یه نمونه ساده اش میتونه این باشه :
کد:
public static void main(String[] args){
		
		int x = 5;
		for(int i=0;i<x;i++){
			System.out.print(i);
		}
		
	}
که خب اعداد ۰ تا ۴ رو چاپ خواهد کرد.
اما بیایم از اون args هم استفاده کنیم :
کد:
public static void main(String[] args){		
		for(int i = 0;i<args.length;i++){
			System.out.println(args[i]);
		}
	}
این برنامه میاد و هر کدوم از آرگومانهایی که فرستادیم رو توی یه خط چاپ میکنه.

===
خب، فکر کنم واسه یه جلسه این کافی باشه.

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

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

Drago

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

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

تعریف کلاس ساده است :
کد:
public class MyClass {
}
تک تک این اجزا معنی دار هستند و مهم.
public حوزه دسترسی کلاس رو مشخص میکنه. هرچند من ندیدم تا حالا کلاسی private یا protected باشه اما به هر حال کلاسهای public توسط سایر کلاسها قابل دسترسی هستند.
class هم که کلاسه دیگه! ما می‌خوای چی تعریف کنیم؟ کلاس!
اسم کلاس حتما باید اولش با حروف بزرگ باشه.اسم کلاسها رو با معنی انتخاب کنید، حتی اگه طولانی بشه. ما معمولا کلاسها رو به صورت گرافیکی با کلیک کردن روی منوهای مورد نظر میسازیم.

حالا یه کلاس داریم. هر کلاسی نماینده گروهی از اشیاء مشابه است و هر نمونه از این کلاس یه شی‌ گفته می‌شه. مثلا کلاس دانشجو داریم و هر دانشجوی مشخص یه شی از این کلاسه.
کلاس (در واقع شی) یه سری فیلدها (Field که گاهی Property هم گفته میشه) داره و یه سری هم رفتار یا متد داره. مثلا دانشجو فیلدهایی مثل شماره دانشجویی، نام، کدملی،‌ واحدهای اخذ کرده، تعداد واحد ترم جاری و غیره داره، یه سری متدها مثل انتخاب واحد، انصراف، پرداخت شهریه ، مطالعه و غیره داره.
مثلا تصور کنید یه برنامه ای برای یه کتابخونه می خوایم بنویسیم (همینجوری به ذهنم رسید، معماریش هم توی ذهنم نیست، اگه گیر کردیم کمک کنید!!).
یه کلاسی درست می‌کنیم به اسم عضو. عضو چی داره؟ مثلا شماره عضویت، اسم، لیست کتابهایی که پیششه، تاریخ عضویت.
چه کارایی می‌تونه بکنه؟ می‌تونه عضو بشه، کتاب بگیره، کتابش رو پس بده.
می تونه اینجوری باشه :
کد:
public class Member {


	Integer memberId;
	protected String name;
	private String[] borrowedBooks;
	public Integer signUpDate;
	public static int numberOfMembers;
	


	public void register(String name){
		this.name = name;
		numberOfMembers ++;
	}
	
	private int getABook(){
		//do something!
		return 0;
	}
	protected boolean returnBook(Long bookId){
		//some operation!
		return true;
	}
}
همونطور که میبینید ما ۵ تا فیلد برای این کلاس تعریف کردیم. من سعی کردم هر کدوم رو متفاوت تعریف کنم که با انواعش آشنا بشید.
اولین فیلد رو این طوری تعریف کردیم که فقط نوعش و اسمش رو نوشتیم. این فیلد به طور پیشفرش public خواهد بود، یعنی تمام کلاسهای دیگه ،چه توی این پکج باشند و چه نباشند، چه ساب کلاس این کلاس باشند و چه نباشند، بهش دسترسی خواهند داشت.
دومین فیلد رو protected تعریف کردیم. در این حالت کلاسهایی که در این پکج هستند و ساب کلاس های این کلاس بهش دسترسی دارند.
سومین فیلد private تعریف شده، یعنی فقط خود این کلاس بهش دسترسی داره، هیچ کس دیگه نمیتونه به این فیلد به صورت مستقیم دسترسی داشته باشه.
چهارمین فیلد رو public تعریف کردیم. چه کلمه‌ی پابلیک رو بنویسم و چه هیچی ننویسیم هیچ فرقی نداره. این فیلد هم از نظر دسترسی دقیقا مشابه فیلد اول خواهد بود.
اما آخرین فیلد یه کلمه‌ی static اضافه داره، یعنی چی؟ یعنی این فیلد به ازای هر شی مقدار نمی‌گیره و مقدارش برای همه اون اشیا مثل همه.
بزارید استاتیک رو بیشتر توضیح بدیم : ما ۲ تا عضو داریم توی این کتابخونه : سلم و تور. سلم ۲ تا کتاب و تور ۱ کتاب گرفته. سلم یک سال پیش و تور یک ماه پیش عضو شده. پس تا اینجا همه فیلدهاشون با هم فرق می‌کنه. اما اگه از سلم بپرسی چندتا عضو توی این کتابخونه است میگه ۲ تا، اگه از تور هم بپرسی میگه ۲ تا.


برسیم به متدها. راستش من سعی کردم عملیات زیادی رو توی متدها پیاده نکنم تا بیشتر به سینتکس و تعریف متدها بپردازیم نه عملیاتشون.
همونطور که میبینید متدها هم میتونن public , private و یا protected باشن. حوزه دسترسی متدها هم دقیقا مثل فیلدهاست.
اما برای متدها باید نوع بازگشتی مشخص بشه. نوع بازگشتی دومین کلمه ایه که توی تعریف متد نوشته میشه، مثلا متد ()getABook نوع بازگشتیش int ، متد ()returnBook نوع بازگشتیش boolean (یا همون true و false) است. اما متد ()register بازگشت نداره و void است.

حالا اینا که نوشتیم به چه درد می‌خوره؟ بریم توی کد!
این کلاس Member رو که نوشتیم بیایم یه کلاس TestMember هم بنویسیم :
کد:
public class TestMember {


	public static void main(String[] args){
		Member.numberOfMembers = 2;
		Member salm = new Member();
		Member tur = new Member();
		salm.register("Salm");
		tur.register("Toooor");
		System.out.println("Salm's name is : " + salm.name);
		System.out.println("Tur's name is : " + tur.name);
		int canSalmGetABook = salm.getABook();
		System.out.println(canSalmGetABook);
		Member.numberOfMembers = 2;
		System.out.println(salm.numberOfMembers);
		System.out.println(tur.numberOfMembers);
		System.out.println(Member.numberOfMembers);
	}
}
دقت کنید که main رو می‌تونستیم توی خود همون کلاس Member بنویسیم، از نظر فنی فرقی نمی‌کنه. منتها من ترجیح می‌دم کارم تمیز باشه. لازم نیست در مصرف کلاس صرفه جویی کنیم!

متدهای static هم داریم. مثل فیلدهای استاتیک این متدها هم وابسته به شی‌ خاصی نیستند. در متدهای استاتیک نمیشه از فیلدهای غیر استاتیک استفاده کرد.

مبحث بعدی Constructor است. میبینید که ما وقتی یه آبجکت از Member گرفتیم و initializeش کردیم نوشتیم ()new Member. این Constructor پیشفرضه و میبنید که هیچ پارامتر ورودی نگرفته.
اینجا چند مدل کانستراکتور میبنید :
کد:
public class Member {


	Integer memberId;
	protected String name;
	private String[] borrowedBooks;
	public Integer signUpDate;
	public static int numberOfMembers;
	
	public Member(){
		
	}
	public Member(String name){
		this.name = name;
	}
	public Member(String name,Integer signUpDate){
		this.name = name;
		this.signUpDate = signUpDate;
	}
	
	// methods
}
همونطور که مشخصه برای ساخت کانتراکتور کافیه حوزه رو مشخص کنیم و اسم کلاس رو بنویسم.
میبینید که ما چند تا کانستراکتور داریم که همه ظاهرشون یکیه فقط پارامتر ورودیشون فرق می‌کنه. ممکنه چندتا متد هم داشته باشیم که اسم همه مثلا save یا register باشه، اما پارامترهای ورودی با هم فرق کنه. به این کار Over Loading میگن. هر کدوم از اون متدها ممکنه به یه درد بخورن و یه زمان خاصی فراخوانی بشن.
برگردیم سر کانستراکتور. ما الان می‌تونیم یه آبجکت از Member رو به صورت های مختلف بگیریم :
کد:
public class TestMember {


	public static void main(String[] args){
		Member salm = new Member();
		System.out.println("Salm's name is null : " + salm.name);
		Member tur = new Member("tooor");
		System.out.println("Tur used a constructor : "+ tur.name);
		Member iraj = new Member("Iraj", 1392);
		System.out.println("Iraj was the favorite son : " + iraj.name + ' '+ iraj.signUpDate);
		
	}
}

تفاوتشون رو متوجه میشید؟
توی دیفالت کانستراکتور میتونید کارهای زیادی بکنید، مقداردهی های اولیه و غیره.

اما یه چیزی رو دقت کردید؟ اینکه اسم فیلد با اسم پارامتر ورودی یکی بود. مثلا متد register یه رشته به نام name میگیره. ما از کجا بدونیم که توی متد وقتی مینویسیم name منظور فیلد کلاسه یا پارامتر ورودی؟! اگه دقت کرده باشید این موضوع رو با this کنترل کردیم. یعنی وقتی قراره به فیلد کلاس اشاره کنیم از this استفاده میکنیم.
وقتی مینویسم this.name = name سمت راست به پارامتر و سمت چپ به فیلد اشاره داره. و فقط هم برای آبجتکی که این متد رو فراخوانی کرده اعمال میشه یعنی در واقع this به اون آبجکت اشاره میکنه.

فکر کنم واسه امروزمون کافی باشه. جلسه بعد یه کم در مورد فرق انواع اولیه داده مثل int با کلاسهای متناظر مثل Integer صحبت می‌کنیم و بعدش یه کم در مورد پکج java.util حرف میزنیم.

(فریدون سه پسر داشت : سلم، تور و ایرج)
 

Drago

پیشکسوت فعال فناوری اطلاعات
کاربر ممتاز
توی این جلسه یه کم در مورد بعضی از کلاسهای موجود در پکج java.lang و java.util صحبت می‌کنیم.
================
پکج java.lang در واقع شامل تمام کلاس‌های اصلی جاوا است. مثلا کلاس Object در این پکجه و دقت داشته باشید که که تمام کلاس‌ها در جاوا ساب کلاس Object محسوب می‌شن!
غیر از کلاسی مثل آبجکت، کلاسهایی مثل مثل String، Integer و غیره هم توی پکج java.lang وجود داره. بزارید یه کم بیشتر توضیح بدیم.

توی جلسه قبلی متوجه چیزی نشدید؟ متغیر numberOfMembers نوعش int هست پس عدد صحیح میگیره. متغیر signUpDate هم عدد صحیح میگیره، اما با Integer. اولی نوع داده اولیه یا همون primitive است و دومی یک کلاس. درواقع وقتی می‌نویسم Integer signUpDate داریم یه آبجکت از کلاس Integer (یا درواقع java.lang.Integer) میگیریم.
اگه فیلد numberOfMembers رو فراخوانی کنیم ، مثلا بنویسیم salm.numberOfMembers و بعدش یه نقطه بزاریم هیچ اتفاقی نمیفته، هیچ متدی در اختیار شما قرار نمیگیره، چون از نوع اولیه است. اما اگه بنویسیم salm.signUpDate و بعد نقطه بزاریم به متدهای کلاس دسترسی پیدا می‌کنید : متدهایی مثل ()compareTo و ()doubleValue
اما خب چرا این کارو بکنیم؟ این متد‌ها به چه درد می‌خورن؟ type casting می‌دونید چیه؟ ما یه عدد اعشاری داریم و می‌خوایم تبدیل به عدد صحیح کنیم، یا از اون ساده تر، یه عدد long داریم و می‌خوایم به int تبدیل کنیم، باید چیکار کنیم؟
اصولا ما توی جاوا type casting رو به این صورت انجام می‌دیم، مثلا تبدیل int به fload :
کد:
float someValue = (float) someValue;
خب این کار بعضی وقت‌ها جواب می‌ده، اما جاوا به type casting خیلی حساسه. به راحتی اجازه این کار رو نمی‌ده. پس چرا دردسر بکشیم؟! یکی از متدهای کلاس Integer اسمش ()
floatValue است و کارش هم دادن مقدار float از همون متغیره.
اما اگه مقدار Float اون متغیر Integer رو بخوایم چی؟! (نگید که به بزرگ و کوچیک بودن حروف دقت نکردید...) کلاسهایی مثل Integer و Float یه سری متد استاتیک هم دارن برای تبدیل هر چیزی به اون کلاس. مثلا ما ممکنه یه استرینگ داشته باشیم که توش یه عدد صحیح نوشته شده باشه.با ()Integer.parseint میشه این کار رو کرد. امتحان کنید!
این موضوع موضوع جالبه، سعی کنید خوب بفهمیدش.

موضوع بعدی بعضی از کلاسهای پکج java.util هست.مثلا دیدید که ما در مثال قبل تاریخ رو یه Integer گرفته بودیم...مسخره نیست؟! کلاس Date یکی از کلاسهای این پکجه.
حالا ما می‌خوایم یه آرایه از کلاس Member داشته باشیم.باید چیکار کنیم؟ شاید اینطوری حدس بزنید :
کد:
Member[] membersList = {};
بله، از نظر تکنیکال امکان پذیره که همچین آرایه ای تعریف کنیم... اما حالا چجوری می‌خواید یه عضو به این آرایه اضافه کنید؟!
این کد رو ببینید :
کد:
Member[] membersList = {};
		membersList[0] = salm; // ArrayOutOfBoun***ception!
حتی به خونه 0 هم نمی‌تونید مقدار بدید! آرایه رو هم نمی‌خوایم (و اصلا درست هم نیست) که همون اول آرایه رو مقدار دهی کنیم.
یه کلاسی داریم به اسم ArrayList که آرایه است و متدهای خوبی هم داره :
کد:
	public static void main(String[] args){
		Member salm = new Member();
		Member tur = new Member("tooor");
		Member iraj = new Member("Iraj", 1392);
		ArrayList membersArray = new ArrayList();
		membersArray.add(salm);
		membersArray.add(tur);
		System.out.println("This guy is in the first index of array : "+membersArray.get(0));
		if(membersArray.contains(iraj)){ // .contains() returns boolean
			System.out.println("No iraj in array :(");
		}
		System.out.println("Size of Array is : " +membersArray.size());
		System.out.println("There was no iraj in array so no delete was done, so method returned =>"+membersArray.remove(iraj));
		System.out.println("There was a salm in array so it was removed and method returned =>"+membersArray.remove(salm));
		System.out.println("Size of Array is : " +membersArray.size());
		System.out.println("Now this guy is in the first index of array : "+membersArray.get(0));
		membersArray.clear();
		System.out.println("Size of Array after clear is : " +membersArray.size());
	}
توی مثال بالا بعضی از کاربردهای ArrayList رو میبینید.
اگه می‌خواستیم مثلا آرایه رو به همون روش سنتی تعریف کنیم و توی هر خونه آرایه یه آرایه داشته باشیم که توی هر خونه اش یه آرایه باشه(در واقع یه آرایه ۳ بعدی) باید چیکار میکردیم؟
[] [] []Member جواب می‌ده اما کنترل کردن و کار کردن باهاش کابوسه! به جاش اینو ببینید :
کد:
ArrayList thirdDimension = new ArrayList();
		ArrayList secondDimension = new ArrayList();
		ArrayList firstDimension = new ArrayList();
		secondDimension.add(thirdDimension);
		firstDimension.add(secondDimension);
که روی هر کدوم از این آرایه ها هم همه اون متدهای بالا رو در اختیار دارید.

--------------------------------------
دوتا نکته رو در مورد کلاسها بگم. توی کلاسها ما معمولا ۳ تا متد داریم که Override می‌کنیم. Override کردن یعنی سوپرکلاس ما یه متدی رو داره و ما میایم دوباره اون رو با یه عملیات دیگه تعریف میکنیم. اون ۳ تا متد equals و toString و hashCode هستن.
از hashCode میگذریم، اما اون دوتا متد دیگه خیلی لازم و مهمن.
equals میاد و دو تا آبجکت رو با هم مقایسه میکنه. مثلا ما مینویسیم (salm.equals(tur و جواب برمیگرده که false. اما چطور؟ بیاید متدش رو بنویسم :
کد:
public boolean equals(Object o){
		if(o instanceof Member){
			Member memberObject = (Member) o;
			if(memberObject.name == this.name 
		   	   && memberObject.memberId == this.memberId 
			   && memberObject.signUpDate == this.signUpDate){
				return true;
			}
		}
		return false;
	}
instanceof از معدود کلمات کلیدی دو قسمتی جاوا هست. اما کارش اینه که مشخص میکنه آیا o از نوع Member هست یا نه؟ این باعث میشه مشکلی برای type casting پیش نیاد چون بعدش ما آبجکت o رو به کلاس Member کست کردیم. همه کلاسهای جاوا متد equals رو دارند. مقایسه دوتا آبجکت با عملگر == روش خوبی نیست. برای عدد شاید به درد بخوره اما برای آبجکت نه.حتی ما استرینگ رو هم ترجیح می‌دیم با این روش مقایسه کنیم. دلیلش رو اگه وقت شد و حوصله بود براتون می‌گم اگه نه برید سرچ کنید : pass by reference java

متد بعدی toString هست. اگه مثال آرایه رو اجرا کرده باشید دیدید که وقتی گفتیم (0)memberArray.get انتظار داشتیم یه آبجکت از Member برگرده، اما وقتی چاپ شد یه چیزی شبیه core.Member@4cb162d5 چاپ شد. این در واقع به آدرس اون آبجکت توی حافظه داره اشاره میکنه! این قیافه به درد ما نمی‌خوره.می‌خوایم وقتی یه آبجکت از Member رو خواستیم چاپ کنیم به یه شکل مفید و به درد بخور چاپ بشه. برای این کار از toString استفاده میشه. ببینید:
کد:
public String toString(){
		return "Member : {" +
				"Name :"+ this.name+
				" Id :"+ this.memberId+
				" signUpDate:"+this.signUpDate+
				"}";
	}
میشد از بقیه فیلدها هم استفاده کرد ولی واقعا خسته ام! معمولا از همه‌ی فیلدهای کلاس استفاده می‌شه.
به کلاس Memberتون این دوتا متد رو اضافه کنید و دوباره اون مثال آرایه رو اجرا کنید ببینید چه فرقی می‌کنه.
===================
چندتا تمرین می‌دم بعد از اینکه جواب دادید HashMap رو می‌گم :
۱. متدی بنویسید که یک رشته به عنوان ورودی بگیرد و اگر اعدادی در آن رشته وجود دارد آنها را چاپ کند. (مثلا رشته "abcd 14 ef 5 gh 7" رو بگیره و 1457 رو چاپ کنه)
۲. متدی بنویسید که یک رشته به عنوان ورودی بگیرد و مجموع اعداد در آن رشته را چاپ کند (مثلا در مثال بالا باید عدد ۱۷ چاپ بشه)
۳.متدی بنویسید که یک رشته به عنوان ورودی بگیرد و کلمات تکراری را حذف کند و نتیجه را در خروجی چاپ کند.
 

Similar threads

بالا