هنر برنامه نویسی

چرا و چطور برنامه نویس خوبی باشیم ؟!

هنر برنامه نویسی

چرا و چطور برنامه نویس خوبی باشیم ؟!

۱ مطلب با کلمه‌ی کلیدی «static method» ثبت شده است

تفاوت فیلد ها و متد های استاتیک و غیر استاتیک

فهیم آیت | جمعه, ۲۹ ارديبهشت ۱۳۹۱، ۱۰:۵۱ ب.ظ | ۲۰ نظر

متد های استاتیک و غیر استاتیک چه تفاوتی دارند ؟

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

 


در مطلبی که در مورد کلاس ها و اشیا توضیح داده شد ، اشاره کردیم که زمانی که از یک کلاس ، یک شی ساخته می شود ، می توانید با استفاده از نقطه (.) به متد های آن شی دسترسی پیدا کنید.

مثلا زمانی که کلاسی به نام ماشین داشته باشید و در این کلاس متدی به نام روشن شو وجود داشته باشد ، تمام اشیاءی که از روی کلاس ماشین ساخته شده باشند ، این متد را دارند و شما می توانید آن متد را صدا بزنید.

اما واضح است که نمی توانید به کلاس ماشین بگویید روشن شو ، چرا که متد روشن شدن، بسته به خصوصیات هر یک از این اشیا فرق دارد ، مسلما روشن شدن ماشینی که بنزین ندارد و باطری آن هم مدت هاست که از کار افتاده ، خیلی با سایر ماشین ها تفاوت دارد !!!

 

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

فرض کنید کلاسی به نام کلاس MathHelper داریم  که می خواهیم یک سری توابع ریاضی که زیاد استفاده می شوند را در این کلاس بگنجانیم ، تابع سینوس را در نظر بگیرید. مهم نیست که از این کلاس MathHelper چند شی بسازید یا این اشیا چه خصوصیاتی داشته باشند ، متد سینوس یک عدد می گیرد و سینوس آن عدد را محاسبه می کند و بر می گرداند.

به این گونه متد ها استاتیک یا ایستا گفته می شوند  ، به این معنی که برای صدا زدن متد ، نیازی به ساختن شی از کلاس نمی باشد و این متد مستقیما از روی کلاس صدا زده می شود :

float result  = MathHelper.sinus(90) ;

در این دستور یک متغیر اعشاری به نام result یا حاصل تعریف کرده ایم و سینوس 90 درجه را محاسبه و در این متغیر ریخته ایم.

تعریف متد ها و فیلد های استاتیک نیز ساده است.

کافیست در هنگاه تعریف ، کلمه static بعد از کلمه تعریف سطح دسترسی اضافه شود .

مثلا کلاس MathHelper چنین ترکیبی خواهد داشت:

public class MathHelper{


public static float sinus (float degree) {

float sin = 0 ;

// calculate the sinus

return sin  ;

}

}

 

دقت داشته باشید که در این مثال ، برای سادگی برنامه ، دستورات مربوط به محاسبه مقدار سینوس ذکر نشده.

همچنین دقت داشته باشید که عبارت calculate the sinus یک دستور جاوا نیست. در جاوا هر خطی که در ابتدای آن // بیاید ، کامنت (comment) نامید می شود. کامنت ها به این معنی هستند که این خط دستور نیست و به زبان جاوا نوشته نشده اند و اجرا نخواهد شد ، بلکه برای خواندن برنامه نویس هستند.

 

نکته مهم در مورد متد های غیر استاتیک دیگر این است که از داخل یک متد می توانید متد های دیگر همان شی  و کلاس را صدا بزنید ، اما برای صدا زدن متدهای کلاس های دیگر ، باید حتما یک شی از آن کلاس داشته باشید.

در مورد متد های استاتیک این گونه است که برای صدا زدن یک متد استاتیک ، نیازی به داشتن یک شی از کلاس مربوطه نیست.

اما برای صدا زدن متد ها غیر استاتیک از داخل یک متد استاتیک ، حتما باید یک شی از جنس کلاس مربوطه داشته باشید ،

برای روشن تر شدن موضوع ، فرض کنید کلاس MathHelper که پیش تر توضیح داده شد، دو متد دیگر به نام A و B داشته باشد:

 

public class MathHelper{


public static float sinus (float degree) {

float sin = 0 ;

// calculate the sinus

return sin  ;

}


public void a(){

}


public void b(){

}

}

شما می توانید متد b را مستقیما از داخل a صدا بزنید ، یعنی می توانید متد a را اینگونه بنویسید :

public a(){

b() ;

}

اما از داخل متد سینوس که استاتیک است نمی توانید a  و b را صدا بزنید ، چرا که این دو متد استاتیک نیستند و برای دسترسی به آنها باید حتما یک شی از جنس MathHelper داشته باشید.

 

در پایان ، به یاد داشته باشید که متد های استاتیک ، زمانی بکار گرفته می شوند که متد مستقل از اشیا باشد و صدا زدن متد در اشیا مختلف ، تاثیری در نتیجه نداشته باشد.

 

در مورد متد ها و فیلد های استاتیک در بخش های بعدی مفصل تر بحث خواهیم کرد.

  • فهیم آیت