سلام دوستان عزیز 
در این پست قصد دارم از چند تا مبحث برنامه نویسی پیشرفته جاوا صحبت کنم مثل : inheritance ، polymorphism ، abstract
البته قبل از مطالعه ی مطالب زیردو نکته وجود داره : اول ، توصیه می کنم فایل آموزش مقدماتی رو از لینک زیر دانلود کنید. دوم ، کد های جاوا در نرم افزار Eclipse نوشته شده .
لینک دانلود آموزش مقدماتی
Inheritance یا وراثت: در یک کلام وراثت یعنی کد نویسی کمتر
سیستم دانشگاه رو در نظر بگیر : دانشجو ، استاد ، کارکنان . هر کدوم از اینها یک موجودیت هستند که واسه خودشون نام ، فامیل ، آدرس ، شماره تلفن و .... دارن مثلا 30 خط کد نویسی می خواد. فقط دانشجو یه شماره دانشجویی داره که دو تای دیگه اونو ندارن میشه 31 خط ، استاد یه رتبه ی هیئت علمی داره که دانشجو و کارمند اونو ندارن باز 31 خط و کارمندان یه شماره کارمندی واسه خودشون دارن که باز میشه 31 خط کد نویسی پس این 30 خط بین همه مشترکه .
بنابراین اون خصوصیات و رفتار ها که بین هر سه تا مشترکه مثل نام و فامیل و آدرس و غیره میشه داخل یه کلاس مجزا به نام والد باشه به طوریکه بقیه این صفات و رفتار ها رو از اون به ارث ببرن.
پس یه تعریف دقیق از وراثت می تونه این باشه : اگه کلاس هایی داشته باشیم که دارای مشخصات و رفتار ها ی مشترکی باشند ، برای کد نویسی کمتر مشخصات و رفتار ها رو در قالب یه کلاس جدید به نام والد تعریف می کنیم ، به صورتی که کلاس های دیگه از اون مشتق بشن .
ابتدا پروژه جدید به نام sample ایجاد می کنیم . در پکیج پیش فرض سه کلاس به نام های student ، teacher ، Human رو ایجاد می کنیم اینها صرفا کلاس هستند یعنی تابع main ندارن . حالا یه کلاس به نام Tester که تابع main داشته باشه تعریف می کنیم .
حالا شروع به کد نویسی می کنیم ( روی اسم کلاس دو بار کلیک کنید خودش باز میشه) اول از کلاس Human شروع می کنیم : یه سری متغیر public داره و یه متد به نام print() که مقادیر رو چاپ می کنه .

کلاس student که مشتق شده از کلاس Human ( کلمه ی کلیدی extends یعنی مشتق شده از) و یه متغییر public به نام id داره .
کلاس teacher که مشتق شده از کلاس Human و متغییر public به نام Rank داره .
حالا می ریم سراغ Tester ، یه نمونه از کلاس student می سازیم به نام s1 واسه مقدار دهی اگه ctrl+space بزنیم یه پنجره باز میشه که می تونی متغییر ها و متد تعریف شده در کلاس Human رو مشاهده کنی علاوه بر اون متغییر تعریفی در student رو هم می بینی . چرا این اتفاق افتاده ؟ خیلی ساده ست چون student از Human مشتق شده .
از Tester اجرا می گیریم . ( راست کلیک و انتخاب گزینه ی Run Application ، معمولا دفعه ی اول اتفاقی نمی افته پس یه بار دیگه تکرار می کنید.)
همین طور که می بینی اسم و فامیل و آدرس رو چاپ کرد اما شماره دانشجویی رو نه . چرا ؟ چون متد print () تعریف شده داخل کلاس human فقط اسم و فامیل و آدرس رو برای چاپ قرار دادیم. برای حل این مشکل یه متد print() داخل کلاس student تعریف می کنیم که علاوه بر اسم و فامیل و آدرس ، id رو هم چاپ کنه.
حالا زمانی که تو کلاس Tester شی s1 از متد print() استفاده می کنه این متد id رو هم چاپ می کنه. ببینید :
خوب الان یه سوال پیش می آید : مگه قرار نشد برای کد نویسی کمتر از وراثت استفاده کنیم پس حالا چرا باز یه کد اضافه نوشتیم ؟
اگر متدی در کلاس والد تعریف شده باشه که در کلاس های فرزند کامل یا کارا نباشه با تعریف مجدد این متد در کلاس های فرزند کد اجرایی جدید به آن می دهیم چون این متد شکل جدید ازش ارائه شده بهش می گیم polymorphism .
حالا کنار متد print() کلاس student رو که نگاه کنی یه فلش سبز رنگ می بینی روش که کلیک کنی نوشته overrides یعنی متد print() یه شکل دیگه باز نویسی شده .
واسه ورود به مبحث بعدی باید چشماتو ببندی و داستانی رو که واست تعریف می کنم رو تصور کنی تو ذهنت : فرض کن یه تیم نرم افزاری داریم شامل 9 نفر ، قراره برای سیستم دانشگاه نرم افزار بنویسن . تو به عنوان مدیر پروژه این 9 نفر رو به 3 تا گروه سه نفری تقسیم می کنی و هرقسمت از نرم افزار را به یه گروه می دی تا براش کلاس و متد تعریف کنن .حالا امروز یه هفته گذشته و اعضا ی تیم قراره کارشون رو تحویل بدن .
گروه اول متد ADD داره واسه اضافه کردن ، متد del داره برای حذف و متد update داره . گروه دوم متد insert داره برای اضافه کردن ، متد remove داره و متد edit برای ویرایش . گروه سوم متد ezafe داره برای اضافه کردن ، متد hazfe داره ، متد verayesh و متد gozaresh داره . این متد ها رو هر گروه واسه خودش تعریف کرده همشونم درسته . اما تو به عنوان مدیر پروژه می گی این اسم ها و این مدل تعریف کردن ها رو نمی پسندی پس یه کلاس تعریف می کنی با متد هایی که می خوایی اما این متد ها رو پیاده سازی نمی کنی ، بعد می گی اینم یه استاندارد که همتون باید طبق این استاندارد پیش برین . بنابراین هر گروه از این کلاس استفاده می کنه و متد های اونو پیاده سازی می کنه . به این می گن abstract یا انتزاعی .
شاید تو هزار تا پروژه بنویسی اما یه بار هم از این روش استفاده نکنی چون به درد کار تیمی می خوره .
خوب بریم سراغ کد نویسی : همون کلاس human رو در نظر بگیر ، بیا یه متد اضافه کنیم بهش به نام add اما این بار جلوی متد سمی کالن بگذار چون نمی خوای داخلش چیزی بنویسی الان بهش ایراد می گیره ، می گه متد وقتی این شکلی تعریف می شه که abstract باشه آیا تو می خوای که این متد abstract باشه ؟ می گی بله . پس کنارش کلمه ی کلیدی abstract اضافه میشه . اما باز ایراد می گیره خوب این بار واسه چی ؟ می گه این متد باید کلاسش هم abstract باشه چرا نیست ،پس کلاس رو هم abstract می کنی . حالا اگه قرار باشه کلاس student متد add کلاس human را پیاده سازی کنه کنیم . باز ایراد می گیره تو که داری از کلاس abstract استفاده می کنی باید متد های این کلاس رو پیاده سازی کنی ، زود باش کد نویسی کن متد add رو ، تو هم مجبوری این کارو بکنی .( البته بگم می تونی خود کلاس student رو هم abstract تعریف کنی
)