درخواست های ارتباط
جستجو
لیست دوستان من
صندوق پیام
همه را دیدم
  • در حال دریافت لیست پیام ها
صندوق پیام
رویدادها
همه را دیدم
  • در حال دریافت لیست رویدادها
همه رویدادهای من
تخفیف های وب سایت
همه تخفیف ها

عضویت در

کانال تلگرام

توسینسو

اطلاعات مطلب
مدرس/نویسنده
مهدی عادلی فر
امتیاز: 160708
رتبه:6
163
199
299
1604
مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم. پروفایل کاربر

آموزش برنامه نویسی جاوا قسمت سی و دوم: معرفی و شرح استفاده از انوع کلاس های داخلی

تاریخ 36 ماه قبل
نظرات 0
بازدیدها 1582
با سلام به همه دوستان و همراهان Itpro. در این مطلب قصد داریم در مورد کلاس ها و مفاهیم آن صحبت کنیم. ولی نه همه کلاس ها بلکه نوع خاصی از کلاس ها را مدنظر خواهیم داشت. این کلاس ها کلاس های داخلی جاوا خواهند بود.

کلاس های تو در تو


در جاوا هر کلاس می تواند اعضای خود را داشته باشد. این اعضا می توانند متغیر ها و فیلد ها و متدها و کلاس های داخلی باشند. شما می توانید در یک کلاس یک کلاس دیگر تعریف کنید. کلاسی که در داخل کلاس دیگر تعریف می شود را nested class گویند و کلاسی که در برگیرنده کلاس داخلی است را outer class می گویند. نحوه نشوتن کلاس های داخلی به شکل زیر خواهد بود. در این تعریف کلاس داخلی Nested و نام کلاس خارجی را Outer نامگذاری کرده ایم.
class Outer{
   class Nested{   
   }   
}
کلاسهای داخلی به دو نوع استاتیک و غیر استاتیک تقسیم می شوند.

کلاس های داخلی غیر استاتیک


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

کلاس های داخلی Inner Class


ساختن یک کلاس داخلی بسیار ساده است. شما فقط یک کلاس را در داخل کلاس اصلی تعریف می کنید. برخلاف تعریف کلاس های Outer می توانید کلاس های داخلی را به صورت private هم تعریف کنید. اگر یک کلاس داخلی را به صورت private تعریف کنید این کلاس خارج از کلاس outer خود قابل دسترس نخواهد بود. در ادامه برنامه ای آورده شده است که یک کلاس داخلی را می سازد و دسترسی به آن را نشان می دهد. در این برنامه ما کلاس داخلی را به صورت private می سازیم و در یک متد به آن دسترسی داریم.
class Outer_Demo{
   int num;
   //inner class
   private class Inner_Demo{
      public void print(){	   
         System.out.println("This is an inner class");
      }
   }
   //Accessing he inner class from the method within
   void display_Inner(){
      Inner_Demo inner = new Inner_Demo();
      inner.print();
   }
}
   
public class My_class{
   public static void main(String args[]){
      //Instantiating the outer class 
      Outer_Demo outer = new Outer_Demo();
      //Accessing the display_Inner() method.
      outer.display_Inner();
   }

}
در این مثال مشاهده می کنید که کلاس OuterDemo یک کلاس Outer است و کلاس InnerDemo یک کلاس داخلی است که در داخل کلاس OuterDemo قرار دارد. متد displayInner متدی است که از کلاس داخلی استفاده می کند و این متد از داخل متد main فراخوانی می شود. اگر کد بالا را اجرا کنید نتیجه اجرای کد بالا به شکل زیر خواهد بود:
This is an inner class.

دسترسی به اعضای private


همانگونه که قبلا گفته شد کلاس های داخلی را می توان در داخل یک کلاس به صورت private نیز معرفی کرد. حال می خواهیم یک روش برای دسترسی به فیلدهای private یک کلاس معرفی کنیم. یک کلاس داخلی به اعضای داخلی یک کلاس دسترسی دارد. حتی اگر آن اعضای کلاس به صورت private تعریف شده باشند. حال اگر ما یک کلاس داخلی تعریف کنیم می توانیم توسط این کلاس به سایر اعضای private کلاس Outer نیز دسترسی داشته باشیم. برای انجام این کار ما یک کلاس Outer تعریف می کنیم و داخل آن یک کلاس داخلی تعریف می کنیم که این کلاس داخلی یک متد به نام getValue دارد. از داخل این متد می توان به اعضای کلاس outer دسترسی داشت. حال برای این که در خارج از کلاس به اعضای داخلی کلاس Outer دسترسی داشته باشیم یک شئ از کلاس داخلی می سازیم و متد getValue را فراخوانی می کنیم. برای درک بهتر و راحت تر این مفهوم به کد زیر دقت کنید.
class Outer_Demo {
   //private variable of the outer class
   private int num= 175;  
   //inner class   
   public class Inner_Demo{
      public int getNum(){
         System.out.println("This is the getnum method of the inner class");
         return num;
      }
   }
}

