menusearch
javapro.ir

♨️ جلسه نوزدهم - کلاس‌‌‌‌های داخلی

جستجو
چهارشنبه ۵ آبان ۱۴۰۰ | ۱۸:۴۲:۳۸
۱۳۹۵/۱۰/۳۰ پنج شنبه
(7)
(0)
♨️ جلسه نوزدهم - کلاس‌‌‌‌های داخلی
♨️ جلسه نوزدهم - کلاس‌‌‌‌های داخلی
جلسه نوزدهم - کلاس‌‌‌‌های داخلی
 
در این جلسه قصد داریم در مورد کلاس‌‌‌‌های داخلی یا تو در تو جاوا بحث کنیم!

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


نحوه نوشتن کلاس داخلی :
در زیر نحوه نوستن کلاس داخلی را مشاهده میکنید.در اینجا کلاس Inner_Demo یک کلاس داخلی
و کلاس Outer_Demo یک کلاس بیرونی هست.
 
package java like  ;
public class Outer_Demo {

   class  Inner_Demo {
       
   }
}

 

کلاس‌‌‌‌های داخلی به دو نوع تقسیم می‌شوند:

  

کلاس‌‌‌‌های داخلی استاتیک (Static Inner classes): 
  • کلاس هایی که اعضای آن استاتیک هستند.
کلاس‌‌‌‌های داخلی غیر استاتیک (Non-Static Inner classes):
  • کلاس هایی که اعضای آن غیر استاتیک هستند.

 
کلاس‌‌‌‌های داخلی غیر استاتیک:
کلاس‌‌‌‌های داخلی یک مکانیزم امنیتی در جاوا هستند.ما می‌دانیم که modifier یا سطح دسرسی یک کلاس نمی‌تواند private باشد.اما اگر ما از یک کلاس به عنوان عضو دیگری از کلاس(کلاس داخلی) استفاده کنیم می‌توانیم سطح دسرسی کلاس داخلی را private تعریف کنیم. این کار باعث خصوصی سازی اعضای یک کلاس می‌شود.


کلاس‌‌‌‌های داخلی بستگی به این که چطور و کجا ازشون استفاده کنیم سه نوع هستند:

  1. کلاس داخلی
  2. کلاس داخلی‌‌‌‌های محلی درون متد
  3. کلاس‌‌‌‌های داخلی بی نام.

 
کلاس داخلی:
ایجاد یک کلاس داخلی خیلی ساده است!شما تنها نیاز دارید یک کلاس را درون کلاس دیگر پیاده سازی! بر خلاف یک کلاس بیرونی یک کلاس داخلی می‌تواند private باشد،هنگامی که شما یک کلاس داخلی را private تعریف میکنید،در خارج از کلاس بیرونی از طریق شی نمی‌توان به کلاس داخلی و اعضای آن دسرسی پیدا کرد!
برای درک بهتر به دو مثال زیر توجه کنید:

 

package java like ;

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 java like ;

class Outer_Demo {

    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.println(out.in.a);
   }

}

 

 

خروجی:

 

5

 

✔ پس به این نتیجه میرسیم که اگر یک کلاس داخلی از نوع private تعریف کردیم در خارج از کلاس بیرونی نمی‌توان از طریق شی به ان دسرسی پیدا کرد.


✔ در زیر روش دسرسی به یک کلاس داخلی private در خارج از کلاس بیرونی آمده است: (این مثال تغییر یافته مثال اول است)

 

package java like ;

class Outer_Demo {

   private class Inner_Demo {

       int a = 5;
   }

   public void print() {
       Inner_Demo in = new Inner_Demo();
       System.out.println("value of a is " + in.a);

   }
}

public class Test {

   public static void main(String[] args) {
       Outer_Demo out = new Outer_Demo();
       out.print();
   }

}

 

خروجی:

 

value of a is 5
 

✔ در اینجا کلاس داخلی ما private هستش اما تونستیم به مقدار متغیر صحیح a درون ان دسرسی پیدا کنیم.


✔ چگونه؟! کلاس داخلی حتی اگر private هم باشه باز می‌شود در داخل کلاس بیرونی که در آن قرار دارد از ان شی ساخت! پس ما در متد print یک شی از کلاس داخلی Inner_Demo به نام in ساختیم و از طریق شی ساخته شده به اعضای کلاس داخلی دسرسی پیدا کردیم.حال با ساخت شی از کلاس بیرونی در کلاس Test متد print را صدا زدیم و دستور درون آن بدون خطا اجرا شد.

 

کلاس داخلی محلی - درون متد:
در جاوا ما می‌توانیم یک کلاس را داخل یک متد و از نوع محلی شبیه متغیر‌‌‌‌های محلی تعریف کنیم.دامنه دسرسی به این نوع کلاس محدود به بدنه متد است.پس یک کلاس داخلی محلی تنها در بدنه یک متد قابل تعریف است.


در زیر نحوه پیاده سازی یک کلاس داخلی محلی که درون یک متد تعریف شده است را مشاهده میکنید:

 

package java like  ;

public class OuterClass {

   public void methodOuter() {
       class MethodInner_Demo {
           public void print() {

               System.out.println("www.java like 1.ir");

           }
       }

       MethodInner_Demo in = new MethodInner_Demo();
       in.print();
   }

   public static void main(String[] args) {
       OuterClass out = new OuterClass();
       out.methodOuter();
   }
}


