آشنایی با کلیدواژۀ 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 در تعریف متدها پرداختیم و دیدیم که چنین متدهایی به متغیرهای استاتیکِ مرتبط با کل کلاس یا به عبارتی به متغیرهای استاتیکِ مربوط به تمامی آبجکت‌های ساخته‌شده از روی آن کلاس دسترسی دارند.

دانلود فایل‌های تمرین

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
@HOSEIN@
@HOSEIN@
۱۳۹۴/۱۲/۱۲
باسلام وخسته نباشید:
من یه موضوعی رودقیقا متوجه نمیشوم
اونم اینه که این کلیدواژه static دقیقا کارش چیه من هرچی تلاش کردم نتونستم بفهمم دقیقا کاربردش مثلن تو متغیرفیلدچیه
اثلن کلن این کلیدواژه به چه کاری میاد اگه میشه بیشترراهنمایی کنید
باتشکر
حسین
حسین
۱۳۹۴/۱۱/۰۵
با سلام و خسته نباشید. آیا اطلاعات هر ورزشکار را در یک آرایه می توانستیم تعریف کنیم؟ آیا متد showAthleteInfo به نوعی یک آرایه است؟
ممنون.
کاربر میهمان
حمیدمن یک کاربر مهمان هستم
۱۳۹۴/۱۰/۰۵
با سلام و عرض خداقوت
چرا هنگام ساختن آبجکت از روی کلاس String نیازی به new String()= نیست اما برای استفاده از کلاسهایی که خودمان ایجاد می کنیم باید حتما =new MainClass() را قرار دهیم؟