آموزش جاوا (فصل ۱۰)
نحوۀ تعریف متد در زبان برنامهنویسی جاوا
در آموزش مقدمهای بر مفهوم شیئگرایی در زبان برنامهنویسی جاوا گفتیم که هر کلاس در زبان برنامهنویسی جاوا دارای یکسری Attribute و Behavior میباشد که با ساخت آبجکت از روی آن میتوانیم به اتریبیوتها و متدهای مورد نظر خود دسترسی پیدا کنیم. به طور مثال، فرض کنیم که در کلاسی با استفاده از دیتا تایپ int
متغیری تعریف کرده و مقداری از جنس عدد صحیح را بدان منتسب کردهایم. در واقع، اين متغير به منزلۀ یک اتریبیوت برای کلاس مذکور بوده و با ساخت آبجکت از روی این کلاس میتوان بدان دسترسی داشت. از سوی دیگر، متدهای موجود در کلاس به منزلۀ Behavior یا «عملکرد» کلاس مذکور بوده و هر یک بخشی از عملکرد تعریفشده برای آن کلاس را شامل میشوند.
در این آموزش قصد داریم تا به بررسی نحوۀ تعریف متدها پرداخته و ببینیم که چگونه میتوان با ساخت آبجکت از روی کلاس مد نظر، به متدهای تعریفشده در آن دسترسی داشته و آنها را فراخوانی نمود (البته تا به این بخش از آموزشها بارها و بارها متدهایی را مورد استفاده قرار داده و آنها را فراخوانی کردهایم که از آن جمله میتوان متد ()print
را نام برد که این وظیفه را دارا است تا هر آنچه که به عنوان آرگومان ورودی دریافت میکند را در بخش کنسول نمایش دهد.)
به طور کلی، نحوۀ تعریف یک متد در زبان جاوا تا حدودی مشابه تعریف کلاسها است به طوری که برای هر دو میتوان یک Modifier یا «سطح دسترسی» تعریف کرد که این سطح دسترسیها عبارتند از public
،private
و غیره که در آموزش آشنایی با انواع سطوح دسترسی در زبان برنامهنویسی جاوا با جزئیات بیشتری به بررسی کاربرد هر یک پرداختهایم. به علاوه، از جمله دیگر مشابهتهای تعریف کلاس و متد میتوان به نحوۀ تعریف بلوک مربوط به هر یک اشاره کرد به طوری که در هنگام تعریف بدنۀ مربوط به هر دو میباید از علائم { }
استفاده نماییم که در داخل این علائم نیز وظیفۀ مورد انتظار از متد مربوطه را مینویسیم تا در هنگام فراخوانی، تَسک محوله را انجام داده و داده یا مقداری را در خروجی ریترن کند که این مقدار در نتیجۀ فراخوانی یک متد میتواند مقادیری همچون دادهای با دیتا تایپ int
،double
و غیره یا آبجکتی از یک کلاس باشد (توجه داشته باشیم که تمامی متدها لزوماً مقداری را در خروجی ریترن نمیکنند و ممکن است صرفاً عملیاتی را انجام دهند که چنین متدهایی اصطلاحاً از نوع void
میباشند.)
حال برای درک بهتر نحوۀ تعریف و فراخوانی یک متد، پروژۀ جدیدی تحت عنوان Methods ساخته و یک کلاس به نامMainClass
در آن ایجاد میکنیم و در ابتدا کدی به صورت زیر خواهیم داشت:
public class MainClass {
}
در ادامه، با استفاده از دیتا تایپ int
متغیری تحت عنوان price
با مقدار اولیۀ 20000000 ایجاد کرده و همچنین آبجکتی از روی کلاس String
به نام laptopName
تعریف کرده و استرینگ «Laptop Name Is Lenovo» را بدان اختصاص میدهیم به طوری که داریم:
public class MainClass {
int price = 20000000;
String laptopName = "Laptop Name Is Lenovo";
}
حال متدی تعریف میکنیم تا در صورت فراخوانی، مقادیر اختصاصیافته به متغیرهای فوق را در پنجرۀ کنسول نمایش دهد که برای این منظور کد فوق را به صورت زیر تکمیل میکنیم:
public class MainClass {
int price = 20000000;
String laptopName = "Laptop Name Is Lenovo";
public void showData() {
System.out.println(laptopName + " and its price is " + price);
}
}
در واقع، هر متد از دو بخش تشکیل شده است که عبارتند از Signature و Body که در مثال فوق بخش Signature با کلیدواژۀ public
شروع شده است بدین معنی که متد مذکور از تمامی نقاط برنامه در دسترس است سپس کلیدواژۀvoid
را نوشتهایم و بدین معنی است که متد ()showData
در صورت فراخوانی دیتایی را در خروجی ریترن نمیکند بلکه صرفاً دستوری مبنی بر نمایش یک استرینگ را اجرا مینماید.
در ادامه نام متد را showData
تعریف کردهایم و همانطور که در آموزشهای پیشین توضیح دادیم، نحوۀ نامگذاری متدها بدین شکل است که کلمۀ اول در نام متد میباید یک فعل باشد چرا که متدها وظیفۀ انجام کاری را بر عهده دارند و از همین روی بهتر است تا در نامگذاری آنها نامی را انتخاب نماییم که با وظیفۀ محولشده به متد مذکور همخوانی داشته باشد سپس دو پرانتز به صورت ( )
مقابل نام متد قرار داده که به منظور فراهم کردن قابلیت تعریف پارامتر ورودی برای متد مربوطه مورد استفاده قرار میگیرند. در واقع، تعریف پارامتر ورودی برای یک متد منجر بدین میشود تا در هنگام فراخوانی متد مذکور و در صورت لزوم بتوانیم دیتای مورد نظر را به عنوان ورودی به آن پاس دهیم (در آموزش نحوۀ تعریف متدهایی با پارامتر ورودی در زبان برنامهنویسی جاوا مفهوم پارامتر ورودی و همچنین نحوۀ پاس دادن آرگومان ورودی به یک متد را تشریح نمودهایم.)
به علاوه، در این آموزش و در حین فراخوانی متد ()showData
قرار نیست تا دادهای را به عنوان ورودی به آن پاس دهیم و از همین روی در تعریف متد مذکور داخل علائم ( )
چیزی را به عنوان پارامتر ورودی تعریف نمیکنیم.
در ادامه، بلوک مربوط به بدنۀ متد را با علائم { }
تعریف کرده و داخل آن دستوراتی را تعریف میکنیم که قصد داریم تا در صورت فراخوانی این متد اجرا شوند. همانطور که در کد فوق ملاحظه میکنیم، بدنۀ متد ()showData
حاوی یک دستور مبنی بر چاپ مقادیر منتسب به متغیرهای laptopName
و price
به همراه استرینگهای مربوطه میباشد.
در این مرحله میتوان گفت که موفق شدهایم تا متدی تعریف نماییم که در صورت فراخوانی، استرینگی را در پنجرۀ کنسول نمایش میدهد. حال جهت فراخوانی این متد نیاز است تا در ابتدا آبجکتی از روی کلاس مربوطه ساخته و بدین ترتیب متد ()showData
را روی آن فراخوانی کنیم و برای این منظور میباید یک کلاس جدید تحت عنوان ActionClass
ایجاد کرده و آن را نقطۀ شروع برنامۀ خود قرار دهیم و همانطور که در آموزشهای پیشین اشاره کردیم، این کار با زدن تیک گزینه public static void main در حین ساخت کلاس مد نظر امکانپذیر میباشد به طوری که در ابتدا کدی به صورت زیر خواهیم داشت:
public class ActionClass {
public static void main(String[] args) {
}
}
در ادامه، به روش زیر آبجکتی از روی کلاس MainClass
داخل کلاس ActionClass
میسازیم:
public class ActionClass {
public static void main(String[] args) {
MainClass myObject = new MainClass();
}
}
در کد فوق، برای ساخت آبجکت از روی کلاس MainClass
ابتدا نام کلاس را نوشته سپس نامی برای آبجکت مورد نظر انتخاب میکنیم و در ادامه کیورد new
را نوشته و مجدداً نام کلاس MainClass
را مینویسیم و در نهایت علائم ;()
را قرار میدهیم. بدین ترتیب به کامپایلر جاوا دستور میدهیم تا آبجکتی از روی کلاس MainClass
ساخته و با استفاده از عملگر =
آن را به myObject
منتسب نماید.
همانطور که پیشتر اشاره کردیم، با ساخت آبجکت از روی یک کلاس میتوانیم متدهای تعریفشده در آن را روی آبجکت مذکور فراخوانی نماییم و از همین روی میتوانیم متد ()showData
را روی آبجکت myObject
فراخوانی کنیم که برای این منظور کد فوق را به صورت زیر تکمیل مینماییم:
public class ActionClass {
public static void main(String[] args) {
MainClass myObject = new MainClass();
myObject.showData();
}
}
همانطور که مشاهده میکنیم، برای فراخوانی متد ()showData
ابتدا نام آبجکت جدید ساختهشده از روی کلاس را نوشته سپس یک .
قرار داده و در ادامه نام متد تعریفشده در کلاس مذکور را مینویسیم سپس علامتهای ;()
را در انتهای نام متد قرار میدهیم که با اجرای برنامۀ فوق در خروجی خواهیم داشت:
Laptop Name Is Lenovo and its price is 20000000
همانطور که میبینیم، با اجرای برنامه متد ()showData
فراخوانی شده و مقادیر منتسب به متغیرهای تعریفشده در کلاس MainClass
را به همراه استرینگهای مربوطه در کنسول چاپ مینماید. دانلود فایلهای تمرین
آشنایی با انواع سطوح دسترسی در زبان برنامهنویسی جاوا
در این آموزش سطوح دسترسی مختلف در زبان برنامهنویسی جاوا را معرفی کرده و کاربرد هر یک در کنترل سطح دسترسی به کلاسها، متغیرها و متدها را مورد بررسی قرار میدهیم. در واقع، مبحث سطوح دسترسی به هر یک از کلاسها، متغیرها و متدها به طور خاص در پروژههایی که توسعۀ آنها به صورت تیمی انجام میشوند از اهمیت بسیار بالایی برخوردار میباشد.
حال به منظور درک بهتر مفهوم و همچنین کاربرد سطوح دسترسی، شرایطی را در نظر میگیریم که در آن فرض میکنیم که قرار است تا به عنوان سرپرست گروهی از برنامهنویسان روی طراحی یک نرمافزار کار کرده و وظیفۀ کنترل سطح دسترسیِ اعضای تیم به کلاسها، متغیرها و متدهایی متناسب با وظایفشان را داریم. در عین حال، فرض میکنیم که آشنایی زیادی در رابطه با نحوۀ کنترل سطح دسترسی در زبان برنامهنویسی جاوا نداریم که در چنین شرایطی برای مثال ممکن است یکی از اعضای تیم در حین کار بر روی پروژه به برخی از متغیرها دسترسی داشته و بدون هیچ سوءقصدی مقدار اولیۀ آنها را تغییر دهد که در این صورت خروجی حاصل از پروژه به نتیجهای غیرقابلباور تبدیل خواهد شد!
به طور کلی، در زبان برنامهنویسی جاوا با استفاده از کلیدواژگان public
،protected
و private
در کنار نام کلاس، متد یا متغیر مورد نظر خود میتوانیم سطوح دسترسی آنها را مشخص سازیم به علاوه اینکه سطح دسترسی دیگری در زبان جاوا تعريف شده است که در صورت ذکر هيچ یک کلیدواژههای مطرحشده در بالا، کامپایلر جاوا به صورت پیشفرض سطح دسترسی Package را برای کلاس، متد یا متغیر مربوطه در نظر میگیرد که در ادامه به بررسی نحوۀ عملکرد هر یک از این سطوح دسترسی میپردازیم.
ذکر کلیدواژۀ public
پیش از نام یک کلاس، متد یا متغیر بدین معنی است که کلاس، متد یا متغیر مذکور در دیگر بخشهای برنامه و همچنین از سایر کلاسهای تعریفشده در پروژه قابلدسترسی میباشد. به عبارت دیگر، از تمامی نقاط برنامه همچون بخشهای دیگر همان کلاس، سایر پکیجها، کلاسهای ارثبری شده از آن میتوان به اِلِمانهایی با سطح دسترسی public
دسترسی داشته و در صورت لزوم تغییری در آنها ایجاد کرد.
استفاده از کلیدواژۀ protected
در کنار نام یک کلاس، متد یا متغیر حاکی از آن است که اِلِمان مورد نظر در همان کلاس، دیگر پکیجهای پروژه و همچنین کلاسهای ارثبری شده از آن قابلدسترسی میباشد.
بهکارگیری کلیدواژۀ private
در کنار نام یک کلاس، متد یا متغیر نیز بدین معنی است که اِلِمان مورد نظر صرفاً همان کلاس قابلدسترسی میباشد.
در نهایت، در صورتی که هیچ کلیدواژهای در کنار نام یک کلاس، متد یا متغیر نوشته نشود، زبان برنامهنویسی جاوا به صورت پیشفرض سطح دسترسی Package را برای اِلِمان مربوطه در نظر میگیرد بدین معنی که کلاس، متد یا متغیر مذکور در کلاس متناظرش و همچنین در دیگر کلاسهای موجود در پکیج مربوطه قابلدسترسی میباشد.
حال به منظور یادگیری بهتر نحوۀ کارکرد سطوح دسترسی در زبان جاوا، خلاصهای از مطالب فوقالذکر را در قالب جدولی به صورت زیر آوردهایم:
Others | Subclass | Package | Class | |
✔ | ✔ | ✔ | ✔ | public |
– | ✔ | ✔ | ✔ | protected |
– | – | ✔ | ✔ | Package |
– | – | – | ✔ | private |
اکنون برای درک بهتر کاربرد کلیۀ سطوح دسترسی در قالب مثالی کاربردی، نیاز داریم تا سناریویی تعریف کرده و بر اساس آن برنامهای را پیادهسازی نماییم. در همین راستا، دو کلاس داخل یک پکیج ایجاد میکنیم و برای یکی از آنها محدودیت دسترسی بیشتری نسبت به کلاس دیگر تعریف میکنیم. در همین راستا، در آیدیای اکلیپس پروژهای تحت عنوان AccessControl ایجاد کرده و در آن کلاسی به نام MainClass
میسازیم. همچنین در حین ساخت کلاس توجه داشته باشیم که پیش از زدن دکمۀ Finish میباید در فیلد مربوط به Package یک نام برای پکیج خود انتخاب کنیم که در این آموزش نام دلخواه MainPackage را مد نظر قرار دادهایم. به علاوه، به منظور انتخاب کلاس MainClass
به عنوان نقطۀ شروع برنامۀ خود در حین ساخت کلاس لازم است تا تیک گزینۀ public static void main را بزنیم به طوری که در ابتدا کدی به صورت زیر خواهیم داشت:
package MainPackage;
public class MainClass {
public static void main(String[] args) {
}
}
همانطور که ملاحظه میکنیم، در سطر اول از کد فوق نام پکیج مورد نظر نوشته شده است. حال اقدام به ایجاد کلاسی دیگر تحت عنوان SecondClass
میکنیم و این کلاس قرار نیست تا نقطۀ شروع برنامه باشد لذا گزینۀ public static void main را تیک نمیزنیم و از همین روی کد مربوط به SecondClass
در ابتدا به صورت زیر خواهد بود:
package MainPackage;
public class SecondClass {
}
حال میخواهیم تا کلاس MainClass
را به گونهای تعریف کنیم تا یکسری از خصوصیات کلاس SecondClass
را به ارث ببرد و از همین روی کد مربوط به MainClass
را به صورت زیر بازنویسی میکنیم:
package MainPackage;
public class MainClass extends SecondClass {
public static void main(String[] args) {
}
}
در ادامه، یکسری اتریبیوت و متد برای SecondClass
به صورت زیر تعریف میکنیم:
package MainPackage;
public class SecondClass {
static int number = 123;
public static void testMethod() {
System.out.println(number);
}
}
در کد فوق، ابتدا یک متغیر استاتیک با استفاده از دیتا تایپ int
تحت عنوان number
با مقدار اولیۀ 123 تعریف کرده سپس متدی به نام ()testMethod
ایجاد کردهایم که این وظیفه را دارا است تا در صورت فراخوانی، مقدار منتسب به متغیر number
را با استفاده از متد ()println
در کنسول چاپ نماید (البته این کلاس را نمیتوان اجرا کرد چرا که نقطۀ آغازین یا همان متد ()main
را ندارد. به علاوه، جهت کسب اطلاعات بیشتر در رابطه با متغیرهای استاتیک به آموزشآشنایی با کلیدواژۀ static و کاربردهای آن در قالب پروژۀ ثبتنام متقاضیان در باشگاه در زبان جاوا مراجعه نمایید.)
اکنون در کلاس MainClass
متد ()testMethod
را فراخوانی میکنیم و از آنجایی که کلاس MainClass
از کلاسSecondClass
ارثبری میکند، نیازی به ساخت آبجکت جدید از روی کلاس دوم نداشته و به سادگی میتوانیم متد()testMethod
را در آن فراخوانی کنیم و بدین ترتیب کد کلاس MainClass
به صورت زیر خواهد بود:
package MainPackage;
public class MainClass extends SecondClass {
public static void main(String[] args) {
testMethod();
}
}
حال اگر برنامۀ فوق را اجرا کنیم در خروجی خواهیم داشت:
123
در واقع، عدد 123 مقدار متغیری تحت عنوان number
است که در SecondClass
تعریف شده و با فراخوانی متد()testMethod
از این کلاس توانستیم مقدار منتسب به متغیر مذکور را در کنسول چاپ نماییم. حال سطح دسترسیِ متد تعریفشده در SecondClass
را محدود کرده و آن را به private
تغییر میدهیم که برای این منظور کد مربوط به این کلاس را به صورت زیر بازنویسی میکنیم:
package MainPackage;
public class SecondClass {
static int number = 123;
private static void testMethod() {
System.out.println(number);
}
}
فایل مربوط به SecondClass
را سِیو کرده و به محض انجام این کار هشداری در قالب عبارت زیر در کنار سطر مربوط به فراخوانی متد ()testMethod
مشاهده خواهیم کرد:
The method testMethod() from the type SecondClass is not visible
این هشدار حاکی از آن است که متدی تحت عنوان ()testMethod
از کلاس SecondClass
قابلرؤیت نمیباشد (این هشدار در کلاس MainClass
و در قالب اروری به همین صورت قابلمشاهده میباشد.) در واقع، به محض سِیو کردن فایل مربوط به SecondClass
زیر نام متد ()testMethod
در کلاس MainClass
خطی قرمز نمایش داده میشود که با قرار دادن نشانگر ماوس روی آن میبینیم که آیدیای اکلیپس به منظور رفع مشکل به وجود آمده پیشنهاد انتخاب سطح دسترسی مرتبط با این متد را ارائه میکند. دانلود فایلهای تمرین
نحوۀ تعریف متدهایی با پارامتر ورودی در زبان برنامهنویسی جاوا
در آموزش نحوۀ تعریف متد در زبان برنامهنویسی جاوا، با چگونگی تعریف یک متد آشنا شدیم و در این آموزش قصد داریم تا به بررسی نحوۀ تعریف پارامتر ورودی برای متدها در زبان برنامهنویسی جاوا پرداخته و ببینیم که چگونه میتوان دادهای را به عنوان آرگومان ورودی به متد مورد نظر پاس داده و آن را فراخوانی کرد.
پیش از شروع آموزش، یک پروژۀ جدید تحت عنوان PassingDataToMethods در محیط برنامهنویسی اکلیپس ایجاد کرده و کلاسی به نام MainClass
در آن میسازیم. حال برای روشن شدن مطالب ارائهشده در این آموزش سناریویی را در نظر میگیریم که در آن فرض میکنیم والدین یا همسرمان از ما میخواهند تا به سوپرمارکت رفته و اقلام مورد نیاز خود را خریداری کنیم. به عبارتی، باید به سوپرمارکت رفته و کاری را انجام دهیم که در چنین شرایطی میتوانیم این کار را به عنوان تَسکی داخل یک متد تعریف کرده و آن را پیادهسازی نماییم. به علاوه، میتوانیم اقلام مورد نیاز برای خرید را به منزلۀ آرگومانی در نظر بگیریم که باید به متد مورد نظر پاس داده شده و کار خرید روی آنها انجام شود.
با توجه به آنچه در بالا بدان اشاره کردیم، متدی تحت عنوان ()goToSuperMarket
را در نظر گرفته و در ادامه دستوراتی مبنی بر چاپ استرینگ مربوط به نام آیتمهای مورد نیاز را داخل آن پیادهسازی مینماییم که برای این منظور میتوانیم هر یک از آیتمهای مد نظر برای خرید همچون «نان» و «پنیر» را به عنوان آرگومان ورودی به متد مذکور پاس دهیم تا عمل خریدن روی آنها انجام شود.
در چنین شرایطی، اگر بخواهیم متد فوق را به منظور انجام کار روی آیتم «نان» فراخوانی کنیم، میباید از دستوری به صورت ;("goToSuperMarket("bread
استفاده کنیم (توجه داشته باشیم که نام ورودی در قالب دیتایی از جنس استرینگ بوده و مابین علائم " "
به آن پاس داده میشود.) در واقع، آیتم نان به عنوان آرگومانی است که در لحظه به متد ()goToSuperMarket
اضافه شده است. اکنون اگر تصمیم خود را عوض کرده و بخواهیم موردی همچون «پنیر» را از سوپرمارکت خریداری نماییم، میتوانیم آیتم مورد نظر را به عنوان آرگومان ورودی در نظر گرفته و این بار استرینگی مانند «cheese» را با استفاده از دستور ;("goToSuperMarket("cheese
به متد مورد نظر پاس دهیم. به علاوه، در صورت تمایل به خرید هر دو مورد هم میتوانیم متد ()goToSuperMarket
را به صورت;("goToSuperMarket("bread", "cheese
فراخوانی نماییم. نکتهنوع و همچنین تعداد پارامترهای ورودیِ تعریفشده برای متد بسیار مهم بوده و به ترتیب، تعیینکنندۀ دیتا تایپ مربوط به آرگومان ورودی و تعداد آنها در هنگام فراخوانی متد مذکور میباشند. به عبارت دیگر، در هنگام فراخوانی یک متد، دیتا تایپ و تعداد آرگومانهای ورودی به آن میباید دقیقاً مشابه با دیتا تایپ مورد استفاده در تعریف پارامترهای ورودی و همچنین تعداد آنها باشند.
به طور کلی، اضافه کردن یک پارامتر یا لیستی از پارامترها به یک متد منجر به افزایش کارایی متد مذکور میشود به طوری که مثلاً به جای آنکه متد مورد نظر در هر بار اجرا یکسری دستور را روی دیتایی از پیش تعریفشده اجرا کرده و خروجی مشابهی داشته باشد، میتوان در صورت نیاز دیتای متفاوتی را به آن داده و دستورات تعریفشده برای متد مربوطه را روی آرگومان یا آرگومانهای مورد نظر اجرا کرد.
برای مثال، در رابطه با سناریوی مطرحشده در این آموزش نیز میتوان گفت که تعریف پارامتر ورودی برای متد()goToSuperMarket
به منزلۀ افزودن قابلیتی جهت خرید تعداد اقلام دلخواه از سوپرمارکت میباشد به طوری که میتوانیم یک بار برای خرید نان، بار دیگر برای خرید پنیر یا حتی خرید بستنی به سوپر مارکت برویم!
در این مرحله از آموزش و به منظور روشنتر شدن توضیحات فوق، در ادامه این مفاهیم را در قالب سناریوی فوقالذکر پیادهسازی میکنیم و برای این منظور کلاسی که در ابتدای این آموزش ایجاد کردیم را به شکل زیر تکمیل میکنیم:
public class MainClass {
String mySentence = "Dear son go to supermarket and also buy some ";
public void goToSuperMarket() {
System.out.println(mySentence);
}
}
در کد فوق، آبجکتی از روی کلاس String
تحت عنوان mySentence
تعریف کرده و استرینگ « Dear son go to supermarket and also buy some» را بدان منتسب کردهایم سپس متدی با سطح دسترسیِ public
تحت عنوان()goToSuperMarket
ساختهایم که این متد قرار نیست دیتایی را در خروجی ریترن کند و از همین روی آن را از جنسvoid
تعریف کردهایم. به عبارت دیگر، متد ()goToSuperMarket
صرفاً این وظیفه را دارا است تا استرینگ منتسب به آبجکت mySentence
مبنی بر «درخواست برای خرید چیزی» را روی صفحۀ کنسول چاپ کرده و در ادامه نام آیتم مورد نیاز برای خرید را به همراه استرینگ مذکور در کنسول چاپ نماید.
اکنون با استفاده از کلاس String
آبجکتی تحت عنوان something
تعریف کرده و آن را به عنوان پارامتر ورودی برای متد خود در نظر میگیریم تا بدین وسیله بتوانیم استرینگ مربوط به نام آیتم مورد نظر خود را به آن پاس دهیم که برای این منظور کد فوق را به صورت زیر بازنویسی مینماییم:
public class MainClass {
String mySentence = "Dear son go to supermarket and also buy some ";
public void goToSuperMarket(String something) {
System.out.println(mySentence);
}
}
همانطور که مشاهده میکنیم، داخل پرانتز مقابل نام متد یک آبجکت از جنس کلاس String
تحت عنوانsomething
تعریف کردهایم و همانطور که پیشتر اشاره کردیم این متد وظیفه دارد تا در صورت فراخوانی، استرینگ مربوط درخواست برای خرید چیزی را به همراه استرینگ مربوط به نام آیتم مد نظر گرفته و آنها را با یکدیگر کانکت کرده سپس روی صفحۀ کنسول چاپ میکند. حال دستورات داخلی این متد مبنی بر نمایش استرینگ مربوط به دستور خرید چیزی به همراه آرگومان ورودی را به صورت زیر در برنامۀ خود اضافه مینماییم:
public class MainClass {
String mySentence = "Dear son go to supermarket and also buy some ";
public void goToSuperMarket(String something) {
System.out.println(mySentence + something);
}
}
در این مرحله، در صورت فراخوانی متد فوق میباید استرینگی را به عنوان آرگومان ورودی بدان پاس دهیم که بدین ترتیب استرینگ ورودی به آبجکت something
منتسب شده و به همراه استرینگ اختصاصیافته به آبجکت mySentence
در کنسول چاپ میشوند که در همین راستا جهت فراخوانی متد ()goToSuperMarket
یک کلاس دیگر تحت عنوانActionClass
داخل پروژۀ PassingDataToMethods ایجاد کرده و آن را به عنوان نقطۀ شروع برنامۀ خود قرار میدهیم و از همین روی در حین ساخت کلاس هم تیک گزینۀ public static void main را میزنیم تا جایی که کد مربوط به فایل ActionClass
در ابتدا به صورت زیر خواهد بود:
public class ActionClass {
public static void main(String[] args) {
}
}
اکنون در متد ()main
داخل کلاس ActionClass
آبجکتی از روی کلاس MainClass
به روش زیر میسازیم:
public class ActionClass {
public static void main(String[] args) {
MainClass myShopping = new MainClass();
}
}
در کد فوق، مشابه آنچه که در آموزش مقدمهای بر مفهوم شیئگرایی در زبان برنامهنویسی جاوا بیان کردیم، برای ساخت آبجکت از روی کلاس MainClass
بدین صورت عمل میکنیم که ابتدا نام کلاس را نوشته و در ادامه نام myShopping
را برای آبجکت مورد نظر انتخاب میکنیم سپس با استفاده از کیورد new
و مجدداً ذکر نام کلاس به کامپایلر جاوا دستور میدهیم که آبجکتی جدید از روی کلاس MainClass
ساخته و آن را با استفاده از عملگر =
به myShopping
منتسب نماید. در این مرحله میتوانیم روی آبجکت جدید ساختهشده از روی کلاس MainClass
متد مد نظر خود را در کلاس مذکور فراخوانی نماییم و برای این منظور کد فوق را به شکل زیر تکمیل میکنیم:
public class ActionClass {
public static void main(String[] args) {
MainClass myShopping = new MainClass();
myShopping.goToSuperMarket();
}
}
همانطور که مشاهده میکنیم، برای فراخوانی متد ()goToSuperMarket
ابتدا نام آبجکت جدید ساختهشده را نوشته سپس یک .
قرار داده و در ادامه نام متد تعریفشده در کلاس مربوطه را مینویسیم و در پایان دستور نیز یک علامت ;
قرار میدهیم. در این مرحله به محض سِیو کردن برنامۀ فوق، محیط برنامهنویسی اکلیپس با قرار دادن نقطهچین دور نام متد خطایی را در قالب عبارت زیر در معرض دید ما قرار میدهد:
The method goToSuperMarket(String) in the type MainClass is not applicable for the arguments ()
در واقع، ارور فوق از آنجایی ناشی میشود که متد ()goToSuperMarket
را با یک پارامتر ورودی از جنس کلاسString
تعریف کرده اما آن را بدون هیچ آرگومانی فراخوانی نمودهایم که آیدیای اکلیپس نیز به منظور رفع مشکل به وجود آمده پیشنهاد پاس دادن مقداری از جنس کلاس String
را به عنوان آرگومان ورودی به این متد ارائه میکند. بنابراین به منظور فرخوانی متد ()goToSuperMarket
نیاز است تا استرینگ مربوط به نام آیتم مد نظر را به عنوان ورودی و داخل علائم " "
بدان پاس دهیم که برای این منظور کد فوق را به صورت زیر تکمیل مینماییم:
public class ActionClass {
public static void main(String[] args) {
MainClass myShopping = new MainClass();
myShopping.goToSuperMarket("bread");
}
}
همانطور که مشاهده میکنیم، استرینگ «bread» را به عنوان آرگومان ورودی به متد ()goToSuperMarket
پاس دادهایم که با اجرای برنامۀ فوق استرینگ مذکور با استرینگ منتسب به آبجکت mySentence
کانکت شده و در کنسول چاپ میگردد به طوری که در خروجی خواهیم داشت:
Dear son go to supermarket and also buy some bread
حال اگر بخواهیم مثلاً آیتم دیگری همچون «پنیر» را خریدار نماییم، میتوانیم استرینگ مربوط به نام آن را به جای استرینگ قبلی به متد ()goToSuperMarket
پاس دهیم تا دستورات تعریفشده برای این متد روی آرگومان ورودی جدید نیز اِعمال گردند به طوری که به روش زیر استرینگ «cheese» را به عنوان آرگومان ورودی به متد مذکور پاس داده و آن را فراخوانی مینماییم:
public class ActionClass {
public static void main(String[] args) {
MainClass myShopping = new MainClass();
myShopping.goToSuperMarket("cheese");
}
}
مشابه آنچه در مثال پیشین توضیح دادیم، استرینگ «cheese» به آبجکت something
منتسب شده و به همراه استرینگ اختصاصیافته به آبجکت mySentence
در کنسول چاپ میگردد به طوری که با اجرای برنامۀ فوق در خروجی خواهیم داشت:
Dear son go to supermarket and also buy some cheese
همانطور که میبینیم، با تعریف پارامتر ورودی برای متد ()goToSuperMarket
توانستیم تا به صورت اصطلاحاً Real-time ورودی مورد نظر خود را به متد مربوطه پاس داده و بدین ترتیب دستورات تعریفشده برای متد مذکور روی دیتای ورودی اجرا شده و خروجی متناسب با دیتای دریافتشده را به دست آوردیم. دانلود فایلهای تمرین
آشنایی با متدهایی با مقادیر برگشتی در زبان برنامهنویسی جاوا
در این آموزش قصد داریم تا به معرفی دستور return
در زبان برنامهنویسی جاوا و کاربرد آن در دستورات داخلی متدها پرداخته و در ادامه نحوۀ عملکرد متدهایی با مقادیر بازگشتی را تشریح نماییم. برای درک بهتر کاربرد دستور return
در مثال مطرحشده در آموزش پیشین، فرض میکنیم که قرار است تا مثلاً پس از خرید اقلام مورد نیاز خود از سوپرمارکت بلافاصله به خانه بازگردیم که پیادهسازی چنین شرایطی با دستور return
در زبان برنامهنویسی جاوا امکانپذیر میباشد.
در واقع، دستور return
در یک متد منجر بدین میشود تا متد مذکور پس از فراخوانی دیتایی را در خروجی بازگرداند که این دیتا را میتوان در سایر نقاط برنامه مورد استفاده قرار داد و این در حالی است که سایر متدهایی که در آنها دستورreturn
به کار گرفته نمیشود، صرفاً یکسری دستور را اجرا کرده و دیتایی را در خروجی ریترن نمیکنند.
در این مرحله به منظور درک کاربرد دستور return
در دستورات داخلی متدها، سناریوی جدیدی بدین صورت تعریف میکنیم و در آن فرض میکنیم که برای برنامهنویسی از یک کامپیوتر شخصی استفاده میکنیم اما قصد داریم تا یک لپتاپ برای خود تهیه نماییم تا همواره همراه ما باشد و بتوانیم در هر جایی به راحتی روی پروژههای خود کار کنیم اما از قیمت لپتاپهای متناسب با نیازمان اطلاعی نداریم و بدین دلیل نمیتوانیم هزینۀ خرید آن را از قبل تهیه کرده و همراه خود به مرکز خرید کامپیوتر ببریم. بنابراین به مرکز خرید رفته و جستجوی خود را آغاز مینماییم تا محدودۀ قیمت لپتاپی متناسب با نیازمان را به دست آورده و در نهایت هزینۀ مورد نیاز برای خرید لپتاپ را به عنوان مقدار حاصل از جستجوی خود تهیه نماییم که برای پیادهسازی چنین سناریویی، پروژهای جدید تحت عنوان BuyingALaptop ایجاد کرده و کلاسی به نام MainClass
در آن میسازیم و در ادامه کد مربوط به این کلاس را به صورت زیر تکمیل میکنیم:
public class MainClass {
public int goToComputerComplex() {
int laptopPrice = 0;
return laptopPrice;
}
}
در کد فوق، متدی از جنس int
تحت عنوان ()goToComputerComplex
با سطح دستری public
ایجاد کرده و داخل آن نیز با استفاده از دیتا تایپ int
متغیری به نام laptopPrice
با مقدار اولیۀ 0 تعریف میکنیم که این متغیر قرار است تا هزینۀ خرید لپتاپ را نگهداری نماید. از سوی دیگر، متغیر laptopPrice
یک متغیر به اصطلاح Local در متد فوق بوده و صرفاً در داخل متد مذکور میتوان بدان دسترسی داشت (در آموزش آشنایی با متغیرهای Local و Field در زبان برنامهنویسی جاوا به معرفی متغیرهای لوکال، نحوۀ تعریف و همچنین کاربرد آنها در متدها و کلاسهای تعریفشده در زبان جاوا پرداختهایم.) به علاوه، مشابه آنچه در آموزش آشنایی با انواع سطوح دسترسی در زبان برنامهنویسی جاوا آموختیم، سطح دسترسی public
در تعریف متد ()goToComputerComplex
بدین معنا است که متد مذکور از تمامی نقاط برنامه قابلدسترسی میباشد.
به طور کلی، چنانچه بخواهیم تا متدی تعریف کنیم که در صورت فراخوانی دادهای را به اصطلاح «ریترن کند» یا «بازگرداند»، میباید نوع دادۀ مربوط به مقدار بازگشتی را پیش از نام متد مورد نظر بنویسیم. به طور مثال، اگر بخواهیم که متدی پس از فراخوانی مقداری از جنس عدد اعشاری را ریترن کند، کلیدواژۀ double
را پیش از نام متد مینویسیم و یا به عنوان مثالی دیگر چنانچه بخواهیم تا مقدار بازگشتیِ متدی دادهای از جنس بولین (true
یا false
) باشد، میباید پیش از نام متد مربوطه کلیدواژۀ boolean
را بنویسیم. در این آموزش قصد داریم تا متد ()goToComputerComplex
مقدار مربوط به هزینۀ لپتاپ از نوع دادۀ int
یا عدد صحیح را در خروجی ریترن کند و از همین روی در تعریف متد مذکور به جای کیورد void
از کلیدواژۀ int
استفاده نمودهایم.
حال به منظور فراخوانی متد ()goToComputerComplex
نیاز داریم تا آبجکتی از روی کلاس مربوطه در کلاس دیگری ساخته و آن را روی آبجکت جدید ساختهشده فراخوانی نماییم که در همین راستا، مشابه آموزشهای پیشین، یک کلاس جدید تحت عنوان ActionClass
ایجاد کرده و جهت تعریف این کلاس به عنوان نقطۀ شروع برنامۀ خود نیز در حین ساخت آن تیک گزینۀ public static void main را میزنیم و در ابتدا کدی به صورت زیر خواهیم داشت:
public class ActionClass {
public static void main(String[] args) {
}
}
در ادامه، آبجکتی از روی کلاس MainClass
داخل کلاس ActionClass
ایجاد میکنیم و برای این منظور کد فوق را به صورت زیر تکمیل مینماییم:
public class ActionClass {
public static void main(String[] args) {
MainClass myObject = new MainClass();
}
}
مشابه آنچه در آموزش مقدمهای بر مفهوم شیئگرایی در زبان برنامهنویسی جاوا آموختیم، یک آبجکت جدید تحت عنوانmyObject
از روی کلاس MainClass
ایجاد کرده و با این کار به متد تعریفشده در کلاس MainClass
دسترسی پیدا میکنیم. همانطور که پیشتر اشاره کردیم، متد ()goToComputerComplex
دادهای از جنس عدد صحیح را ریترن میکند. بنابراین با استفاده از دیتا تایپ int
متغیری به نام totalPrice
تعریف کرده و نتیجۀ حاصل از فراخوانی متد()goToComputerComplex
روی آبجکت جدید ساختهشده از روی MainClass
را بدان منتسب میکنیم و بدین ترتیب دیتای ریترنشده از فراخوانی این متد در متغیر totalPrice
ذخیره میشود به طوری که خواهیم داشت:
public class ActionClass {
public static void main(String[] args) {
MainClass myObject = new MainClass();
int totalPrice = myObject.goToComputerComplex();
}
}
با اجرای برنامۀ فوق، متد ()goToComputerComplex
فراخوانی شده و مقدار منتسب به متغیر laptopPrice
از کلاسMainClass
در خروجی ریترن شده و به متغیر totalPrice
از کلاس ActionClass
اختصاص داده میشود که در این مرحله برای مشاهدۀ مقدار منتسب به متغیر totalPrice
از متد ()println
استفاده کرده و آن را به همراه استرینگی به صورت زیر در کنسول چاپ مینماییم:
public class ActionClass {
public static void main(String[] args) {
MainClass myObject = new MainClass();
int totalPrice = myObject.goToComputerComplex();
System.out.println("The price of my laptop is: " + totalPrice);
}
}
در کد فوق، در دستور سطر پنجم گفتهایم مقدار اختصاصیافته به متغیر totalPrice
با استفاده از عملگر +
با استرینگ «:The price of my laptop is» کانکت شده و در کنسول چاپ گردد. بنابراین با اجرای برنامۀ فوق در خروجی خواهیم داشت:
The price of my laptop is: 0
همانطور که مشاهده میکنیم، برنامه به درستی کار کرده و تنها مقدار اختصاصیافته به متغیر laptopPrice
معادل عدد 0 که با فراخوانی متد ()goToComputerComplex
در خروجی ریترن شده و به متغیر totalPrice
منتسب میشود را به همراه استرینگ مربوطه در کنسول چاپ مینماید. در ادامه، مقدار عددیِ منتسب به متغیر laptopPrice
در کلاسMainClass
را به عدد 28000000 تغییر میدهیم به طوری که در کد زیر داریم:
public class MainClass {
public int goToComputerComplex() {
int laptopPrice = 28000000;
return laptopPrice;
}
}
حال مجدداً برنامه را اجرا میکنیم و بدین ترتیب در خروجی خواهیم داشت:
The price of my laptop is: 28000000
همانطور که ملاحظه میکنیم، به محض تغییر مقدار اختصاصیافته به متغیر laptopPrice
مقدار ریترنشده از متد()goToComputerComplex
نیز تغییر پیدا میکند. دانلود فایلهای تمرین
آشنایی با کلیدواژۀ static و کاربردهای آن در قالب پروژۀ ثبتنام متقاضیان در باشگاه در زبان جاوا
در این آموزش قصد داریم تا با کیورد static
و کاربردهای آن در زبان برنامهنویسی جاوا آشنا شویم. به طور کلی، معنای لغوی این کلیدواژۀ «ثابت»، «ساکن» و یا «ایستا» میباشد و در حقیقت کلیدواژۀ static
به منظور تعریف متغیرها و متدها در زبان جاوا مورد استفاده قرار میگیرد که در ادامه قصد داریم تا با کاربرد هر یک در قالب مثالهایی کاربردی آشنا شویم.
استفاده از کلیدواژۀ static جهت تعریف متغیرها
استفاده از کیورد static
پیش از نام متغیر مد نظر منجر بدین میگردد تا مقدار منتسب به آن متغیر صرفاً یک مرتبه مقداردهی شود بدین معنی که تنها یک مکان از حافظه به چنین متغیرهایی اختصاص داده میشود و از همین روی در سایر نقاط برنامه نمیتوان متغیر مذکور را مجدداً مقداردهی کرد بلکه اجرای یکسری دستورات مرتبط با این متغیر منجر به تغییر مقدار منتسب به آن میگردد.
به منظور درک بهتر مفهوم کیورد static
در تعریف متغیرها، ابتدا سناریویی تعریف میکنیم و در آن فرض میکنیم که در یک باشگاه بدنسازی یا ایروبیک تمرین میکنیم و قصد داریم تا برنامهای برای این باشگاه طراحی کنیم تا وظیفۀ ثبت اطلاعات مربوط به ورزشکارانی که در آن ثبتنام میکنند را بر عهده داشته باشد. برای این منظور، یک پروژۀ جدید در محیط اکلیپس تحت عنوان SportClub ایجاد کرده و کلاسی به نام Athlete
در آن میسازیم (به خاطر داشته باشیم که در حین ساخت این کلاس نیاز نیست تا تیک گزینۀ public static void main را بزنیم.) به طوری که در ابتدا کدی به صورت خواهیم داشت:
public class Athlete {
}
در حقیقت، در این کلاس قصد داریم تا اطلاعات مربوط به ورزشکاران باشگاه را تعریف کرده و آنها را مدیریت نماییم. همانطور که میدانیم، هر فرد متقاضی برای ثبتنام در باشگاه میباید اطلاعاتی همچون نام، نام خانوادگی و تاریخ تولد خود را در سیستم به ثبت رساند و یک شمارۀ عضویت نیز به وی اختصاص داده خواهد شد؛ از همین روی، نیاز است تا یکسری متغیر جهت ذخیرۀ این مقادیر در کلاس فوق تعریف کنیم و برای این منظور کد فوق را به شکل زیر تکمیل میکنیم:
public class Athlete {
String name;
String lastName;
int dateOfBirth;
int registrationNumber;
}
همانطور که ملاحظه میشود، در کد فوق دو آبجکت از روی کلاس String
تحت عناوین name
و lastName
ایجاد کرده سپس با استفاده از دیتا تایپ int
دو متغیر دیگر به نامهای dateOfBirth
و registrationNumber
تعریف کردهایم.
پیشتر گفتیم در صورتی که یک ورزشکار جدید در باشگاه ثبتنام کند، مسلماً دارای نام، نام خانوادگی و تاریخ تولد مختص به خود است اما شمارۀ عضویت ایشان به هیچ وجه تحت کنترل وی نبوده و به طور مثال نمیتواند برای خود شمارۀ عضویت 7 را در نظر بگیرد. همچنین به منظور ثبت اطلاعات هر یک از ورزشکاران نیاز به ساخت آبجکتی جدید از روی این کلاس به ازای هر فرد داریم تا بدین ترتیب مقادیری به هر یک از متغیرهای dateOfBirth
،lastName
،name
و registrationNumber
اختصاص داده شده و در حافظۀ سیستم ذخیره شوند.
با توجه به اینکه شمارۀ عضویت ورزشکاران تحت کنترل ایشان نبوده بلکه به صورت خودکار شمارهای منحصربهفرد به ایشان اختصاص داده میشود، از همین روی به منظور اِعمال چنین محدودیتی روی متغیر registrationNumber
آن را از جنس متغیری استاتیک تعریف میکنیم بدین صورت که کلیدواژۀ static
را پیش از نام متغیر مذکور قرار داده و آن را متغیری با مقدار اولیهای ثابت تعریف میکنیم تا بدین ترتیب مقدار متغیر registrationNumber
در همهٔ آبجکتهای ساختهشده از روی کلاس متناظرش ثابت باشد. بنابراین در ساخت آبجکت از روی کلاس Athlete
نمیتوان مقداری را برای متغیر مذکور در نظر گرفت بلکه مقدار اختصاصیافته به آن در نتیجۀ اجرای دستورات تعریفشده در برنامه تعیین شده و به عنوان شمارۀ عضویت منحصربهفرد هر کاربر در نظر گرفته میشود (چنین متغیرهایی در زبان برنامهنویسی جاوا به اصطلاح Static Field نیز نامیده میشوند.) حال برای تعریف متغیر registrationNumber
به صورت استاتیک کد فوق را به روش زیر تکمیل میکنیم:
public class Athlete {
String name;
String lastName;
int dateOfBirth;
static int registrationNumber;
}
همانطور که در کد فوق ملاحظه میکنیم، پیش از کلیدواژۀ int
کیورد static
را نوشتهایم و در ادامه مقدار اولیهای به این متغیر اختصاص میدهیم تا در صورت ثبتنام افراد در باشگاه مقدار منتسب به این متغیر افزایش یافته و به هر یک از ایشان شمارۀ عضویتی منحصربهفرد اختصاص داده شود. بنابراین در کد زیر مقدار اولیۀ متغیر registrationNumber
را برابر با عدد 0 قرار میدهیم:
public class Athlete {
String name;
String lastName;
int dateOfBirth;
static int registrationNumber = 0;
}
در کد فوق، مقدار اولیۀ منتسب به متغیر registrationNumber
را برابر با 0 قرار دادیم چرا که در حال حاضر هیچ فردی در باشگاه ثبتنام نکرده است. در ادامه، نیاز به تعریف یک اصطلاحاً Constructor داریم تا بدین ترتیب بتوانیم متغیرهای تعریفشده در کد فوق را به نحوی مقداردهی نماییم تا در صورت ساخت آبجکتی از روی کلاس Athlete
کانستراکتور کلاس فراخوانی شده و مقادیر مد نظر برای نام، نام خانوادگی و تاریخ تولد متقاضیان را به هر یک از متغیرهای فوقالذکر منتسب نموده و در ادامه نیز به صورت خودکار شمارۀ عضویتی منحصربهفرد برای ایشان اختصاص دهد (در آموزشآشنایی با مفهوم Constructor در زبان برنامهنویسی جاوا به طور کامل به بررسی مفهوم کانستراکتور، نحوۀ تعریف و همچنین کاربرد آن در تعریف کلاسها پرداختهایم.) بنابراین به صورت زیر کانستراکتوری برای کلاس Athlete
تعریف میکنیم:
public class Athlete {
String name;
String lastName;
int dateOfBirth;
static int registrationNumber = 0;
public Athlete(String nameOfAthlete, String lastNameOfAthlete, int dateOfBirthOfAthlete) {
name = nameOfAthlete;
lastName = lastNameOfAthlete;
dateOfBirth = dateOfBirthOfAthlete;
registrationNumber++;
}
}
در کد فوق، متدی همنام با کلاسمان تحت عنوان ()Athlete
تعریف کردهایم که به منزلۀ کانستراکتور این کلاس میباشد و برای آن سه پارامتر ورودی تحت عناوین lastNameOfAthlete
،nameOfAthlete
وdateOfBirthOfAthelte
در نظر گرفتهایم و همانطور که میبینیم، برای تعریف دو پارامتر اول از کلاس String
استفاده کرده و پارامتر سوم را با استفاده از دیتا تایپ int
تعریف کردهایم بدین معنی که مقادیر نام و نام خانوادگی مورد نظر برای هر ورزشکار میباید دیتایی از جنس استرینگ و تاریخ تولد وی نیز دیتایی از جنس عدد صحیح باشد.
در ادامه، داخل کانستراکتور تعریفشده برای این کلاس هر یک از پارامترهای ورودی را به متغیرهای تعریفشدۀ متناظرشان در کلاس Athlete
منتسب کردهایم که بدین ترتیب میتوانیم در صورت ساخت آبجکتی از روی کلاسAthlete
مقادیر مربوط به نام، نام خانوادگی و تاریخ تولد هر متقاضی را به عنوان دیتای ورودی برای آبجکت مد نظر تعریف نماییم که در چنین شرایطی کانستراکتور کلاس فراخوانی شده و مقادیر تعریفشده برای نام، نام خانوادگی و تاریخ تولد هر یک از ورزشکاران که در متغیرهای lastNameOfAthlete
،nameOfAthlete
وdateOfBirthOfAthlete
ذخیره شدهاند را به ترتیب به متغیرهای lastName
،name
و dateOfBirth
اختصاص میدهد و در دستور سطر دهم گفتهایم که در هر بار ساخت آبجکتی جدید از روی این کلاس، یک واحد به مقدار اولیۀ متغیر registrationNumber
اضافه شود و بدین ترتیب آخرین مقدار منتسب به این متغیر به عنوان شمارۀ عضویت متقاضیِ جدید در نظر گرفته میشود.
در ادامه، نیاز داریم تا متدی تعریف کنیم که با ساخت آبجکت از روی کلاس Athlete
و ثبت اطلاعات مربوط به نام، نام خانوادگی، تاریخ تولد و شمارۀ عضویت هر متقاضی به متد مورد نظر دسترسی داشته و آن را فراخوانی کنیم تا اطلاعات هر یک از ورزشکاران که به متغیرهای dateOfBirth
،lastName
،name
و registrationNumber
منتسب شده را در کنسول چاپ نماید که برای این منظور کد فوق را به صورت زیر تکمیل میکنیم:
public class Athlete {
String name;
String lastName;
int dateOfBirth;
static int registrationNumber = 0;
public Athlete(String nameOfAthlete, String lastNameOfAthlete, int dateOfBirthOfAthlete) {
name = nameOfAthlete;
lastName = lastNameOfAthlete;
dateOfBirth = dateOfBirthOfAthlete;
registrationNumber++;
}
public void showAthleteInfo() {
System.out.println("Your name is " + name);
System.out.println("Your last name is " + lastName);
System.out.println("Your date of birth is " + dateOfBirth);
System.out.println("Your registration No is " + registrationNumber);
}
}
در کد فوق، متدی به نام ()showAthleteInfo
از جنس void
تعریف کردهایم و دلیل تعریف آن به صورت void
این است که متد مذکور قرار نیست تا دیتایی را در خروجی ریترن کند بلکه صرفاً یکسری مقادیر را در کنسول چاپ مینماید. بنابراین دستورات داخلی این متد را بدین صورت تعریف کردهایم تا در هنگام فراخوانی با استفاده از متد ()println
به ترتیب مقادیر منتسب به هر یک از متغیرهای dateOfBirth
،lastName
،name
و registrationNumber
را به همراه استرینگ متناظرشان در کنسول چاپ کند.
تا به این مرحله، سناریوی مطرحشده در این آموزش را به نحوی پیادهسازی نمودیم که با ساخت آبجکت از روی کلاس میتوانیم دادههای مربوط به اطلاعات ورزشکاران را به عنوان دیتای ورودی به آن پاس دهیم و در ادامه کانستراکتور تعریفشده در این کلاس فراخوانی شده و هر یک از مقادیر پاس دادهشده به آبجکت جدید را به ترتیب به متغیرهای lastName
،name
و dateOfBirth
اختصاص میدهد به علاوه اینکه در هر بار ساخت آبجکت از روی این کلاس نیز مقدار registrationNumber
یک واحد افزایش یافته و به عنوان شمارۀ عضویتی منحصربهفرد برای هر یک از ورزشکاران در نظر گرفته میشود.
حال در ادامه قصد داریم تا نحوۀ ساخت آبجکت از روی کلاس Athlete
و چگونگی پاس دادن مقادیر مورد نظر به عنوان اطلاعات هر فرد را به آن مورد بررسی قرار دهیم و ببینیم که چگونه میتوان آبجکتهای دیگری از روی این کلاس ساخت که برای این منظور نیاز است تا کلاس دیگری تعریف کنیم تا در آن آبجکتی از روی کلاس Athlete
ساخته و مقادیر مربوط به اطلاعات هر فرد را به عنوان دیتای ورودی به آبجکت مذکور بدهیم و در ادامه متد تعریفشده در کلاس Athlete
را روی آبجکت ساختهشده از روی این کلاس و در کلاس جدید فراخوانی کنیم تا اطلاعات هر فرد را در معرض دیدمان قرار دهد.این بخش از محتوا مخصوص کاربرانی است که ثبتنام کردهاند.
جهت مشاهدهٔ این بخش از محتوا لاگین نمایید.
در این آموزش به نحوۀ پاس دادن مقادیر مورد نظر به آبجکتهای ساختهشده از روی کلاس مربوطه پرداخته و کاربرد کیورد static
در تعریف متغیرها و متدها را مورد بررسی قرار دادیم و گفتیم که برای متغیرهای استاتیک تنها یک فضای ثابتی در حافظۀ سیستم اختصاص داده میشود و بدین ترتیب نمیتوان در سایر نقاط برنامه مقدار جدیدی بدان اختصاص داد که از این قابلیت متغیرهای استاتیک نیز به منظور کنترل اختصاص شمارۀ عضویتی منحصربهفرد به هر یک از ورزشکاران در سناریوی فرضی در این آموزش استفاده نمودیم. در ادامه، به تشریح کاربرد کیورد static
در تعریف متدها پرداختیم و دیدیم که چنین متدهایی به متغیرهای استاتیکِ مرتبط با کل کلاس یا به عبارتی به متغیرهای استاتیکِ مربوط به تمامی آبجکتهای ساختهشده از روی آن کلاس دسترسی دارند. دانلود فایلهای تمرین
آشنایی با کلیدواژۀ final و کاربردهای آن در زبان برنامهنویسی جاوا
در این آموزش قصد داریم تا کلیدواژۀ final
را معرفی کرده و با کاربرد آن در زبان برنامهنویسی جاوا در قالب چند مثال کاربردی آشنا شویم. به طور کلی، کیورد final
را میتوان برای تعریف کلاسها، متدها و متغیرها مورد استفاده قرار داد که در ادامه به معرفی کاربرد آن در هر یک از موارد مذکور میپردازیم:
– جهت تعریف کلاس: استفاده از این کلیدواژه برای کلاسها منجر بدین میگردد تا کلاس مورد نظر قابلیت ارثبری از هیچ کلاسی را نداشته باشد. به عبارت دیگر، با استفاده از کیورد final
در کنار نام کلاس یکی از مهمترین قابلیتهای زبان برنامهنویسی جاوا که یک زبان شیئگرا میباشد را از دست میدهیم!
– جهت تعریف متد: ذکر کیورد final
به همراه نام متدها نیز موجب میشود تا دیگر نتوانیم متد مورد نظر را به اصطلاح Override نماییم (در آموزش بررسی مفهوم وراثت در قالب پروژۀ ارثبری فرزندان از خصوصیات پدر در زبان جاوابه طور کامل مفهوم اُورراید را در قالب مثال توضیح دادهایم.) و بدین ترتیب نوع کاری که متد مذکور انجام میدهد را نمیتوانیم تغییر دهیم.
– جهت تعریف متغیر: مورد سوم استفاده از کلیدواژۀ final
در ارتباط با نامگذاری متغیرها میباشد. در حقیقت، زمانی که کلیدواژۀ final
را در کنار نام متغیری بنویسیم که دارای مقدار اولیه است، مقدار اولیۀ آن متغیر به اصطلاح نهایی شده و دیگر به هیچ وجه امکان اختصاص یک مقدار جدید به آن را نخواهیم داشت و توجه داشته باشیم که با استفاده از هر دو کیورد final
و static
میتوان متغیرهایی با مقدار اولیۀ ثابت تعریف کرد اما همانطور که در آموزش قبل اشاره کردیم، میتوان گفت که تفاوت این دو کیورد در این است که متغیرهای استاتیک قابلیت دسترسی مستقل از آبجکت ساختهشده از روی کلاس مربوطه را دارند.
حال به منظور درک بهتر مطالب تئوری فوق، پروژهای تحت عنوان Final ایجاد کرده و در آن کلاسی به نام WhatIsFinal
ایجاد میکنیم (به خاطر داشته باشیم که در حین ساخت این کلاس تیک گزینۀ public static void main را نزنیم چرا که این کلاس به منزلۀ کلاس اجرایی ما نخواهد بود.) بنابراین در ابتدا کدی به صورت زیر خواهیم داشت:
public class WhatIsFinal {
}
در ادامه متدی در این کلاس ایجاد میکنیم که وظیفۀ آن به نمایش در آوردن نام، نام خانوادگی و تاریخ تولد تعریفشده برای کاربر میباشد و برای این منظور کد فوق را به شکل زیر تکمیل میکنیم:
public class WhatIsFinal {
public void showData() {
String name = "Behzad";
String lastName = "Moradi";
int dateOfBirth = 1362;
System.out.println(name + "\n" + lastName + "\n" + dateOfBirth);
}
}
در کد فوق، متدی تحت عنوان ()showData
تعریف کرده و دو آبجکت از روی کلاس String
تحت عناوین name
وlastName
در آن ایجاد کردهایم و در نهایت با استفاده از دیتا تایپ int
متغیری به نام dateOfBirth
تعریف نمودهایم و همانطور که میبینیم، به ترتیب مقادیر استرینگ «Behzad» و «Moradi» و همچنین عدد «1362» را به هر یک از آنها اختصاص دادهایم. در ادامه، به منظور نمایش دادن این اطلاعات در بخش کنسول از متد ()println
استفاده کرده و هر یک از متغیرهای فوقالذکر را به عنوان آرگومان ورودی به آن پاس دادهایم تا مقادیر منتسب به هر یک را در کنسول چاپ نماید. به علاوه، جهت چاپ هر یک از اطلاعات مربوط به نام، نام خانوادگی و سال تولد در سطرهای جداگانه از علائم n\
استفاده کردهایم و بدین ترتیب هر یک از اطلاعات مذکور در سه سطر جداگانه نمایش داده میشوند.
در ادامه، کلاس دیگری تحت عنوان ActionClass
داخل همان پروژه ایجاد کرده و در حین ساخت آن نیز تیک گزینۀ public static void main را میزنیم چرا که این کلاس قرار است تا به عنوان نقطۀ شروع برنامۀ ما باشد و از همین روی در ابتدا کد مربوط به این کلاس به صورت زیر خواهد بود:
public class ActionClass {
public static void main(String[] args) {
}
}
در این مرحله، نیاز است تا آبجکتی از روی کلاس WhatIsFinal
در کلاس ActionClass
ایجاد کنیم سپس با استفاده از این آبجکت به متد تعریفشده در آن کلاس دسترسی داشته و میتوانیم آن را فراخوانی نماییم که برای این منظور کد فوق را به شکل زیر تکمیل میکنیم:
public class ActionClass {
public static void main(String[] args) {
WhatIsFinal objectOne = new WhatIsFinal();
objectOne.showData();
}
}
در کد فوق، آبجکتی تحت عنوان objectOne
از روی کلاس WhatIsFinal
ساخته و در سطر بعد متد ()showData
از این کلاس را روی آبجکت مذکور فراخوانی نمودهایم. حال با اجرای برنامۀ فوق در خروجی خواهیم داشت:
Behzad
Moradi
1362
همانطور که میبینیم، متد ()showData
فراخوانی شده و اطلاعات مربوط به کاربر در کنسول چاپ شده است. در ادامه، یک کلاس دیگر تحت عنوان Change
در این پروژه ایجاد میکنیم و در ادامه دستورات آن را به نحوی تعریف میکنیم تا از کلاس WhatIsFinal
ارثبری نماید. برای این منظور، فایل کلاس Change
را باز کرده و کد مربوط به آن را به شکل زیر تکمیل میکنیم (جهت کسب اطلاعات بیشتر در رابطه با مفهوم وراثت، به آموزش آشنایی با مفهوم وراثت در زبان برنامهنویسی جاوا مراجعه نمایید):
public class Change extends WhatIsFinal {
}
همانطور که در آموزشهای پیشین توضیح دادیم، به منظور ارثبری یک کلاس از کلاس دیگر در زبان برنامهنویسی جاوا میباید پس از نام کلاس مورد نظر کلیدواژۀ extends
را نوشته سپس نام کلاسی را بنویسیم که میخواهیم از آن ارثبری کنیم. بنابراین از این پس کلاس Change
از تمامی خصوصیات کلاس WhatIsFinal
برخوردار میباشد اما در ادامه قصد داریم تا برخی از خصوصیاتی که کلاس Change
از این کلاس به ارث برده است را تغییر دهیم. در همین راستا، رفتار متد()showData
از کلاس WhatIsFinal
را در کلاس Change
اُورراید مینماییم به طوری که خواهیم داشت:
public class Change extends WhatIsFinal {
@Override
public void showData() {
String name = "Iman";
String lastName = "Ahmadi";
int dateOfBirth = 1364;
System.out.println(name + "\n" + lastName + "\n" + dateOfBirth);
}
}
همانطور که در کد فوق میبینیم، برای اُورراید متد ()showData
ابتدا دستور Override@
را نوشته سپس نام متد را مینویسیم و در ادامه مقادیر منتسب به متغیرهای تعریفشده در متد ()showData
از کلاس WhatIsFinal
را به ترتیب به مقادیر «Ahmadi» ،«Iman» و عدد «1364» تغییر میدهیم. حال مجدد به کلاس ActionClass
بازگشته و در آن آبجکتی جدید از روی کلاس Change
ایجاد میکنیم به طوری که در کد زیر داریم:
public class ActionClass {
public static void main(String[] args) {
WhatIsFinal objectOne = new WhatIsFinal();
objectOne.showData();
Change objectTwo = new Change();
objectTwo.showData();
}
}
در کد فوق، آبجکتی از روی کلاس Change
تحت عنوان objectTwo
ایجاد کرده و در ادامه متد اُوررایدشدۀ()showData
از این کلاس را روی آبجکت ساختهشده فراخوانی نمودهایم به طوری که در خروجی خواهیم داشت:
Behzad
Moradi
1362
Iman
Ahmadi
1364
همانطور که میبینیم، اطلاعات مربوط به هر دو آبجکت در سطرهای جداگانهای در کنسول چاپ شدهاند. تا به این مرحله از آموزش، کلاسی تحت عنوان WhatIsFinal
ایجاد کرده و اتریبیوتهای مورد نظر خود به همراه متدی جهت نمایش آنها در کنسول را بدان اضافه کردیم و در ادامه کلاسی به عنوان نقطۀ شروع برنامۀ خود تعریف کرده و آبجکتی از روی کلاس WhatIsFinal
در آن ایجاد کرده سپس متد تعریفشده در این کلاس را روی آبجکت مذکور فراخوانی نمودیم. در ادامه، کلاس دیگری تحت عنوان Change
تعریف کردیم تا از کلاس WhatIsFinal
ارثبری نماید سپس رفتار متد()showData
از کلاس WhatIsFinal
را در این کلاس اُورراید نمودیم.
اکنون میخواهیم تأثیر کلیدواژۀ final
را در روند اجرای برنامه تست کنیم و همانطور که در ابتدای آموزش اشاره کردیم، کلیدواژۀ final
را میتوان برای تعریف متدها، کلاسها و همچنین متغیرها مورد استفاده قرار داد و از همین روی در ادامه قصد داریم تا تأثیر آن در تعریف موارد مذکور را مورد بررسی قرار دهیم.این بخش از محتوا مخصوص کاربرانی است که ثبتنام کردهاند.
جهت مشاهدهٔ این بخش از محتوا لاگین نمایید.
به طور کلی، در این آموزش به معرفی کیورد final
پرداخته و کاربرد آن در تعریف متغیرها و متدها را مورد بررسی قرار دادیم و گفتیم که استفاده از این کیورد در تعریف متغیرها موجب میشود تا مقادیری ثابت داشته و نتوان در سایر نقاط برنامه آنها را مجدداً مقداردهی کرد. به علاوه، استفاده از این کیورد پیش از نام متدها نیز منجر بدین میگردد تا امکان اُورراید کردن متد مذکور را نداشته باشیم. دانلود فایلهای تمرین