آموزش شی گرایی در جاوا ، در قسمت سوم آموزش برنامه نویسی اندروید ، مبحث برنامه نویسی جاوا یا زبان جاوا برای اندروید را ادامه می دهیم و بیشتر با برنامه نویسی جاوا و مبحث شی در گرایی جاوا که دارای زیر شاخه های بسیار مهمی چون ارث بری میباشد آشنا خواهیم شد و مباحثی چون سطح کنترل و override و .. را نیز توضیح خواهیم داد که در برنامه نویسی جاوا و در ادامه برنامه نویسی اندروید بسیار کار آمد خواهد بود.
توجه : برای مشاهده تصاویر در سایز های اصلی بر روی آنها کلیک کنید
در دنیای واقعی یک شی جدای از دیگر اشیاء می تواند وجود داشته باشد ، با دیگر اشیاء تعامل داشته باشد و حتی چند شیئ با یکدیگر ادغام شده تا شی جدیدی را بوجود آورند. در واقع برنامه نویسی جاوا به منزله شروع کار با Object ها یا همان اشیاء در این زبان برنامه نویسی خواهد بود. از اینجای آموزش به بعد خواهیم دید که چه طور می توان یک Object با خصوصیات منحصر به فردی ایجاد کرده و همچنین خواهیم دید که به چه نحوی می توان آن شی را در دیگر جاهای برنامه خود مورد استفاده قرار داد. در حقیقت اگر یک برنامه نوشته شده در جاوا را به منزله تعدادی Object در نظر بگیریم که در کنار یکدیگر قرار گرفته اند تا یک Object بزرگ تر از خود را که کار خاصی را می تواند انجام دهد بسازد (یک برنامه) ، به سهولت خواهیم توانست Object ها را در یک زبان برنامه نوسی شیئ گرا درک کنیم.
در واقع با ساخت یک شی در برنامه خود ، خواهیم توانست آن شی را به هر تعداد دفعه که بخواهیم مورد استفاده قرار دهیم و یا حتی چنانچه نیاز به تغییری در یکی از Attribute ها یا همان خصوصیات شی خاص داشته باشیم ، صرفاً با اعمال تغییر در آن شی به خصوص تغییر اعمال شده در کل برنامه لحاظ خواهد شد. از سوی دیگر با ایجاد Object ها در یک برنامه کامپیوتری امکان Debug کردن یا مشکل یابی نیز برای ما راحت تر خواهد شد چرا که بجای درگیر کردن خود با کل پروژه ، صرفاً می توانیم Object یی که به آن مشکوک هستیم را Debug کنیم.
در حقیقت یک شی در زبان برنامه نویسی شی گرا دارای دو چیز تحت عنوان Attribute و Behavior میباشد. به طور خلاصه Attributrها عبارتند از ویژگی هایی که یک شی را از شی دیگر در برنامه متفاوت میسازند. منظور از Behavior ها همان کارهایی است که یک object میتواند انجام دهد. در زبان برنامه نویسی جاوا (شی گرایی در جاوا) object ها با استفاده از یک Class ایجاد میشوند. در حقیقت یک Class دربرگیرنده کلیه Attributeها و Behavior هایی است که یک object خواهد داشت.
public class MyClass { int number = 1; public void showSomething() { System.out.println("This is my method " + number + " created by me."); } }
همانگونه که مشاهده میکنید کلاسی با نام MyClass با سطح کنترل public ایجاد کرده ایم برای توضیح سطوح کنترل میتوان گفت در حقیقت با قرار دادن کلید واژه public پیش از یک کلاس، متد و یا متغیر این دستور را به برنامه خود می دهیم که این کلاس ، متد و یا متغیر در دیگر بخش های برنامه و توسط دیگر کلاس ها قابل دسترسی است. به عبارت دیگر از هر جای دیگر برنامه من جمله بخش های دیگر همان کلاس ، دیگر پکیج ها ، کلاس های ارث بری شده از آن می توان به عناصر public دسترسی داشته و در صورت لزوم تغییری در آن ها ایجاد کرد.
کلید واژه protected حاکی از آن است که عنصری که این کلید واژه قبل از آن قرار گرفته است در همان کلاس، دیگر پکیج ها و کلاس های ارث بری شده از آن قابل دسترسی خواهد بود. کلید واژه private این معنا را می رساند که مثلا متغیری که private است فقط و فقط در همان کلاس قابل دسترسی خواهد بود.
حال زمانیکه هیچ کلید واژه محدود کننده ای قبل از نام یک کلاس، متد و یا متغیر نباشد، این سطح دسترسی Package Access نامیده می شود و بدان معنا است که عنصری که فاقد هرگونه public, protected, private باشد در همان کلاس و یا دیگر کلاس های موجود در همان پکیج قابل دسترسی خواهد بود.
سپس یک Attribute که با استفاده از متغیر ها ایجاد میشود تعیین کرده و مقدار داده ایم و در انتها نیز یک Behavior برای کلاس ایجاد میکنیم که مقادیر رشته ای و مقدار متغیری که تعریف شد را در خروجی نمایش میدهد.
پس از تکمیل کلاس همانگونه که گفته شد باید یک شی از این کلاس در main برنامه ایجاد کرد و از آن طریق به خصوصیات این کلاس دسترسی پیدا کرد چون کامپایلر برنامه main را به عنوان نقطه شروع در نظر میگیرند پس در main برنامه نیز چنین کد نویسی میکنیم
public class MySecondClass { public static void main(String[] args) { MyClass newObject = new MyClass(); newObject.showSomething(); } }
ارث بری یک مبحث از شی گرایی در جاوا یا شی گرایی در اندروید است که در ادامه به آن می پردازیم :
ارث بری در جاوا ، در حقیقت در برنامه نویسی گاهی برنامه نویسان مجبور هستند Object های متفاوتی ایجاد کنند. در همین حین ممکن است برخی از Object ها خصوصیاتشان مشابه برخی دیگر Object ها باشد. حال اگر برنامه نویس بخواهد تک تک این Object ها را ایجاد کند و خصوصیات یکسانشان را نیز برای هر کدام تعریف کند، اگر در حین نوشتن پروژه بخواهد تا تغییری در برخی خصوصیات Object ها اعمال کند، مجبور است تا کلیه Object ها را بازنویسی کند و در همین جا است که یکی از بهترین ویژگی های زبان برنامه نویسی جاوا که یک زبان برنامه نویسی شئ گرا است را می تواند مورد استفاده قرار داده تا دیگر مجبور نباشد در صورت بروز یک تغییر، کل خصوصیات و یا رفتارهای Object های ایجاد شده را بازنویسی کند. در حقیقت این ویژگی Inheritance یا “به ارث بردن” نام دارد.
به طور خلاصه اگر برنامه نویس بخواهد یک Object ایجاد کند که تمامی و یا برخی از ویژگی های یک Object دیگر را داشته باشد می تواند از قابلیت ارث بری در زبان برنامه نویسی جاوا استفاده کند. در ضمن اگر برنامه نویس بخواهد تا یک Object کلیه ی ویژگی های Objectدیگری را به ارث برد به جز یک ویژگی که می بایست تغییر کند، این کار از طریق وراثت باز هم امکان پذیر است. از سوی دیگر وراثت سلسله مراتبی نیز امکان پذیر است.
فرض کنیم که ما سه Object داریم به طوریکه Object شماره دو از Object شماره یک ارث بری می کند وObject شماره سه از Object شماره دو. در واقع Object شماره سه نه تنها از ویژگی هایObject شماره دو برخوردار خواهد بود، بلکه از آنجا که Object شماره دو از Object شماره یک ارث بری می کند، Object شماره سه ویژگی های Object شماره یک را نیز در بر خواهد داشت. در این مثال Object شماره یک به عنوان Superclass یا “کلاس اصلی” تلقی می شود و Object های شماره دو و سه به عنوان Subclass یا “کلاس زیرشاخه” تلقی خواهند شد. جالب است بدانیم که در مثال فوق اگرچه که Object شماره دو برای Object شماره یک به عنوان یک Subclass تلقی می شود اما این در حالی است که برای Object شماره سه به عنوان یک Superclass مد نظر قرار داده می شود. این رابطه به خوبی در تصویر زیر قابل مشاهده است
Override مبحث دیگری از شی گرایی در جاوا ( شی گرایی در اندروید ) است که در ادامه به آن می پردازیم :
مفهوم Override بدین معنی است که مثلا در کلاسی که از کلاس دیگر ارث بری میکند برای استفاده از متدها و متغیر ها و .. مربوط به superclass یا کلاس اصلی درون subclass یا زیر کلاس باید از Override کردن استفاده کنیم بدین صورت که قبل از مثلا متد عبارت @Override را ذکر کرده سپس نام و سطح کنترل متد را تایپ کرده و بدنه جدیدی برای متد ایجاد میکنیم مانند مثال زیر که کلاس Father از کلاس GrandFather با استفاده از کلمه کلیدی extends ارث بری میکند و از متد آن هم استفاده میکند
public class Grandfather { public void showGrandfatherBehavior() { String behavior = "Angry"; System.out.println(behavior); } public void showGrandfatherCreativity() { String creativity = "Very Creative"; System.out.println(creativity); } } public class Father extends Grandfather { @Override public void showGrandfatherBehavior() { String behavior = "Well=behaved"; System.out.println(behavior); } @Override public void showGrandfatherCreativity() { String creativity = "Creative"; System.out.println(creativity); }
Constructor یکی دیگر از مباحث شی گرایی در جاوا است که در ادامه به آن می پردازیم :
چنانچه بخواهیم به طور خلاصه بگوییم که Constructor چیست، بایستی گفت که یک Constructor همانند یک متد است با این تفاوت که نام آن دقیقاً با نام کلاس یکی بوده و از سوی دیگر به هیچ وجه نمی تواند داده ای را return کند واقعیت دیگری که در مورد Constructor ها صدق میکند این است که یک Constructor می تواند هیچ پارامتری نداشته باشند، یک پارامتر داشته و یا حتی بیش از یک پارامتر داشته باشد.
در واقع زمانیکه ما یک شی از روی کلاس خود می سازیم ، Constructor آن کلاس فرا خوانده می شود. کار این Constructor این است که Field های آن شیئ جدید را Initialize کرده یا به عبارت دیگر آغاز کند. نکته ای که در اینجا می بایست حتما مد نظر قرار داده شود این است که ما برای ساخت یک شیئ جدید از روی یک کلاس نیاز به یک Constructor داریم و اگر ما این Constructor را ننویسیم ، خودCompiler در حین ساخت شی جدید یک Constructor که فاقد هرگونه پارامتری باشد را برای ما در حین Compile شدن خواهد ساخت. این Constructor تحت عنوان Default Constructor یا Constructor پیش فرض شناخته می شود. کاری که این Constructor انجام می دهد این است که کلیه متغیرهای Field را با مقدار اولیه Default فرا می خواند)مقدار اولیه صفر برای متغیر های عددی , مقدار False برای متغیر های Boolean و مقدار null برای مواردی همچون string)
حال اگر ما Constructor برای کلاس خود طراحی کنیم Compiler هیچکونه Constructor یی از جنش Default به صورت خودکار نخواهد ساخت و Constructor ما را مورد استفاده قرار میدهد.
مانند مثال زیر:
public class MyClass { String name; int age; boolean trueOrFalse; MyClass() { name = null; age = 0; trueOrFalse = false; } }