استفاده از کلیدواژه ی static در متدها در زبان برنامه نویسی جاوا


در ادامه آموزش قبل، در این آموزش قصد داریم تا کلاس دیگری ایجاد کرده آنرا به عنوان کلاس شروع برنامه خود در نظر بگیریم و در نهایت اقدام به ساخت آبجکت هایی از روی کلاس Athlete در کلاس جدید خود خواهیم کرد. برای ادامه آموزش، پروژه ای که در قسمت پیش تحت عنوان Sport Club ایجاد کردیم را مد نظر قرار می دهیم. اکنون کلاس دیگری تحت عنوان ActionClass به معنی "کلاس عملیاتی" ایجاد کنیم و خاطرمان باشد که در حین ساخت آن حتماً گزینه public static void main را تیک دار می کنیم چرا که همان طور که قبلاً آموزش داده شد، هرکجا که متد main قرار گیرد به منزله نقطه شروع برنامه ما خواهد بود و ما هم نیاز داریم تا برنامه خود را از داخل این کلاس آغاز کنیم:

public class ActionClass {
    /**
    * @param args
    */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
    }
}

لازم به ذکر است که برای سهولت کار می توان کامنت های فوق را حذف کرد. اکنون در بخش متد main می خواهیم یک آبجکت از روی کلاس Athlete ایجاد کنیم. برای این منظور کد فوق را به شکل زیر تکمیل می کنیم:

همان طور که در تصویر فوق مشاهده می شود، برای ساخت یک آبجکت جدید از روی کلاس Athlete، اول واژه Athlete را نوشته سپس نامی برای آن در نظر می گیریم که در اینجا نام personOne به معنی "نفر اول" را در نظر گرفته ایم. سپس یک علامت مساوی قرار داده و کلید واژه new را می نویسیم و پس از قرار دادن یک فاصله مجدد نام کلاسی که می خواهیم از روی آن یک آبجکت ایجاد کنیم را می نویسیم. همان طور که در تصویر فوق مشاهده می شود، انتهای واژه Athlete با یک فلش قرمز رنگ مشخص شده است. در واقع با قرار دادن نشانگر موس خود در آن نقطه و فشردن هم زمان کلید های Ctrl و Space با تصویر زیر مواجه خواهیم شد:

از آنجا که ما برای کانستراکتور خود سه پارامتر در نظر گرفته ایم، اکلیپس این نکته را متوجه شده و به صورت خودکار آبجکت ما را به همراه نام پارامترها تکمیل می کند. اکنون می بایست نام پارامترهای فوق را بسته به این که چه جنسی دارند با مقادیر متناظر با آن ها تکمیل کنیم. برای این منظور کد خود را به شکل زیر تکمیل می کنیم:

public class ActionClass {
    public static void main(String[] args) {
        Athlete personOne = new Athlete("Behzad", "Moradi", 1362);
    }
}

در حقیقت از آنجا که جنس دو پارامتر اول استرینگ است، از اینرو مقدار آن ها را می بایست داخل دو علامت " " قرار داد و از آنجا که جنس پارامتر سوم int است می بایست یک عدد صحیح برای آن در نظر گرفت که در مثال فوق عدد 1362 برای آن در نظر گرفته شده است. اکنون نیاز داریم تا به متد قرار گرفته در کلاس Athlete دست پیدا کنیم. برای این منظور کد فوق را به صورت زیر تکمیل می کنیم:

public class ActionClass {
    public static void main(String[] args) {
        Athlete personOne = new Athlete("Behzad", "Moradi", 1362);
        personOne.showAthleteInfo();
    }
}

همان طور که قبلاً گفته شد، این متد وظیفه دارد تا اطلاعات هر ورزشکار را به نمایش در آورد. اکنون می توانیم برنامه خود را اجرا کنیم:

می بینیم که پارامترهای در نظر گرفته شده به نمایش درآمده اما مسئله ای که جالب توجه است این است که شماره عضویت 1 برای Behzad در نظر گرفته شده است و علت آن هم این است که ما مقدار اولیه شماره عضویت را برابر با 0 قرار دادیم و این دستور را به کانستراکتور برنامه دادیم که برای هر آبجکت ساخته شده از روی کلاس آن، یک واحد به مقدار اولیه اضافه کند و از همین رو است که عدد 1 در اجرای فوق در نظر گرفته شده است. حال دو آبجکت دیگر از روی کلاس Athlete می سازیم:

public class ActionClass {
    public static void main(String[] args) {
        Athlete personOne = new Athlete("Behzad", "Moradi", 1362);
        personOne.showAthleteInfo();
        Athlete personTwo = new Athlete("Ahmad", "Sohrabi", 1346);
        personTwo.showAthleteInfo();
        Athlete personThree = new Athlete("Ramin", "Jafari", 1371);
        personThree.showAthleteInfo();
    }
}