public class My_class2{
   public static void main(String args[]){
      //Instantiating the outer class
      Outer_Demo outer=new Outer_Demo();
      //Instantiating the inner class
      Outer_Demo.Inner_Demo inner=outer.new Inner_Demo();
      System.out.println(inner.getNum());
   }
}
خروجی کد بالا به شکل زیر خواهد بود:
The value of num in the class Test is: 175

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


در زبان جاوا ما قادر هستیم که در داخل یک متد یک کلاس تعریف کنیم و این یک کلاس محلی خواهد بود. مانند متغیر محلی کلاس محلی نیز فقط داخل متد قابل شناسایی است و بیرون از متد شناخته شده نیست. از کلاسی که داخل متد تعریف شده است فقط می توان داخل متد شئ ساخت. برنامه زیر به شما نشان می دهد که چگونه یک کلاس درون متد بسازیم و از آن استفاده کنیم.
public class Outerclass{
   
   //instance method of the outer class 
   void my_Method(){
      int num = 23;
   
      //method-local inner class
      class MethodInner_Demo{
         public void print(){
            System.out.println("This is method inner class "+num);	   
         }   
      }//end of inner class
	   
      //Accessing the inner class
      MethodInner_Demo inner = new MethodInner_Demo();
      inner.print();
   }
   
   public static void main(String args[]){
      Outerclass outer = new Outerclass();
      outer.my_Method();	   	   
   }
}

خروجی کد بالا به شکل زیر خواهد بود:
This is method inner class 23

کلاس های داخلی بینام


کلاس داخلی که نام نداشته باشد را کلاس داخلی بینام می نامیم. در این نوع کلاس ها ما در همان زمانی که یک کلاس را تعریف می کنیم یک شئ هم از آن می سازیم. این کلاس ها در زمانی استفاده می شود که شما می خواهید یک متد را Override کنید و یا از یک کلاس و یا اینترفیس کلاسی به ارث ببرید و همانجا آن کلاس را تعریف کنید و از آن استفاده کنید. نحوه نوشتاری این نوع کلاس ها به شکل زیر است:
AnonymousInner an_inner = new AnonymousInner(){
   public void my_method(){
   ........
   ........
   }	    
};
برنامه زیر نشان می دهد که چگونه از یک کلاس بینام استفاده می شود و یک متد را override می کنیم.
abstract class AnonymousInner{
   public abstract void mymethod();
}

public class Outer_class {
   public static void main(String args[]){
      AnonymousInner inner = new AnonymousInner(){
         public void mymethod(){
            System.out.println("This is an example of anonymous inner class");    	  
         }	    
      };
      inner.mymethod();	
   }
}
اگر برنامه بالا را کامپایل کنید خروجی به شکل زیر خواهد بود:
This is an example of anonymous inner class
شما می توانید متدهای کلاس های معمولی را مانند اینترفیس ها در کلاس های بی نام تغییر دهید.

کلاس داخلی بی نام به عنوان پارامتر ورودی


به طور معمول در جایی که یک متد وجود دارد که یک شئ از یک اینترفیس یا کلاس abstract و یا حتی کلاس معمولی را به عنوان آرگومان ورودی می گیرد می توانیم همان اینترفیس را در همانجا به عنوان یک کلاس داخلی پیاده سازی کنیم و یا کلاس abstract را ارث بری نماییم و آنها را در قالب یک شئ به متد پاس بدهیم. در هر سه شکلی که گفته شد می توان یک کلاس بی نام همانجا تعریف کرد و به عنوان یک شئ به داخل متد به عنوان پارامتر ورودی فرستاد. نحوه نوشتن این نوع کلاس ها به شکل زیر است:
obj.my_Method(new My_Class(){
   public void Do(){
   .....
   .....
   }
});
برنامه زیر نشان می دهد که چگونه یک کلاس داخلی بی نام را به عنوان پارامتر ورودی یک متد تعریف کرده و می فرستیم.
//interface
interface Message{
   String greet();	
}

public class My_class {
   //method which accepts the object of interface Message
   public void displayMessage(Message m){
      System.out.println(m.greet() +", This is an example of anonymous inner calss as an argument");	   
   }