خروجی:

www.java like 1.ir
 

✔ رنگ آبی محدوده کلاس بیرونی ما است.


✔ رنگ قرمز محدوده کلاس داخلی محلی ما که درون متدی از کلاس بیرونی قرار گرفته است.


✔ همان طور که مشاهده میکنید ما یک کلاس داخلی محلی به نام MethodInner_Demo تعریف کرده ایم که یک متد درون خود داره و یک پیامی چاپ میکند.حال در متد methodOuter کلاس بیرونی OuterClass یک شی به نام in از کلاس داخلی محلی MethodInner_Demo ساخته ایم و از طریق شی in متد print درون کلاس داخلی محلی MethodInner_Demo را صدا زده ایم،در پایان یک شی از کلاس بیرونی OuterClass ساخته و از طریق شی ساخته شده از آن متد methodOuter صدا میزنیمفبا این کار دستورات درون این متد اجرا و پیام در خروجی چاپ می‌شود.

 

کلاس داخلی بی نام :
در این جلسه زوده بهش بپردازیم! در مباحث شی گرایی و اینترفیس آن را بررسی میکنیم.


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


نحوه پیاده سازی یک کلاس داخلی استاتیک را ببینید:

 

package java like ;

public class OuterClass {

   static class innerClass {

   }

}

 

✔ کافیست ابتدای یک کلاس داخلی از کلمه کلیدی static استفاده کنیم.

نحوه نمونه سازی از کلاس داخلی استایک کمی متفاوت تر از نمونه سازی از کلاس داخلی عادی است.
مثال زیر را ببینید:

 

package java like ;

public class OuterClass {

    static String email = "Rahman.zarie92@gmail.com";

    static class InnerClass {
       int b = 5;

       public void print() {

           System.out.println("@java like ");
       }

   }

  public static void main(String[] args) {
       OuterClass.InnerClass out = new OuterClass.InnerClass();
       out.print();
       System.out.println("value of b " + out.b);
          System.out.println("Email is "+OuterClass.email);

   }
}

 

خروجی:

 

@java like 
value of b 5
Email is Rahman.zarie92@gmail.com
 

✔ رنگ آبی کلاس بیرونی و رنگ قرمز کلاس داخلی استاتیک ما را نشان می‌دهد.


✔ کلاس داخلی استاتیک ما دارای یک عضو عدد صحیح و یک متد است.

 

OuterClass.InnerClass out = new OuterClass.InnerClass();


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

 

          System.out.println("Email is "+OuterClass.email);
className+.+menbersClass
 

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

 

نام شی+ نام کلاس داخلی استایک +. +نام کلاس بیرونی

 

    OuterClass.InnerClass out


و بعدش علامت مساوی و سمت راست علامت مساوی بصورت زیر عمل میکنیم:

 

    new OuterClass.InnerClass();


در پایان شکل پیاده ساز بصورت زیر درمیاد:

 

    OuterClass.InnerClass out = new OuterClass.InnerClass();


حال شی out ساخته شده تنها به اعضای کلاس داخلی استاتیک InnerClass دسرسی دارد. تصویر(1)

 

کلاس‌‌‌‌های داخلی در جاوا

 

پیروز و موفق باشید😊😊🙋


این جلسه آموزشی را می‌توانید بصورت کتاب الکترونیکی (PDF شده) در لینک زیر دریافت کنید.
این جلسه آموزشی را بصورت کامل و مرتب شده در لینک زیر دانلود کنید:(در صورت خرابی لینک گزارش دهید)

آموزش آسان و ساده زبان برنامه نویسی جاوا

لینک دانلود

 

 


نشر این مطلب با ذکر منبع (لینک سایت) بلامانع است.
برای با خبر شدن از جدیدترین مطالب آموزشی جاوا عضو کانال تلگرام ما شوید.
instagram
نظرات کاربران
*نام و نام خانوادگی
* پست الکترونیک
* متن پیام

بستن
*نام و نام خانوادگی
* پست الکترونیک
* متن پیام

3 نظر
مژگان
پنج شنبه دوازدهم فروردین ۰۰
پاسخ
()
()
مژگان
مشکل برطرف شد. سپاس
مژگان
چهارشنبه یازدهم فروردین ۰۰
پاسخ
()
()
مژگان
وقتي جلسه بعد ميزنم وارد صفحه هوم ميشه. از روي لينکهاي اموزش جاوا هم وقتي جلسه بيست رو ميزنم همين مشکله. لينک جلسه بيست صفحه هوم سايت رو باز مکينه.. ممنون از توجهتون
پاسخ مدیر سایت
سلام مژگان! ممنون از اطلاع رسانی تون. cache مرورگر خودتون رو پاک کنید و دوباره امتحان کنید و نتیجه رو همین جا برامون بنویسید.
پاسخ مدیر سایت
مژگان
سه شنبه دهم فروردین ۰۰
پاسخ
()
()
مژگان
ممنون از اموزش هاي روان و خوبتون. لطفا لينک جلسه بيستم رو بررسي ميکنيد
پاسخ مدیر سایت
سلام.لینک بررسی شد و صحیح بود.مشکل شما چیه؟
پاسخ مدیر سایت
گفتگو را شروع کنید
رزو مشاوره و تدریس خصوصی برنامه نویسی و سفارش انواع پروژه‌‌‌‌های برنامه نویسی