دو آبجکت جدید تحت عناوین personTwo و personThree به معنی به ترتیب "نفر دوم" و "نفر سوم" ایجاد شده اند. مجدد برنامه را اجرا می کنیم:

می بینیم که پس از به نمایش درآمدن نام، نام خانوادگی و تاریخ تولد برنامه به صورت خودکار شماره عضویت فرد را اعلام می کند. برای تست برنامه، personTwo را با استفاده از کامنت از کد خود به صورت زیر حذف می کنیم:

public class ActionClass {
    public static void main(String[] args) {
        Athlete personOne = new Athlete("Behzad", "Moradi", 1362);
        personOne.showAthleteInfo();
        //        Athlete personTwo = new Athlete("Ahmad", "Sohrabi", 1346);
        //        personTwo.showAthleteInfo();
        Athlete personThree = new Athlete("Ramin", "Jafari", 1371);
        personThree.showAthleteInfo();
    }
}

اکنون مجدد برنامه را اجرا می کنیم:

می بینیم که اطلاعات personThree به نمایش درآمده اما این در حالی است که شماره عضویت به صورت خودکار یکی کاهش یافته است. اکنون فرض کنیم که 100 نفر از قبل در باشگاه حضور داشته اند و ما می خواهیم برای نفرات جدید ثبت نامی صورت دهیم. برای این منظور مقدار متغیر شماره عضویت را به صورت زیر به عدد 100 افزایش می دهیم:

static int registrationNumber = 100;

اکنون مجدد برنامه را اجرا می کنیم:

می بینیم که از آنجا که Field مرتبط با شماره عضویت از جنس static است هر تغییری که در آن ایجاد کنیم در کلیه کلاس های ساخته شده از روی آن کلاس اعمال خواهد شد. علاوه بر استفاده کلید واژه static به همراه متغیرها، در زبان برنامه نویسی جاوا این امکان را داریم تا متدها را نیز static سازیم. برای درک بهتر این موضوع مجدد به کلاس 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++;
    }
    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);
    }
    public static int showAllAthletes() {
        return registrationNumber;
    }
}

در انتهای کد اقدام به ساخت یک متد جدید تحت عنوان showAllAtheltes به معنی "همه ورزشکاران را نشان بده" نموده ایم. از آنجا که قرار است این متد یک عدد به ما نشان دهد، آن را از جنس int قرار می دهیم. زمانی که ما در ساخت یک متد از کلید واژه ی void استفاده نمی کنیم به بدان معنا است که این متد همواره داده ای را return خواهد کرد پس می بایست کلید واژه ی return را نوشته و چیزی که قصد داریم این متد بازگرداند را مقابل آن قرار می دهیم. در این مثال می خواهیم این متد همواره تعداد کل ثبت نامی ها را به مدیر باشگاه نشان دهد پس می بایست نام متغیر registrationNumber را مقابل آن بنویسیم.

اکنون مجدد به کلاس ActionClass باز می گردیم. از آنجا که می خواهیم پس از به نمایش در آمدن اطلاعات کلیه آبجکت های ساخته شده از روی کلاس Athlete در پنجره ی کنسول عبارت The number of all registrations is به معنی "تعداد کل ثبت نامی ها معادل است با" روی صفحه به نمایش درآید، از این رو کد خود را به شکل زیر تکمیل می کنیم:

public class ActionClass {
    public static void main(String[] args) {
        Athlete personOne = new Athlete("Behzad", "Moradi", 1362);
        personOne.showAthleteInfo();
        Athlete personTwo = new Athlete("Ahmad", "Sohrabi", 1346);
        personTwo.showAthleteInfo();
        Athlete personThree = new Athlete("Ramin", "Jafari", 1371);
        personThree.showAthleteInfo();
        System.out.println("The number of all registrations is "
        + personOne.showAllAthletes());
    }
}

همان طور که در بخش آخر کد مشاهده می کنیم، عبارت مد نظر را داخل دستور ;()System.out.println داخل دو علامت " " نوشته پس از آن یک علامت + قرار داده و در نهایت نام یکی از آبجکت های ساخته شده از روی کلاس Athlete را می نویسیم که در این مثال مورد اول که personOne نام داشت را مد نظر قرار داده ایم. پس از نوشتن نام آبجکت و قرار دادن یک نقطه، به کلیه ی متدهای موجود در کلاس اصلی دسترسی خواهیم داشت. از اینرو نام متد ()showAllAthletes را می نویسیم. برنامه را مجدد اجرا می کنیم:

می بینیم که تعداد کل ثبت نامی ها به نمایش در آمده است. اکنون برای تست کردن برنامه خود کد فوق را به صورت زیر تغییر می دهیم:

