Static و This :

من ارسلان میربزرگی در این مقاله در مورد این دو کلمه کلیدی و کاربرد آنها در زبان جاوا با شما بیشتر صحبت خواهم کرد. در زبان جاوا کلمات کلیدی متعددی وجود دارند که نمی‌توانید از آنها برای نامگذاری متغیرها و یا شناسه‌ها استفاده کنید. static و this 2 کلمه کلیدی هستند که در این دسته بندی قرار می‌گیرند. کلمه کلیدی static در بحث مدیریت حافظه مورد استفاده قرار می‌گیرد و عمده ارتباط آن با خود کلاس است. کلمه کلیدی this نیز، دامنه کاربردی زیادی در زبان برنامه نویسی جاوا دارد. از این کلمه کلیدی برای اشاره به شی کنونی و شی بالایی استفاده می‌شود.
static و this در جاوا

static و this در جاوا به چه صورت اند؟

گفتیم که کلمه کلیدی static در بحث مدیریت حافظه مورد استفاده قرار می‌گیرد و عمده ارتباط آن با خود کلاس است. از این کلمه کلیدی، در موارد زیر استفاده می‌شود :
• در مورد متغیر یا متغیر کلاس
• در مورد متد یا متد کلاس
• در مورد بلوک
• در مورد کلاس داخلی

متغیر استاتیک در جاوا

اگر در زبان جاوا، در زمان تولید یک متغیر، برنامه نویس از کلمه کلیدی static استفاده کند، باید از این متغیر برای ویژگی‌های مشترک بین همه اعضای یک  کلاس استفاده شود. به طور مثال نام شرکت برای کارکنان آن شرکت یا نام دانشگاه برای دانشجویان. علاوه بر این موضوع، متغیر استاتیک فقط یک مرتبه آن هم در موقعی که کلاس در حال لود شدن است، حافطه را دریافت می‌کند و از این نظر باید تمهیدات لازم توسط برنامه نویس، در نظر گرفته شود. مزیتی که استفاده از متغیر استاتیک در زبان جاوا دارد این است که در میزان حافظه مصرفی صرفه جویی می‌شود.
 

کد بالا، مثالی برای استفاده از متغیر استاتیک در زبان جاوا است. فرض کنید لیستی شامل 500 دانشجو داریم. اگر قرار باشد برای تک تک آنها، نام دانشگاه را وارد کنیم، میزان حافظه مصرفی افزایش می‌یابد در صورتی که اگر از متغیر استاتیک استفاده کنیم، صرفا به میزان یک بار استفاده، حافظه در نظر گرفته می‌شود.
مثال :
 

خروجی :
 

مقایسه بین شمارنده استاتیک و شمارنده غیر استاتیک

همانطور که مشاهده می‌کنید، در کد زیر متغیر counter به صورت استاتیک تعریف نشده است. بنابراین در این کد، هر شی دارای متغیر مخصوص به خود است که این متغیر در همه  نمونه هایی که از این کلاس تولید می‌شود، متفاوت است. اگر به خروجی این کد دقت کنید، میبینید که این متغیر، در هر شی صرفا یک مرتبه اضافه شده است.
مثال :
 

خروجی :
 

static و this در جاوا
در مثالی دیگر، این بار متغیر counter را به شکل استاتیک تعریف می‌کنیم. در نتیجه این متغیر، بین همه اعضای این کلاس مشترک خواهد بود. در این مثال اگر به مقادیر این متغیر چیزی اضافه شود، متغیر counter نیز به همان اندازه تغییر خواهد کرد. در این مثال به کد و خروجی آن توجه کنید.
مثال :
 

خروجی :

 

متد استاتیک در جاوا

اگر کلمه کلیدی static را در موقع تولید یک متد به کار ببرید، منجر به 3 اتفاق خواهد شد. اتفاق اول این است که این متد، دیگر یک نمونه ساخته شده از کلاس نیست و به کلاس تعلق دارد. اتفاق دوم این است که این متد بدون نیاز به ساخت هیچ نمونه‌ای از کلاس، قابل فراخوانی است و سومین اتفاق نیز این است که این متد، قابلیت دسترسی به متغیرهای استاتیک و تغییر مقادیر آنها را دارد.
مثال :
 

خروجی :
 

به یک مثال دیگر نیز در این رابطه توجه کنید.
مثال :
 

خروجی :
 

متد استاتیک چه محدودیت هایی دارد؟

متدهای استاتیک دارای 2 محدودیت بزرگ می‌باشند. اولین محدودیت این است که این متدها، به متدهایی که استاتیک نیستند، دسترسی ندارند در نتیجه نمی‌توانند آنها را فراخوانی کنند. دومین محدودیت این است که کلمات کلیدی this و super در این متدها قابل استفاده نیستند.
مثال :
 

خروجی :
 

با توجه به این مثال، شاید برایتان این سوال ایجاد شده باشد که چرا متد main را به عنوان یک متد static در نظر میگیریم؟ در پاسخ این سوال باید بگوییم که علت این کار این است که  در صورتی که بخواهیم از این متد استفاده کنیم، نیازی به ساخت یک شی دیگه و مصرف حافظه بیشتر نباشد.

 بلوک استاتیک در جاوا

از بلوک استاتیک در زبان جاوا به منظور دادن یک مقدار اولیه به تک تک اعضای استاتیک استفاده می‌شود. بلوک استاتیک در زبان جاوا پیش از اجرا شدن متد main  و در مرحله ای که کلاس‌ها لود می‌شود، پیاده سازی می‌شود.
مثال :
 

خروجی :
 

