آموزش ایجاد متد در کلاس های جاوا
در زبان جاوا، کلاس ها قادر هستند تا علاوه بر داده ها، متدها را نیز در خود جای دهند. بعنوان مثال، فرض کنید که یک کلاس به نام Employee داریم و می خواهیم برای آن یک متد ایجاد کنیم به طوری که با صدا زدن این متد در دیگر کلاس ها، مقدار متغیری به نام empNum برگردانده شود.
مثلا می توانیم نام این متد را ()getEmpNum بگذاریم. و عنوان این متد را ()public int getEmpNum قرار می دهیم زیرا می خواهیم این متد، سطح دسترسی public داشته باشد و یک مقدار صحیح را برگرداند.
یکی از روش های نوشتن نام متدها در جاوا این است که اگر این متد قرار است مقداری را به ما برگرداند، در ابتدای نام این متد، از کلمه ی get استفاده می کنیم. البته این کار ضروری نیست بلکه رسم بر این است که از این روش استفاده شود.
عکس 3.16 متد ()getEmpNum را به ما نشان می دهد.
قرارداد:
از این به بعد، به طور قراردادی، به متدهایی که نیاز به نمونه گیری دارند، متدهای نمونه یا Instance Method می گوییم.
همان طور که مشاهده می کنید، متد ()getEmpNum تنها حاوی یک عبارت دستوری در داخل خود است. این دستور باعث می شود که بتوانیم به مقدار متغیر عضوی empNum که از نوع private است دسترسی داشته باشیم.
توجه کنید که، برخلاف متدهایی که قبلا در این فصل ایجاد کردیم، متد ()getEmpNum از اصلاحگر static استفاده نمی کند. در متدهایی که تنها به اشیاء تعلق دارند، کلمه ی کلیدی static مورد استفاده قرار نمی گیرد. در صورتی که شما می خواهید یک برنامه بسازید که در آن متد ()main نیز وجود دارد، اکثر متدهای شما static خواهند بود،و شما می توانید این متدها را بدون ایجاد اشیاء، در داخل متد ()main فراخوانی کنید. اما اگر می خواهید یک کلاس ایجاد کنید که اشیاء از آن کلاس نمونه گیری شوند، احتمالا اکثر متدهای شما از نوع static نیستند، زیرا شما می خواهید از طریق اشیاء با آنها ارتباط برقرار کنید. بعنوان مثال، متد ()getEmpNum نباید از نوع static باشد، زیرا این متد برای هر شیء Employee که شما از آن نمونه گیری کنید، یک مقدار empNum متفاوت برمی گرداند.
نکته:
متدهای غیر static، متدهایی هستند که توسط نمونه گیری از اشیاء مورد استفاده قرار می گیرند و به آنها متدهای نمونه(instance methods) گفته می شود.
فهمیدن اینکه چه موقع باید متغیرها و متدها را از نوع static یا غیر static قرار دهیم، همواره برای برنامه نویسان جدید، چالش برانگیز بوده است. جدول 3.1 خلاصه ی این مباحث را نشان می دهد:
استاتیک(static) | غیر استاتیک(nonstatic) |
در زبان برنامه نویسی جاوا، کلمه ی static یک کلمه ی کلیدی است. | برای آیتم های غیر استاتیک، هیچ کلمه ی کلیدی وجود ندارد. و اگر برای آنها کلمه ی static تعریف نشود، به طور پیش فرض غیراستاتیک خواهند بود. |
به متغیرهای static در داخل یک کلاس، متغیرهای کلاس(class fields) گفته می شود. | به متغیرهای غیر static در داخل یک کلاس، متغیرهای نمونه(instance variables) گفته می شود. |
به متدهای static، متدهای کلاس(class methods) گفته می شود. | به متدهای غیر static، متدهای نمونه(instance methods) گفته می شود. |
هنگامی که شما از یک متغیر یا متد استاتیک استفاده می کنید، از یک شیء استفاده نمی کنید. بعنوان مثال در دستور: ;()JOptionPane.showDialog |
هنگامی که شما از یک متغیر یا متد غیر استاتیک استفاده می کنید، باید از یک شیء استفاده کنید. بعنوان مثال در دستور: ;()System.out.println |
هنگامی که شما یک کلاس ایجاد می کنید که دارای یک متغیر کلاس(استاتیک) است، و سپس از این کلاس، 100 شیء نمونه گیری کنید، یک کپی از این متغیر در حافظه ایجاد می شود. | هنگامی که شما یک کلاس ایجاد می کنید که دارای یک متغیر غیر استاتیک(نمونه) است، و سپس 100 شیء نمونه گیری کنید، به تعداد 100 کپی از این متغیر در حافظه ایجاد می شود. |
هنگامی که شما یک متد استاتیک(متد کلاس) در یک کلاس ایجاد می کنید، و سپس از این کلاس، 100 شیء نمونه گیری کنید، تنها یک کپی از این متد در حافظه ایجاد می شود و به این متد کلمه ی کلیدی this تعلق نمی گیرد. | هنگامی که شما یک متد غیر استاتیک در یک کلاس ایجاد می کنید و سپس از این کلاس 100 شیء نمونه گیری کنید، تنها یک کپی از این متد در حافظه ایجاد می شود، اما به این متد یک کلمه ی کلیدی this تعلق می گیرد که حاوی آدرس شیء ای است که در حال حاضر از آن استفاده می کند. |
متغیرهای کلاس(class fields) که از نوع static هستند، با متغیرهای نمونه(instance variables) یکسان نیستند. سیستم به ازای هر کلاس، تنها یک مکان برای نگهداری متغیرهای کلاس اختصاص می دهد، بدون توجه به اینکه شما از این کلاس چه تعداد نمونه گرفته باشید. سیستم تنها برای اولین بار، به متغیرهای کلاس، در حافظه فضا اختصاص می دهد. و هر نمونه ای که از این کلاس بگیریم، این نمونه تنها همان کپی از متغیر کلاس استاتیک را به اشتراک خواهد گذاشت. | متغیرهای نمونه(instance variables) و متد های نمونه(instance methods) که از نوع غیر استاتیک هستند، اگر از آنها نمونه گیری شود، سیستم در هر نمونه، به هر یک از متغیرهای غیر استاتیک، یک فضای جداگانه در حافظه اختصاص می دهد. |
برای اطلاعات بیشتر در مورد کلمه ی کلیدی this به فصل بعدی مراجعه نمایید.
وقتی که یک کلاس حاوی یک یا چند متغیر عضوی(data fields) است، به راهی نیاز داریم تا مقادیر را به این متغیرها انتساب دهیم. فرض کنید یک کلاس به نام empNum داریم، که در داخل آن یک متغیر عضوی به نام empNum وجود دارد. حالا برای اینکه بتوانیم مقداری را به این متغیر انتساب دهیم، به یک متد احتیاج داریم تا این کار را برای ما انجام دهد. در عکس 3.17 یک متد به نام ()setEmpNum ایجاد کرده ایم. این متد مقادیر را به متغیر عضوی empNum انتساب می دهد.
در زبان جاوا، به طور قراردادی نام متدهایی که مقادیر را انتساب می دهند، با پیشوند set شروع می کنیم. این ضروری نیست که حتما از کلمه ی set در ابتدای نام متدها استفاده کنیم، بلکه تنها رسم بر این است که این کار را انجام دهیم. این متد، از نوع void می باشد، زیرا نمی خواهیم با فراخوانی این متد، مقداری برگردانده شود. این متد تنها یک عدد صحیح(integer) را دریافت می کند و در متغیر محلی emp قرار می دهد، سپس آن را به متغیر عضوی empNum انتساب می دهد.
نکته:
به متدهایی که مقادیر را set می کنند(انتساب می دهند) متدهای mutator گفته می شود و به متدهایی که مقادیر را دریافت(get) می کنند، متدهای accessor گفته می شود.
عکس 3.18 کلاس کامل شده ی Employee را نشان می دهد که حاوی یک متغیر عضوی private است؛ همچنین حاوی دو متد public می باشد. همه ی اینها غیر استاتیک(nonstatic) می باشند. هنگامی که از کلاس Employee چند شیء تهیه کنیم، هر یک از این اشیاء دارای یک متغیرِ empNum مخصوص به خود خواهند شد. و هر یک از این اشیاء به دو متد دسترسی خواهند داشت. یک متد که مقادیر را به متغیر empNum آن شیء انتساب می دهد و یک متد که مقدار ذخیره شده در متغیر empNum را دریافت می کند:
هنگامی که شما یک کلاس مثل کلاس Employee ایجاد می کنید، قادر هستید تا آن را کامپایل کنید. اما نمی توانید این کلاس را اجرا کنید، زیرا این کلاس حاوی متد ()main نیست.
یک کلاس مانند کلاس Employee را می توان بعنوان یک نوع داده برای اشیائی که در داخل دیگر اپلیکیشن ها قرار دارند، در نظر گرفت. در مقاله ی بعدی، به توضیح این موضوع می پردازیم.
- نوشته شده توسط احسان عباسی
- بازدید: 5642