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

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

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

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

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

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

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

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

 


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

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

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

 

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

فرض کنید کلاسی به نام کلاس 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 داشته باشید.

 

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

 

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

نظرات  (۲۰)

ممنون عالی بود
سلام مرسی بابت اطلاعات خوبتون. یه دنیا ممنون. بسیار عالی بود.
دمت گرم ... خیلی خوب بود

خیلی عالی توضیح دادید دستتون واقعا درد نکنه.
  • مهدی بابایی
  • بسیار عالی
    مختصر و مفید
    ممنون او زحماتتان
    دمت گرم ، خیلی خوب بود.

    عالی بود
    تنها کاری که می تونم اینکه یه نظر بدم و بگم
     خدا خیرتون بده
    ممنون
    ممنون خیلی خووووووب بود  ممنون مرسی
    عالی متشکرم
    خیلی خوب بود،
    عالی بود
    دست شما دردنکنه
    ممنون عالی بود
    بسیار عالی 
    از زحمتی که کشیدید بسیار ممنونم
  • برنامه نویس
  • بسیار ممنون 

    عالی بود
    متشکر

    خیلی روان و خوب بود

    خیلی عالی بود... چندتا سایت گشتم چرت و پرت می گفتند ولی شما خوب گفتی

    ایول دمت گرم 

     

     

  • نوید بذرکار
  • سلام

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

    مثال زیر در قسمت کامنت شماره پنج ارور دارد ایا به همین علت است؟

     


    public class OuterClass { 
      private int value  = 2; /*1*/ 
      class Inner{ /*2*/ 
        public void f(){ OuterClass.this.value = 5; /*3*/  } 
      } 
      static class InnerStatic{ /*4*/ 
        public void f(){  OuterClass.this.value = 5; /*5*/  } 
      } 
      public static void main(String[] args)  { 
        OuterClass outer = new OuterClass(); /*6*/ 
        OuterClass.Inner inner = outer.new Inner(); /*7*/ 
        InnerStatic innerStatic = new InnerStatic(); /*8*/ 
      } 
    //نوید بذرکار} 

    ارسال نظر

    ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
    شما میتوانید از این تگهای html استفاده کنید:
    <b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
    تجدید کد امنیتی