سوال دیگری که شاید پیش بیاید این است که آیا این امکان اجرای برنامه‌ای بدون وجود متد main وجود دارد؟ در پاسخ این سوال نیز باید بگوییم که بله این امکان در JDK هایی که دارای ورژن پایین تر از ورژن 1.7، بودند، اجرای برنامه بدون نیاز به وجود متد main  و به وسیله بلوک های استاتیک انجام میشد.
مثال :
 

خروجی :
 

خروجی این برنامه در نسخه‌های جدید :
 

کلمه کلیدی this در جاوا

کلیدی this، دامنه کاربردی زیادی در زبان جاوا دارد. از این کلمه کلیدی برای اشاره به شی کنونی و شی بالایی استفاده می‌شود. اگر بخواهیم کاربردهای این کلمه کلیدی را به صورت تیتروار بشماریم، میتوانیم به موارد زیر اشاره کنیم :
• اشاره به متغیر نمونه در کلاس خود
• فراخوانی متدهای یک کلاس به صورت ضمنی
• فراخوانی کانستراکتور یک کلاس
• استفاده به عنوان آرگومان در زمان فراخوانی متد
• استفاده به عنوان آرگومان در یک کانستراکتور
• برگرداندن نمونه تولید شده از یک کلاس، از داخل متد

اشاره به متغیر نمونه تولید شده در کلاس

 اگر در زمان مقدار دهی در قسمت‌هایی مانند کانستراکتور و … ، نام متغیرهایی که در کلاس وجود دارند، با نام آرگومان‌های ورودی یکسان باشند، کلمه کلیدی this مفید خواهد بود. از این کلمه کلید به منظور اشاره به متغیرهایی که در کلاس قرار دارند استفاده می‌شود. مثال زیر، نمونه ای از کاربرد این کلمه کلیدی است.
مثال :
 

خروجی :
 

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

خروجی :
 

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

خروجی :
 

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

 فراخوانی متد در کلاس

از کلمه کلیدی this می توانید به منظور فراخوانی متدهای یک کلاس، استفاده کنید. در صورتی که از این کلمه کلیدی استفاده نکنید، کامپایلر به شکل خودکار، این کلمه کلیدی را به کد شما اضافه خواهد کرد.
مثال :
 

خروجی :

فراخوانی کانستراکتور کلاس

فرض کنید کلاس شما چند کانستراکتور مختلف دارد و شما قصد دارید به منظور صرفه جویی در نوشتن کدها، از یکی از کانستراکتورهای خود در درون یک کانستراکتور دیگر بهره ببرید. در این حالت بهتر است از کلمه کلیدی this استفاده کنید.
مثال :
 

خروجی :
 

در این مثال، همانطور که مشاهده می‌کنید، کانستراکتور فراخوانی شده، داری چند پارامتر است.
مثال :
 

خروجی :
 

از this به منظور تشکیل یک زنجیره ارتباطی بین کانستراکتورها نیز استفاده می‌شود. علت این کار نیز بیشتر کوتاه تر کردن کد و زیباتر شدن آن است.
مثال:
خروجی:
 

باید توجه داشته باشید که کلمه کلیدی this لازم است تا حتما در اولین خط از کانستراکتور نوشته شود.
مثال:
 

خروجی:
 

استفاده از کلمه کلیدی this به عنوان آرگومان ورودی در یک متد

در بحث Event Handling ممکن است از کلمه کلیدی this به عنوان آرگومان ورودی در یک متد استفاده شود.
مثال :
 

خروجی :
 

در واقع در بحث Event Handling در زمانی که لازم است تا برای یک کلاس، رفرنس در نظر گرفته شود، از این کلمه کلیدی استفاده میشود.

استفاده از کلمه کلیدی this در هنگام فراخوانی کانستراکتور

با استفاده از این ویژگی، می توانید از کلمه کلیدی this به عنوان یک پارامتر برای کانستراکتور استفاده کنید.
مثال :
 

خروجی :
 

 استفاده از کلمه کلیدی this به منظور برگرداندن نمونه تولید شده

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

مثال :
 

خروجی :
 

در پایان این مقاله، کلمه کلیدی this را تست میکنیم که ببینیم آیا این کلمه کلیدی، قادر به برگرداندن همان نمونه کلاس است یا نه؟ در مثال زیر این تست را انجام داده‌ایم.
مثال :
 

خروجی :

و در آخر

وبسایت میربزرگی قصد دارد تا با ارائه مقاله ها و تجربه‌های کاربردی شما را در زمینه یادگیری و رفع اشکالاتتان کمک کند. در صورت وجود هرگونه سوالی به من ایمیل بزنید.

5 دیدگاه

  1. بابک 03/26/2021 در 1:36 ب.ظ - پاسخ

    خیلی عالی و کاربردی

  2. مهدی 03/26/2021 در 1:37 ب.ظ - پاسخ

    من میتونم چندتا سوال تو ایمیل بپرسم ازتون؟

    • admin 03/26/2021 در 5:21 ب.ظ - پاسخ

      بله حتما

  3. تینا 03/28/2021 در 12:19 ب.ظ - پاسخ

    مثال ها کامل و کاربردی ممنون از انتشار مقاله

    • admin 03/28/2021 در 12:22 ب.ظ - پاسخ

      سپاس

ارسال دیدگاه

9 − هفت =

این جا قراره با هم زبان برنامه نویسی جاوا رو یاد بگیریم. اگه جواب سوالتو توی مقاله ها پیدا نکردی، میتونی بهم ایمیل بزنی تا راهنماییت کنم. اگر موضوعاتی رو پیشنهاد داری حتما برام بفرست. منتظر ایمیلتم

پیام با موفقیت ثبت شد.
خطایی رخ داده است.