   public static void main(String args[]){
      //Instantiating the class
      My_class obj = new My_class();
		
      //Passing an anonymous inner class as an argument
      obj.displayMessage(new Message(){
         public String greet(){
            return "Hello";  		   
         }
      });
   }
}
خروجی برنامه بالا به شکل زیر خواهد بود:
Hello This is an example of anonymous inner class as an argument

کلاس های داخلی استاتیک


یک کلاس داخلی استاتیک کلاسی است که به صورت استاتیک در داخل کلاس تعریف شده است و یکی از اعضای استاتیک کلاس است. می توان بدون این که است کلاس Outer شیئی ساخته شود به این کلاس دسترسی داشت.. این نوع کلاس همچنین می تواند سایر اعضای استاتیک کلاس را تغییر بدهد. مانند بقیه اعضای استاتیک کلاس این نوع کلاس فقط می تواند به اعضای استاتیک دسترسی داشته باشد. نحوه نوشتاری این نوع کلاس مانند شکل زیر است:
class MyOuter {
   static class Nested_Demo{
   }
}
برای استفاده از این نوع کلاس به شکل زیر عمل می کنیم:
public class Outer{
   static class Nested_Demo{
      public void my_method(){
         System.out.println("This is my nested class");
      }
   }
   
   public static void main(String args[]){
      Outer.Nested_Demo nested = new Outer.Nested_Demo();	 
      nested.my_method();
   }
   
}
خروجی برنامه بالا به شکل زیرخواهد بود:
This is my nested class
Itpro باشید



نویسنده: مهدی عادلی فر
منبع: انجمن تخصصی فناوری اطلاعات ایران
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

