در این پست توضیحاتی در مورد Static داده می شود که بیانگر تاثیر این modifier روی متدها و متغییر هاست:

Static method:

فرض می کنیم یک کلاس به نام Person داریم و Person های ما شامل مرد و زن می شوند:

class Person{

String gender;

public Person(String gender){
this.gender=gender;
}
public chooseSet(){
....;
}

public static sleep() {
....;
}
}

 حال فرض کنیم یک متد به نام ()chooseSet در این کلاس داریم. کار این متد انتخاب یک لباس مناسب برای Person است. عمل انتخاب لباس عملی ست که به جنسیت Person ربط دارد پس این متد را روی شی ی که برنامه نویس ساخته (developer object)و جنسیت آن مشخص است صدا میزنیم. به این شکل:

public static void main(){
Person man=new Person("male");
man.chooseSet();
}

حال فرض کنیم یک متد به نام sleep نیز داریم. کار متد sleep دادن اطلاعاتی درمورد خواب انسان است و این موضوع به اشیا ساخته شده توسط برنامه نویس ربطی ندارد. در همین مثال بین خوابیدن زن و مرد تفاوتی وجود ندارد پس بدون ساخت شی توسط برنامه نویس و صرفا با داشتن کلاس Person می توان متد Sleep را صدا زد. در این وضعیت از static استقاده می کنیم. 

public static void main(){
Person.sleep();
}

همانطور که مشاهده می کنید دیگر نیازی به ساخت شی از Person نبود. 

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

Static variable:

مفهوم static برای variable ها هم بسیار مشابه method هاست. فرض کنیم میخوایم تعداد افراد را بشماریم. و در کلاس Person یک متغییر تعریف می کنیم به نام numberOfPerson که بعد از ساخت هر شی از این کلاس یک عدد آن را اضافه می کنیم:

class Person{
int numberOfPerson ;

public Person(String gender){
this.gender=gender;
}
...

}

 در این وضعیت با هر بار ساخت یک شی از Person این متغییر مقدار 0 را به خود می گیرد. و هر مقداری که در آن بریزیم برای instance بعدی هیچ فرقی ندارد، چون همانطور که برای متدها گفته شد در متغیرها هم یک متغیر غیر استاتیک متعلق به نمونه ساخته شده از کلاس است اما یک متغیر استاتیک متعلق یه کلاس است:

    public static void main(){

Person man=new Person("male");
man.numberOfPerson ++; مقدار 1

Person woman=new Person("female");
woman.numberOfPerson ++; مقدار 1

Person boy=new Person("male");
boy.numberOfPerson ++; مقدار 1

Person girl=new Person("female");
girl.numberOfPerson ++; مقدار 1

}

همانطور که در کد بالا دیده می شود هر numberOfPerson مربوط به یک نمونه خاص است در نتیجه با ساخت یک شی جدید نمیتوان انتظار داشت که متغیر numberOfPerson مقدارش در نمونه قبلی را در خود داشته باشد. راه حل این موضوع این است که کاری کنیم که متغیر numberOfPerson به جای اینکه در هر شی مخصوص آن شی باشد بین تمام اشیا بصورت مشترک باشد و در واقع به کلاس متعلق باشد نه به نمونه های کلاس. اینکار با static کردن این متغیر امکان پذیر است. پس تغییرات به شکل زیر خواهد بود:

class Person{
static int numberOfPerson ;

public Person(String gender){
this.gender=gender;
}

...
}
public static void main(){

Person man=new Person("male");
man.numberOfPerson ++; مقدار 1

Person woman=new Person("female");
woman.numberOfPerson ++; مقدار 2

Person boy=new Person("male");
boy.numberOfPerson ++; مقدار 3

Person girl=new Person("female");

girl.numberOfPerson ++; مقدار 4
int i=Person.numberOfPerson; مقدار 4
}

همانطور که مشاهده می کنید چهار شی داریم و مقدار numberOfPerson نیز 4 است. همانطور که در کد بالا دیده می شود زمانی که numberOfPerson استاتیک است با نام کلاس نیز می توانیم به آن دسترسی پیدا کنیم یعنی Person.numberOfPerson. برای فهم بهتر تفاوت به مثال زیر توجه کنید:

با فرض nonstatic بودن numberOfPerson:

public static void main(){
Person man=new Person("male");
man.numberOfPerson =4;

Person woman=new Person("female");
woman.numberOfPerson=40;

Person boy=new Person("male");

boy.numberOfPerson=14;
Print(man.numberOfPerson); نتیجه 4
Print(woman.numberOfPerson); نتیجه 40
Print(boy.numberOfPerson); نتیجه 14
}

با فرض static بودن numberOfPerson:

public static void main(){

Person man=new Person("male");

man.numberOfPerson =4;

Print(man.numberOfPerson); نتیجه 4
Print(Person.numberOfPerson); نتیجه 4


Person woman=new Person("female");
woman.numberOfPerson=40;

Print(man.numberOfPerson); نتیجه 40
Print(woman.numberOfPerson); نتیجه 40
Print(Person.numberOfPerson); نتیجه 40


Person boy=new Person("male");
boy.numberOfPerson=14;

Print(man.numberOfPerson); 1نتیجه 4
Print(woman.numberOfPerson); 1نتیجه 4
Print(boy.numberOfPerson); نتیجه 14
Print(Person.numberOfPerson); نتیجه 14
}

همانطور که دیده می شود زمانی که به هر شکلی مقدار متغیر استاتیک تغییر کند این تغییر در تمام نمونه ها اتفاق می افتد.