استارت‌آپ و کارآفرینی

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

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

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

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

مثال:

Car car1 = new Car();
car1.speed = 120;
Car car2 = new Car();
car2.speed = 40;

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

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

مثال:

public class Car {
	public static int wheels = 4;
	
	public int speed;
}

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

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

Car car1 = new Car();
car1.speed = 120;
Car car2 = new Car();
car2.speed = 40;
		
System.out.println(car1.wheels);
System.out.println(car2.wheels);

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

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

Car car1 = new Car();
car1.speed = 120;
Car car2 = new Car();
car2.speed = 40;
		
System.out.println(car1.wheels);
System.out.println(car2.wheels);
		
car1.wheels = 12;
		
System.out.println(car1.wheels);
System.out.println(car2.wheels);

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

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

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

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

مثال:

public class Car {
	public static int wheels;
	public static int seats;
	
	static {
		wheels = 4;
		seats = 5;
	}
}

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

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

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

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

public static void main(String[] args)

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

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

مثال:

public static int test() {
	System.out.println("a static method");
	return 1;
}

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

static public int test() {
	System.out.println("a static method");
	return 1;
}

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

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

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

مثال:

Car.test();

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

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

5 نظرات
  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 تعقیر می کنه در این کد.

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.