آموزش جاوا (فصل ۱۰)

نحوۀ تعریف متد در زبان برنامه‌نویسی جاوا


در آموزش مقدمه‌ای بر مفهوم شیئ‌گرایی در زبان برنامه‌نویسی جاوا گفتیم که هر کلاس در زبان برنامه‌نویسی جاوا دارای یکسری 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 را برای اِلِمان مربوطه در نظر می‌گیرد بدین معنی که کلاس، متد یا متغیر مذکور در کلاس متناظرش و همچنین در دیگر کلاس‌های موجود در پکیج مربوطه قابل‌دسترسی می‌باشد. 

حال به منظور یادگیری بهتر نحوۀ کارکرد سطوح دسترسی در زبان جاوا، خلاصه‌ای از مطالب فوق‌الذکر را در قالب جدولی به صورت زیر آورده‌ایم:

OthersSubclassPackageClass
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 پرداخته و کاربرد آن در تعریف متغیرها و متدها را مورد بررسی قرار دادیم و گفتیم که استفاده از این کیورد در تعریف متغیرها موجب می‌شود تا مقادیری ثابت داشته و نتوان در سایر نقاط برنامه آن‌ها را مجدداً مقداردهی کرد. به علاوه، استفاده از این کیورد پیش از نام متدها نیز منجر بدین می‌گردد تا امکان اُورراید کردن متد مذکور را نداشته باشیم. دانلود فایل‌های تمرین


مطالب مرتبط

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *