تفاوت فیلد ها و متد های استاتیک و غیر استاتیک
متد های استاتیک و غیر استاتیک چه تفاوتی دارند ؟
برای این سوال باید در ابتدا تفاوت کلاس ها و اشیا را بدانید. اگر قبلا با این مفاهیم آشنا نشده اید ، مطلب در مورد کلاس ها و اشیا را بخوانید.
در مطلبی که در مورد کلاس ها و اشیا توضیح داده شد ، اشاره کردیم که زمانی که از یک کلاس ، یک شی ساخته می شود ، می توانید با استفاده از نقطه (.) به متد های آن شی دسترسی پیدا کنید.
مثلا زمانی که کلاسی به نام ماشین داشته باشید و در این کلاس متدی به نام روشن شو وجود داشته باشد ، تمام اشیاءی که از روی کلاس ماشین ساخته شده باشند ، این متد را دارند و شما می توانید آن متد را صدا بزنید.
اما واضح است که نمی توانید به کلاس ماشین بگویید روشن شو ، چرا که متد روشن شدن، بسته به خصوصیات هر یک از این اشیا فرق دارد ، مسلما روشن شدن ماشینی که بنزین ندارد و باطری آن هم مدت هاست که از کار افتاده ، خیلی با سایر ماشین ها تفاوت دارد !!!
اماگاهی اوقات می خواهیم متدی طراحی کنیم و بنویسیم که رفتار و عملکرد آن ، مستقل از اشیاء است.
فرض کنید کلاسی به نام کلاس 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 داشته باشید.
در پایان ، به یاد داشته باشید که متد های استاتیک ، زمانی بکار گرفته می شوند که متد مستقل از اشیا باشد و صدا زدن متد در اشیا مختلف ، تاثیری در نتیجه نداشته باشد.
در مورد متد ها و فیلد های استاتیک در بخش های بعدی مفصل تر بحث خواهیم کرد.