آموزش زبان برنامه نویسی جاوا – جلسه چهارم
درود به همه همراهان آی تی پورت. در جلسات قبلی ما به مباحث انواع متغییر ها ، انواع عملگر ، ساختارهای کنترلی ، آرایه ها و برنامه نویسی شی گرایی پرداختیم که همچنان در بخش شی گرایی هستیم و در این جلسه به متدها ، خصوصیات ، Package و Object سازی و متد سازنده شی گرایی خواهیم پرداخت. در مورد یادگیری جاوا باید یک نکته به شما دوستان متذکر بشم که در جلسه ششم به بعد لازم است که شما با مفاهیم و اصول طراحی پایگاه داده آشنا باشید تا بتوانید با آموزش ها همراه باشید. از این رو و به علت اینکه بیشتر دوستان با این مباحث آشنایی ندارند ما در آی تی پورت آموزش اصول طراحی پایگاه داده را در آینده نزدیک شروع خواهیم کرد تا دوستان به مشکلی برنخورند.
متدها
در زبانهای برنامهنویسی شیگرا متدها همانند رفتارهای یک انسان عمل میکنند به طور مثال زمانی که شما به یک شخص سلام میدهید در اصل متد سلام شخص مقابل را صدا میکنید، و شخص مقابل جواب سلام شما را میدهد. در جاوا برای پیادهسازی متدها کافیست تا آنها را داخل کلاس درج کنید. به طور مثال:
class Amir { public void hello() { System.out.print("salam"); } public void bye() { System.out.print("khodahafez"); } }
همانطور که مشاهده میکنید امیر دارای دو متد سلام و خداحافظ است، حال زمانی که شخصی متد سلام امیر را اجرا میکند، امیر در خروجی سلام را چاپ میکند و زمانی که کسی متد خداحافظ امیر را صدا میکند، امیر در خروجی کلمه خداحافظ را چاپ میکند، شاید وجود کلماتvoid و public برای شما عجیب باشد ما در قسمتهای بعدی به توضیح در مورد کلمه void میپردازیم، و در قسمتهای آینده در مورد کلمه public توضیح خواهیم داد. متدها نیز همانند متغیرها میتوانند دارای مقدار باشند. void به معنای هیچ مقدار است و متدی کهvoid باشد نمیتواند مقداری را در خود ذخیره کند حال به مثال زیر توجه کنید.
class Amir { public int hello() { return 2; } }
بوسیله دستورreturn میتوان به متد hello مقدار داد اما توجه داشته باشید که این مقدار باید از نوع عددی باشد زیرا متد hello از نوع int است. متدها به خودی خود نمیتوانند اجرا شوند و حتماً باید آنها را صدا کرد. برای صدا کردن متد hello کافیست این دستورات را در متد main و یا سایر متدهای امیر بنویسید.
hello();
و یا می توانید از دستور ذیل استفاده کنید.
Amir.hello();
حال اگر متدی دارای مقدار باشد، مقدار آنرا می توان به این صورت چاپ کرد:
System.out.print(Amir.hello());
متدها میتوانند مقداری را نیز دریافت کنند به طور مثال:
class Amir { public void hello(String fname , String lname) { System.out.print("salam "+fname+" "+lname); } }
همانطور که در مثال بالا مشاهده میکنید متد hello دو ورودی lname و fname را دریافت میکند. این دو ورودی مشخص کننده نام و فامیل است. حال اگر شما نام و فامیل خود را به متد hello دهید به طور مثال:
hello("Amir","bahador");
متد hello برای شما این متن را چاپ میکند.
salam Amir bahador
متدها میتوانند دارای متغیر باشند، اما فراموش نکنید که از این متغیرها در متدهای دیگر نمیتوان استفاده کرد و فقط میتوان از این متغیرها در درون خود متد استفاده کرد به طور مثال:
class Amir { public void hello() { int i =3; } }
همانطور که مشاهده میکنید متد hello متغیرi را دارا میباشد اما از این متغیر در خارج از متد نمیتوان استفاده کرد. در یک کلاس میتوان چندین متد همنام داشت اما باید ورودی های آنها متفاوت باشد به طور مثال:
class Amir { public void hello(String name) { } public void hello(int number) { } }
همانطور که در بالا مشاهده میکنید دو متد همنام در یک کلاس وجود دارد اما ورودی های آنها با هم متفاوت است.
خصوصیات
خصوصیات کلاس دقیقاً همان متغیرهای کلاس هستند به طور مثال:
class Amir { String famil = "bahador"; }
همانطور که مشاهده میکنید کلاس امیر دارای خصوصیت famil است و این خصوصیت دارای مقدار بهادر است! خصوصیات کلاس، بر عکس متغیرهای متد دارای سطح دسترسی محدود نیستند و از آنها در همه جا میتوان استفاده کرد مگر خود برنامه نویس این سطح دسترسی را تغییر دهد که در قسمتهای آینده به آن میپردازیم، جالب است بدانید که این خصوصیات را میتوان از سطح متد تغییر داد به طور مثال:
class Amir { String age="70"; public void changeAge() { this.age = "20" ; } }
بعد از صدا کردن متد changeAge مقدار age برابر عدد ۲۰ میشود، کلمه this به معنای همین شی است.
Package ها
در تولید نرمافزار ما نیاز به کلاسهای زیادی داریم، گاهی اوقات این کلاسها باعث دردسر میشوند، بهترین راه برای دوری از این دردسر اینست که ما آنها را دسته بندی کنیم به طور مثال اگر شما یک کلاس باشید خانه شما package شما است ! مثال :
package tehran; class Amir { }
در این مثال همانطور که مشاهده میکنید Amir در درون tehran میباشد، Amir یک کلاس است و tehran یکpackage میباشد. این را به یاد داشته باشید که شما میتوانید کلاسهای دیگری در package مورد نظر قرار دهید، پس نتیجه میگیریم که در هرpackage میتوان چندین کلاس داشت! برای اینکه بتوانید از کلاسهای خارج از package جاری استفاده کنید میتوانید از دستور
import packagename.ClassName;
استفاده کنید به طور مثال:
package tehran; import esfehan.Farhad; class Amir { }
کلمه this
در قسمت های قبل ما از واژه ای بنام this استفاده کردیم این کلمه به معنای شی جاری میباشد و به برنامه نویس کمک میکند تا سطح دید خود را در برنامه مشخص کند به مثال زیر توجه فرمایید:
class Amir { int age = 3; public void showAge() { int age = 20; System.out.println(age); System.out.println(this.age); } }
همانطور که در این مثال مشاهده میکنید ما در کلاس Amir دو متغیر age را موجود داریم، age اول خصوصیت کلاس است و age دوم متغیر متد، با استفاده از کلمه this در داخل متد showAge ما به JDK اعلام میکنیم که متغیر مد نظر ما متغیر مربوط به کلاس است. خروجی متد قبل به شکل زیر است:
۲۰
۳
این نکته را به خاطر داشته باشید که میتوانیم به جای کلمه this از نام کلاس هم استفاده کنیم به طور مثال:
System.out.print(Amir.age);
Object سازی و متد سازنده
در دنیای واقعی شیسازی به معنای همانندسازی است، و این کار بسیار پیچیده و سخت است اما در برنامهنویسی این کار بسیار ساده است، فرض کنید کلاسی به نام Amir ساختهاید و حال میخواهید از این کلاس یک کپی ایجاد کنید، سوال این است که چرا ما این کار را میکنیم ؟ فرض کنید شما میخواهید دست امیر را قطع کنید، اگر این کار را بر روی Amir انجام دهید Amir یک دست خود را از دست میدهد، و کلاس Amir صدمه میبیند، حال اگر از Amir همانند سازی کنید و نام همانند او را Amir2 قرار دهید میتوانید دستAmir2 را قطع کنید بدون آن که به Amir صدمهای وارد شود. به این عمل Object سازی گفته میشود. ما در مثال زیر دو کلاس را تعریف میکنیم یک کلاس همان کلاس امیر است و کلاس دوم کلاس Fact نام دارد و کار این کلاس Object سازی از امیر است !
class Amir { int age=20; } class Fact { public static void main (String [] arg) { Amir amir2 = new Amir(); Amir amir3 = new Amir(); amir2.age=30; System.out.print(amir2.age); // 30 System.out.print(amir3.age); // 20 } }
همانطور که مشاهده کردید متغیر age در امیر واقعی تغییری نکرد و متغیر amir2 تغییر کرد. حال بیایید در مورد دستور Amir amir2 = new Amir(); بیشتر کنجکاوی کنیم. آیا این دستور برای شما آشنا نیست ؟
String name = "ali";
همانطور که در گذشته توضیح داده شد این دستور متغیری از نوعString ایجاد و مقدار آن را برابر ali قرار می داد. حال میتوانید متغیر name را به این شکل نیز ایجاد کنید.
String name = new String("ali");
دلیل این امر آن است که بر خلاف آنچه که آموختید نوع String در واقع وجود ندارد. String یک کلاس است و شما در اصل با این روش از کلاسString ، Object سازی میکنید. در صورتی که میخواهید برای سایر متغیرهای جاوا این عمل را انجام دهید باید از کلاسهای مورد نظر استفاده کنید به طور مثال به جای نوع متغیر int میتوانید از کلاس Integer استفاده کنید مثال:
Integer num = new Integer(3);
در این روش یک مزیت وجود دارد و آن مدیریت حافظه بر روی اشیا میباشد. یعنی در صورتی که به جای نوع int از کلاس Integer استفاده کنید، جاوا در صورت استفاده نکردن شما از شی مورد نظر آن را از سطح حافظه حذف خواهد کرد.
حال بیایید به شیسازی از کلاس Amir برگردیم، همانطور که مشاهده کردید ما با استفاده از دستور Amir amir2 = new Amir(); موجودی به نام amir2 خلق کردیم که از نوع کلاس Amir میباشد. شاید استفاده از دستورAmir() برایتان عجیب باشد این دستور متدی بنام متد سازنده کلاس را صدا میکند. به مثال زیر توجه کنید:
class Amir { int age; public Amir(int age) { this.age = age; } } class Fact { public static void main (String [] arg) { Amir amir2 = new Amir(34); System.out.print(amir2.age); // 34 } }
متد سازنده به صورت اختیاری از طرف برنامه نویس تعریف میشود، این متد نوعی ندارد یعنی حتی void هم نیست نام این متد همنام نام کلاس است. این متد به برنامه نویس این امکان را میدهد تا زمانی که از کلاس، شیسازی میکند مقادیری را به آن ارسال کند. همان طور که در مثال بالا مشاهده کردید ما متغیر age را در هنگام شیسازی مقداردهی کردیم. متدهای سازنده همانند متدهای معمولی میتوانند تکراری باشند اما فراموش نکنید که باید امضای متدهای سازنده با هم تفاوت داشته باشد. پس نتیجه میگیریم زمانی که از دستور new Amir() استفاده میکنیم در اصل متد سازنده کلاس را صدا میزنیم، این نکته را فراموش نکنید، در صورتی که کلاس مورد نظر متد سازنده را دارا نباشد مشکلی در برنامهنویسی پدیدار نمیشود و خود جاوا یک متد سازنده نامرئی را برای شما پیادهسازی میکند. به یاد داشته باشید متد سازنده باعث بارگذاری کلاس در سطح RAM میشود، بنابراین باید در این متد سعی کنید تا از دستورات حجیم استفاده نکنید زیرا باعث کندی عمل شیسازی میشود.
ممنون که به فکر اطلاعات پایه ای ما هستید 🙂
منتظر آموزش های شما هستیم .
خواهش می کنیم
سعی مون بر این است که بهترین آموزش رو به شما همراهان آی تی پورت ارائه کنیم 🙂
سلام سایت قشنگد دارید اگه مایل هستید تبادل لینک کنیم؟
http://www.ithi.ir
منتظر شما هستیم…
سلام،عالی بود
من کتاب ها و سایت های زیادی رو برای یادگیری جاوا خوندم،اما با جرات میتونم بگم که بهترین آموزش رو توسایت شما پیدا کردم،واقعا ممنونم …
لطفا ادامه بدید …