آموزش قدم به قدم جاوا – قسمت پانزدهم

در این قسمت با مفهوم استاتیک در جاوا آشنا خواهیم شد.

فیلدهای استاتیک (Static Fields)

همانطور که می‌دانید فیلدهای یک کلاس برای هر نمونه (شی) ساخته شده از آن کلاس به‌خصوص هستند به عبارت دیگر برای هر نمونه ساخته شده از کلاس یک کپی از تمام فیلدهای کلاس وجود دارد و هر شی می‌تواند مقادیر دلخواه خود را درون فیلدهای خود نگهداری کند.

مثال:

کلاسی به نام Car با یک فیلد به نام speed داریم که در این کد دو شی از این کلاس ایجاد کردیم و به فیلد speed آن‌ها مقدار دادیم. حال مقدار فیلد speed برای هر شی یک مقدار مخصوص به همان شی است.

اما گاهی اوقات نیاز داریم فیلدی در کلاس داشته باشیم که مقدار آن برای هر شی ساخته شده از کلاس یکسان باشد.

مثال:

فیلد اول این کلاس یک فیلد استاتیک است (به نحوه استفاده از عبارت static و محل آن دقت کنید). این فیلد بیان‌گر تعداد چرخ‌های ماشین است که مقدار آن را برابر با 4 قرار دادیم. همانطور که گفتیم مقدار این فیلد برای هر شی ساخته شده از کلاس یکسان است (برعکس فیلدهای معمولی)

به کد زیر دقت کنید:

همان‌طور که حدس زدید هر دو دستور چاپ عدد 4 را چاپ خواهند کرد. اگر صد شی دیگر هم از این کلاس ایجاد کنید باز هم مقدار فیلد wheels برای تمام اشیا برابر با 4 خواهد بود.

حتی اگر به صورت زیر مقدار فیلد wheels را از طریق یکی از اشیا تغییر دهید:

خواهید دید که دو دستور چاپ آخر هر دو عدد 12 را چاپ خواهند کرد. البته تعریف فیلد استاتیک به این صورت که هر شی بتواند مقدار آن را تغییر دهد به ندرت در برنامه‌های واقعی اتفاق می‌افتد.

نکته: به فیلدهای استاتیک، متغیر کلاس (Class Variable) نیز گفته می‌شود و علت این نام‌گذاری هم این است که فیلدهای استاتیک مخصوص به کلاس هستند نه هر شی ساخته شده از کلاس.

بلاک‌های استاتیک (Static Blocks)

اگر تعداد زیادی فیلد استاتیک در کلاس خود داشته باشیم می‌توانیم با استفاده از بلاک‌های استاتیک به آن‌ها مقداردهی کنیم. البته می‌توان به روش معمولی هم مقداردهی کرد و استفاده از این بلاک‌ها الزامی نیست.

مثال:

نکته: بلاک‌های استاتیک یک بار و قبل از آن‌که شیئی از کلاس ساخته شود اجرا می‌شوند.

متدهای استاتیک (Static Methods)

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

متد main که تا کنون از آن استفاده می‌کردیم یک متد استاتیک است:

این متد در هر کلاسی که باشد هنگام شروع اجرای برنامه توسط JVM فراخوانی می‌شود.

برای تعریف یک متد استاتیک باید عبارت static را هنگام تعریف آن به‌کار ببریم.

مثال:

می‌توان عبارت static را قبل از تعیین کننده دسترسی هم نوشت:

البته شکل اول رایج‌تر و زیباتر است.

برای فراخوانی یک متد استاتیک از یک کلاس به شکل زیر عمل می‌کنیم:

()نام متد.نام کلاس

مثال:

نکته مهم: متدهای استاتیک نمی‌توانند به متدها یا فیلدهای غیر استاتیک کلاس خود دسترسی داشته باشند چون لازمه دسترسی به فیلدها و متدهای غیر استاتیک یک کلاس وجود شی از آن کلاس است در صورتی که متدهای استاتیک نیازی به وجود شی از کلاس ندارند.

اما برعکس این قضیه مشکلی ندارد یعنی متدهای غیر استاتیک می‌توانند درون خود متدهای استاتیک کلاس خود را فراخوانی کنند یا از فیلدهای استاتیک کلاس خود استفاده کنند.

مصطفی نصیری

دانشجوی نرم افزار هستم و علاقه شدیدی به برنامه نویسی مخصوصا با زبان جاوا دارم! در حال حاضر تمرکزم روی اندرویده. دوست دارم چیزایی که یاد میگیرم رو با بقیه به اشتراک بگذارم :)

همچنین ممکن است دوست داشته باشید ...

۵ واکنش

  1. طه گفت:

    ممنون از شما بابت استمرار در مقاله ها

  2. لگولاس گفت:

    مرسی مطلب خیلی مفیدی بود

  3. محمد علی خاصه پز گفت:

    سلام آقا اینا اشتباهات شما دیگه داره از حد می گذره 🙁
    کی گفته که نمیشه فیلد های استاتیک رو تعقیر داد؟؟؟
    package myClasses;

    public class Printer {
    public static int wheel = 4;
    }

    import myClasses.Printer;

    public class Main {

    public static void main(String[] args) {
    Printer x = new Printer();
    System.out.println(x.wheel);
    x.wheel = 100;
    System.out.print(x.wheel);
    }
    }
    در این قطعه کد می شاهد می کنید که مقدار wheel تعقیر می کنه.
    در ضمن کاربورد کلمه کلید Static برای اینه که دیگه نیازی نباشه برای استفاده از یک جزه تعریف شده به عنوان Static یک شی ایجاد کرد و اینستنس گرفت فقط با نوشتن نام کلاس والد می تونیم به عضو Static دست رسی داشته باشیم.

  4. محمد علی خاصه پز گفت:

    اینجا رو نمی دونم ولی توی #C فیلد هایی که نمیشه تعقیر داد رو با ReadOnly مشخص می کنن.

  5. محمد علی خاصه پز گفت:

    به این شکل میشه فیلد رو فراخانی کرد.
    System.out.print(Printer.wheel);
    بدون گرفتن اینستنس از کلاس printer .
    که بکل مقدار wheel تعقیر می کنه در این کد.

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

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