package javalike ; public class Outer_Demo { class Inner_Demo { } } |
کلاس های داخلی به دو نوع تقسیم میشوند:
کلاس های داخلی غیر استاتیک:
کلاس های داخلی یک مکانیزم امنیتی در جاوا هستند.ما میدانیم که modifier یا سطح دسرسی یک کلاس نمیتواند private باشد.اما اگر ما از یک کلاس به عنوان عضو دیگری از کلاس(کلاس داخلی) استفاده کنیم میتوانیم سطح دسرسی کلاس داخلی را private تعریف کنیم. این کار باعث خصوصی سازی اعضای یک کلاس میشود.
کلاس های داخلی بستگی به این که چطور و کجا ازشون استفاده کنیم سه نوع هستند:
کلاس داخلی:
ایجاد یک کلاس داخلی خیلی ساده است!شما تنها نیاز دارید یک کلاس را درون کلاس دیگر پیاده سازی! بر خلاف یک کلاس بیرونی یک کلاس داخلی میتواند private باشد،هنگامی که شما یک کلاس داخلی را private تعریف میکنید،در خارج از کلاس بیرونی از طریق شی نمیتوان به کلاس داخلی و اعضای آن دسرسی پیدا کرد!
برای درک بهتر به دو مثال زیر توجه کنید:
package javalike; class Outer_Demo { private class Inner_Demo { int a = 5; } Inner_Demo in = new Inner_Demo(); } public class Test { public static void main(String[] args) { Outer_Demo out = new Outer_Demo(); System.out. print ln(out.in.a); } } |
خروجی:
خطای کامپایل! |
🌕 به خطایی که حین کد زدن در محیط ایکلیپش نمایش داده میشود خطای کامپایل میگوییم.
🌕 به خطایی که بعد از اجرای برنامه نمایش داده میشود خطای زمان اجرا میگوییم.
💠 توضیحات:
✔ در این مثال ما سه کلاس داریم که دو کلاس Outer_Demo و Inner_Demo تو در تو هستند. و کلاس Test که دارای متد main است برای اجرای دستورات برنامه ازش استفاده میکنیم.
private class Inner_Demo { int a = 5; } |
✔ در کلاس Outer_Demo یک کلاس داخلی به نام Inner_Demo که از نوع private هستش و یک متغیر صحیح به نام a عضو آن است داریم.
Inner_Demo in = new Inner_Demo(); |
✔ در بدنه کلاس Outer_Demo یک شی از کلاس داخلی Inner_Demo ساخته ایم ( تا اینجا مشکلی نیست چون در کلاس بیرونی میتوان از کلاس داخلی شی ساخت).
public class Test { public static void main(String[] args) { Outer_Demo out = new Outer_Demo(); System.out.println(out.in.a); } } |
✔ در کلاس Test قصد داریم یک شی از کلاس بیرونی Outer_Demo بسازیم و از طریق آن به شی کلاس داخلی Inner_Demo به نام in و از طریق شی in به متغیر درون کلاس داخلی Inner_Demo دسرسی پیدا کنیم.
✔ چون کلاس داخلی Inner_Demo از نوع private هستش نمیتوان خارج کلاس بیرونی،از طریق شی به ان دسرسی پیدا کرد! تغییرات کد بالا رو در زیر مشاهده کنید:
در مثال زیر که تغییر یافته مثال بالا هست تنها کلاس داخلی Inner_Demo از نوع private نیست! و همان طور که مشاهده میکنید هیچ خطایی در کامپایل و اجرا آن به وجود نیامده است:
package javalike; class Outer_Demo { class Inner_Demo { int a = 5; Inner_Demo in = new Inner_Demo(); } public class Test { public static void main(String[] args) { }
|
خروجی:
5 |
✔ پس به این نتیجه میرسیم که اگر یک کلاس داخلی از نوع private تعریف کردیم در خارج از کلاس بیرونی نمیتوان از طریق شی به ان دسرسی پیدا کرد.
✔ در زیر روش دسرسی به یک کلاس داخلی private در خارج از کلاس بیرونی آمده است: (این مثال تغییر یافته مثال اول است)
package javalike; class Outer_Demo { private class Inner_Demo { int a = 5; public void print() { } public class Test { public static void main(String[] args) { } |
خروجی:
value of a is 5 |
✔ در اینجا کلاس داخلی ما private هستش اما تونستیم به مقدار متغیر صحیح a درون ان دسرسی پیدا کنیم.
✔ چگونه؟! کلاس داخلی حتی اگر private هم باشه باز میشود در داخل کلاس بیرونی که در آن قرار دارد از ان شی ساخت! پس ما در متد print یک شی از کلاس داخلی Inner_Demo به نام in ساختیم و از طریق شی ساخته شده به اعضای کلاس داخلی دسرسی پیدا کردیم.حال با ساخت شی از کلاس بیرونی در کلاس Test متد print را صدا زدیم و دستور درون آن بدون خطا اجرا شد.
کلاس داخلی محلی - درون متد:
در جاوا ما میتوانیم یک کلاس را داخل یک متد و از نوع محلی شبیه متغیرهای محلی تعریف کنیم.دامنه دسرسی به این نوع کلاس محدود به بدنه متد است.پس یک کلاس داخلی محلی تنها در بدنه یک متد قابل تعریف است.
در زیر نحوه پیاده سازی یک کلاس داخلی محلی که درون یک متد تعریف شده است را مشاهده میکنید:
package javalike ; public class OuterClass { public void methodOuter() { System.out.println("www.javalike1.ir"); } public static void main(String[] args) { |
خروجی:
www.javalike1.ir |
✔ رنگ آبی محدوده کلاس بیرونی ما است.
✔ رنگ قرمز محدوده کلاس داخلی محلی ما که درون متدی از کلاس بیرونی قرار گرفته است.
✔ همان طور که مشاهده میکنید ما یک کلاس داخلی محلی به نام MethodInner_Demo تعریف کرده ایم که یک متد درون خود داره و یک پیامی چاپ میکند.حال در متد methodOuter کلاس بیرونی OuterClass یک شی به نام in از کلاس داخلی محلی MethodInner_Demo ساخته ایم و از طریق شی in متد print درون کلاس داخلی محلی MethodInner_Demo را صدا زده ایم،در پایان یک شی از کلاس بیرونی OuterClass ساخته و از طریق شی ساخته شده از آن متد methodOuter صدا میزنیمفبا این کار دستورات درون این متد اجرا و پیام در خروجی چاپ میشود.
کلاس داخلی بی نام :
در این جلسه زوده بهش بپردازیم! در مباحث شی گرایی و اینترفیس آن را بررسی میکنیم.
کلاس داخلی استاتیک :
یک کلاس داخلی استاتیک یک کلاس تو در تو است که مانند متغیرها و متدهای استاتیک یک کلاس،عضو استاتیک کلاس بیرونی است.از خصوصیات کلاس داخلی استاتیک صدازدن و دسرسی به ان مانند متغیرها و متدهای استاتیک یک کلاس بدون نیاز به نمونه سازی و شی ساختن از کلاسی که درونش قرار دارد است.
نحوه پیاده سازی یک کلاس داخلی استاتیک را ببینید:
package javalike; public class OuterClass { static class innerClass { } } |
***ادامه این جلسه آموزشی را به صورت پی دی اف و مرتب شده در زیر دانلود کنید.
این جلسه آموزشی را میتوانید بصورت کتاب الکترونیکی (PDF شده) در لینک زیر دریافت کنید.
این جلسه آموزشی را بصورت کامل و مرتب شده در لینک زیر دانلود کنید:(در صورت خرابی لینک گزارش دهید)
لینک دانلود
بستن *نام و نام خانوادگی * پست الکترونیک * متن پیام |
دوره های آموزشی برنامه نویسی
انجام پروژه های برنامه نویسی
تدریس خصوصی برنامه نویسی
بیش از 7 سال از فعالیت جاواپرو میگذرد
جاواپرو دارای مجوز نشر دیجیتال از وزارت فرهنگ و ارشاد اسلامی است
جهت ارتباط مستقیم با جاواپرو در واتساپ و تلگرام :
09301904690
بستن دیگر باز نشو! |