برچسب ها
ردیف عنوان
1 آموزش برنامه نویسی جاوا قسمت اول : معرفی ویژگیها ، خصوصیات و نحوه شروع به کار با زبان برنامه نویسی جاوا
2 آموزش برنامه نویسی جاوا قسمت دوم : بررسی مفاهیم شیء ، کلاس ، Method و شروع برنامه نویسی با زبان جاوا
3 آموزش برنامه نویسی جاوا قسمت سوم: معرفی مفاهیم اولیه و مفاهیم شی گرایی در برنامه نویسی جاوا
4 آموزش برنامه نویسی جاوا قسمت چهارم: معرفی مفاهیم شی گرایی در برنامه نویسی جاوا - ادامه
5 آموزش برنامه نویسی جاوا قسمت پنجم: معرفی انواع داده ها در جاوا
6 آموزش برنامه نویسی جاوا قسمت ششم: آموزش انواع متغیر در جاوا
7 آموزش برنامه نویسی جاوا قسمت هفتم: معرفی Modifierها در جاوا
8 آموزش برنامه نویسی جاوا قسمت هشتم: معرفی و آموزش عملگرهای جاوا
9 آموزش برنامه نویسی جاوا قسمت نهم: معرفی و آموزش کار با عملگرها در جاوا - ادامه
10 آموزش برنامه نویسی جاوا قسمت دهم: کار با حلقه های تکرار در جاوا
11 آموزش برنامه نویسی جاوا قسمت یازدهم: معرفی و آموزش استفاده از عبارات شرطی در جاوا
12 آموزش برنامه نویسی جاوا قسمت دوازدهم: معرفی انواع کلاس wrapper مربوط به اعداد در جاوا و نحوه استفاده از آنها
13 آموزش برنامه نویسی جاوا قسمت سیزدهم: معرفی انواع کلاس wrapper مربوط به اعداد در جاوا و نحوه استفاده از آنها -ادمه
14 آموزش برنامه نویسی جاوا قسمت چهاردهم: معرفی و نحوه استفاده از کلاس Wrapper مربوط به کاراکتر ها در جاوا
15 آموزش برنامه نویسی جاوا قسمت پانزدهم: معرفی و آموزش نحوه استفاده از کلاس String و کار با رشته ها در جاوا
16 آموزش برنامه نویسی جاوا قسمت شانزدهم: معرفی و آموزش نحوه استفاده از کلاس String در جاوا و کار با رشته ها در جاوا ادامه
17 آموزش برنامه نویسی جاوا قسمت هفدهم: معرفی و آموزش نحوه استفاده از کلاس String در جاوا و کار با رشته ها در جاوا-ادامه 2
18 آموزش برنامه نویسی جاوا قسمت هجدهم: معرفی و آموزش نحوه استفاده از کلاس String در جاوا و کار با رشته ها در جاوا-ادامه 3
19 آموزش برنامه نویسی جاوا قسمت نوزدهم: معرفی و آموزش نحوه استفاده از کلاس های StringBuilder و StringBuffer
20 آموزش برنامه نویسی جاوا قسمت بیستم: معرفی و آموزش نحوه استفاده از آرایه ها
21 آموزش برنامه نویسی جاوا قسمت بیست و یکم: آموزش کار با تاریخ
22 آموزش برنامه نویسی جاوا قسمت بیست و دوم: معرفی و آموزش عبارات منظم(Regular expression)
23 آموزش برنامه نویسی جاوا قسمت بیست و سوم: نحوه تعریف و استفاده از متدها
24 آموزش برنامه نویسی جاوا قسمت بیست و چهارم: نحوه تعریف و استفاده از متدها- ادامه
25 آموزش برنامه نویسی جاوا قسمت بیست و پنجم: نحوه کار با استریم ها و فایل ها
26 آموزش برنامه نویسی جاوا قسمت بیست و ششم: نحوه کار با دایرکتوری ها
27 آموزش برنامه نویسی جاوا قسمت بیست و هفتم: معرفی و آموزش کلاس ByteArrayInputStream و کار با استریم ها
28 آموزش برنامه نویسی جاوا قسمت بیست و هشتم: معرفی کلاس File و شرح متدهای آن
29 آموزش برنامه نویسی جاوا قسمت بیست و نهم: معرفی و شرح Exception ها
30 آموزش برنامه نویسی جاوا قسمت سی ام: معرفی و شرح Exception ها- ادامه
31 آموزش برنامه نویسی جاوا قسمت سی و یکم: معرفی و شرح Exception ها- ادامه 2
32 آموزش برنامه نویسی جاوا قسمت سی و دوم: معرفی و شرح استفاده از انوع کلاس های داخلی
33 آموزش برنامه نویسی جاوا قسمت سی و سوم: شرح وراثت کلاس ها و انواع آن
34 آموزش برنامه نویسی جاوا قسمت سی و چهارم: معرفی و شرح override کردن متد ها
35 آموزش برنامه نویسی جاوا قسمت سی و پنجم: معرفی و شرح چند ریختی (polymorphism)
36 آموزش برنامه نویسی جاوا قسمت سی و ششم: شرح enum و ویژگی های آن
37 آموزش برنامه نویسی جاوا قسمت سی و هفتم: معرفی و شرح abstract
38 آموزش برنامه نویسی جاوا قسمت سی و هشتم: معرفی و آموزش نحوه استفاده از کپسول بندی (encapsulation)
39 آموزش برنامه نویسی جاوا قسمت سی و نهم: معرفی و آموزش نحوه استفاده از اینترفیس ها
40 آموزش برنامه نویسی جاوا قسمت چهلم: معرفی مفهوم پکیج(package) و نحوه استفاده از آن
41 آموزش برنامه نویسی جاوا قسمت چهل و یکم: معرفی داده ساختارها - Enumeration
42 آموزش برنامه نویسی جاوا قسمت چهل و دوم: داده ساختار BitSet
43 آموزش برنامه نویسی جاوا قسمت چهل و سوم: داده ساختار Vector
44 آموزش برنامه نویسی جاوا قسمت چهل و چهارم: داده ساختار Stack(پشته)
45 آموزش برنامه نویسی جاوا قسمت چهل و پنجم: داده ساختار dictionary
46 آموزش برنامه نویسی جاوا قسمت چهل و ششم: داده ساختار Hashtable
47 آموزش برنامه نویسی جاوا قسمت چهل و هفتم: داده ساختار properites
48 آموزش برنامه نویسی جاوا قسمت چهل و هشتم: معرفی و آموزش مفهوم جنریک
49 آموزش برنامه نویسی جاوا قسمت چهل و نهم: معرفی و آموزش برنامه نویسی سوکت و شبکه سمت سرور
50 آموزش برنامه نویسی جاوا قسمت پنجاهم: معرفی و آموزش برنامه نویسی سوکت و شبکه- سمت کلاینت و ارتباط با یکدیگر
51 آموزش برنامه نویسی جاوا قسمت پنجاه و یکم: معرفی و آموزش استفاده از lambda expression
52 آموزش برنامه نویسی جاوا قسمت پنجاه و دوم:‌ معرفی مفاهیم Thread ها و Multi-Threading
53 آموزش برنامه نویسی جاوا قسمت پنجاه و سوم: معرفی و آموزشRunnable در Thread ها و Multi-Threading
54 آموزش برنامه نویسی جاوا قسمت پنجاه و چهارم: کلاس Thread و کار کردن با متدهای این کلاس
دوره مجموعه کل دوره
مطالب مرتبط

در حال دریافت اطلاعات

نظرات
هیچ نظری ارسال نشده است

    برای ارسال نظر ابتدا به سایت وارد شوید