System.out.println("The number of all registrations is "
+ personTwo.showAllAthletes());


در کد بالا، به جای استفاده از آبجکت اول خود تحت عنوان personOne از آبجکت دوم ساخته شده از روی کلاس Athlete تحت عنوان personTwo استفاده کرده ایم. مجدد برنامه را تست می کنیم:

باز هم می بینیم که حاصل متدی که از جنس static بود جدای از آبجکت مرتبط با آن یکی است و این همان خاصیت کلید واژه static است که این امکان را به ما داده است تا متد showAllAthletes را در میان همه آبجکت ها اصطلاحاً Share کنیم یا "به اشتراک" بگذاریم. برای آن که مجدد برنامه خود را تست کنیم، از قصد یکی از آبجکت های ساخته شده ی خود مثلاً آبجکت سوم خود را مجدد کامنت می کنیم:

public class ActionClass {
    public static void main(String[] args) {
        Athlete personOne = new Athlete("Behzad", "Moradi", 1362);
        personOne.showAthleteInfo();
        Athlete personTwo = new Athlete("Ahmad", "Sohrabi", 1346);
        personTwo.showAthleteInfo();
        //        Athlete personThree = new Athlete("Ramin", "Jafari", 1371);
        //        personThree.showAthleteInfo();
        System.out.println("The number of all registrations is "
        + personOne.showAllAthletes());
    }
}

برنامه را اجرا می کنیم:

می بینیم که برنامه به صورت خودکار تعداد آبجکت های ساخته شده از روی کلاس Athlete را تشخیص داده و نتیجه ی آن را در کنسول به نمایش در می آورد.

دانلود فایل‌های تمرین
لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
کاربر میهمان
کاربر میهمان
۱۳۹۷/۰۱/۱۹
فایل تمرین ویروسی است لطفا رسیدگی کنید.
سپاس
کاربر میهمان
کاربر میهمان
۱۳۹۶/۰۸/۰۹
Ln مخفف چه کلمه ای هست لطفا بگید
stack programer
stack programer
۱۳۹۶/۰۸/۰۹
line، در کل منظور دستور این است، که در خط بعد پرینت کند.

در پاسخ به

حسام مصلح
حسام مصلح
۱۳۹۴/۱۱/۱۶
سلام میخواستم بپرسم اگه 100 تا کاربر داشته باشیم باید اینطوری اطلاعاتشونو وارد کنیم؟؟؟ اینجوری که خیلی وقت گیره
سهراب
سهراب
۱۳۹۵/۰۵/۰۴
َسلـام. شما میتوانید اولا یک متد برای دریافت اطلاعات در خود کلاس بنویسید که Main شلوغ نشود و ضمنا برای در یافت نیاز نباشد تعداد زیادی متغیر تعریف کرد، در مرحله دوم نیز میتوانید یک آرایه از جنس شی تان بسازید و با استفاده از حلقه ها(for, while,do While) به تعداد دلخواهتان شی بسازید و برای هر کدام متد دریافت اطلاعات را فراخوانی کنید. برای مثال:
Athlete[ ] athleteList= new Athleter[4];
فقط یادتان باشد باید به ازای هر یک از خانه های آرایه یکبار شی را معرفی (Intialize) کنید.
موفق باشید.

در پاسخ به

muhamad64
muhamad64
۱۳۹۷/۰۱/۰۷
میشه لطفا کاملتر توضیح بدین
زدم نشد!!

در پاسخ به

کاربر میهمان
کاربر میهمان
۱۳۹۴/۱۱/۰۵
سلام
من کلمه static رو از پشت متد showAllAthletes برداشتم و برنامه رو تست کردم و خروجی برنامه هیچ تفاوتی با حالت قبل نداشت ...؟؟؟ !!! پس دلیل وجود static چیست؟
حسام مصلح
حسام مصلح
۱۳۹۴/۱۱/۱۵
سلام دوست عزیز تفاوت متغییر استاتیک با یه متغییر معمولی در 2 چیزه
1.مقدار دهیه اولیه فقط یک بار انجام میشود
2.هنگام خروج از تابع از بین نمیرود

در پاسخ به

هاشم همراز
هاشم همراز
۱۳۹۴/۱۰/۰۲
با سلام وعرض خسته نباشید
من وقتی کد
System.out.println("The number of all registerations is "
+ personOne.showAllAthletes());
رو مینویسم دور خط
personOne.showAllAthletes())
یه خط زرد رنگ میکشه و کنارش این اخطار رو میده
The static method showAllAthletes() from the type Athlete should be accessed in a static way
باید چیکار کنم؟
با تشکر
bijan9
bijan9
۱۳۹۴/۰۹/۲۱
thank you