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