در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش جاوا (Java) قسمت 32 : استفاده از انوع کلاس های داخلی

با سلام به همه دوستان و همراهان 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 باشید

نویسنده: مهدی عادلی فر

منبع: جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

#برنامه_نویسی_شی_گرا #برنامه_نویسی_جاوا #کلاس_های_داخلی_در_جاوا #آموزش_برنامه_نویسی_جاوا #آموزش_جاوا #آموزش_گام_به_گام_جاوا #دوره_آموزشی_جاوا #کلاس_ها_در_جاوا #inner_class_ها_در_جاوا #یادگیری_زبان_برنامه_نویسی_جاوا
عنوان
1 آموزش جاوا (Java) قسمت 1 : معرفی ، خصوصیات و شروع به کار رایگان
2 آموزش جاوا (Java) قسمت 2 : شی گرایی قسمت یک رایگان
3 آموزش جاوا (Java) قسمت 3: شی گرایی قسمت دو رایگان
4 آموزش جاوا (Java) قسمت 4 : شی گرایی قسمت سه رایگان
5 آموزش جاوا (Java) قسمت 5 : انواع داده رایگان
6 آموزش جاوا (Java) قسمت 6 : انواع متغیر رایگان
7 آموزش جاوا (Java) قسمت 7 : Modifier ها رایگان
8 آموزش جاوا (Java) قسمت 8 : عملگرها قسمت یک رایگان
9 آموزش جاوا (Java) قسمت 9 : عملگرها قسمت دو رایگان
10 آموزش جاوا (Java) قسمت 10 : حلقه های تکرار رایگان
11 آموزش جاوا (Java) قسمت 11 : عبارات شرطی رایگان
12 آموزش جاوا (Java) قسمت 12 : کلاس Wrapper اعداد رایگان
13 آموزش جاوا (Java) قسمت 12 : کلاس Wrapper اعداد رایگان
14 آموزش جاوا (Java) قسمت 14: کلاس Wrapper کاراکترها رایگان
15 آموزش جاوا (Java) قسمت 15 : کلاس String و کار با رشته قسمت یک رایگان
16 آموزش جاوا (Java) قسمت 16 : کلاس String و کار با رشته قسمت دو رایگان
17 آموزش جاوا (Java) قسمت 17 : کلاس String و کار با رشته قسمت سه رایگان
18 آموزش جاوا (Java) قسمت 18 : کلاس String و کار با رشته قسمت چهار رایگان
19 آموزش جاوا (Java) قسمت 19 : StringBuilder و StringBuffer رایگان
20 آموزش جاوا (Java) قسمت 20 : استفاده از آرایه ها رایگان
21 آموزش جاوا (Java) قسمت 21 : آموزش کار با تاریخ رایگان
22 آموزش جاوا (Java) قسمت 22 : عبارات منظم (Regular Expression) رایگان
23 آموزش جاوا (Java) قسمت 23 : تعریف و استفاده از متدها قسمت یک رایگان
24 آموزش جاوا (Java) قسمت 24 : تعریف و استفاده از متدها قسمت دو رایگان
25 آموزش جاوا (Java) قسمت 25 : کار با استریم ها و فایل ها رایگان
26 آموزش جاوا (Java) قسمت 26 : کار با دایرکتوری ها رایگان
27 آموزش جاوا (Java) قسمت 27 : کلاس ByteArrayInputStream رایگان
28 آموزش جاوا (Java) قسمت 28 : معرفی کلاس File و متدها رایگان
29 آموزش جاوا (Java) قسمت 29 : معرفی و شرح Exception ها قسمت 1 رایگان
30 آموزش جاوا (Java) قسمت 30 : معرفی و شرح Exception ها قسمت 2 رایگان
31 آموزش جاوا (Java) قسمت 31 : معرفی و شرح Exception ها قسمت 3 رایگان
32 آموزش جاوا (Java) قسمت 32 : استفاده از انوع کلاس های داخلی رایگان
33 آموزش جاوا (Java) قسمت 33 : وراثت کلاس ها و انواع آن رایگان
34 آموزش جاوا (Java) قسمت 34 : Override کردن متد ها رایگان
35 آموزش جاوا (Java) قسمت 35 : چند ریختی (Polymorphism) رایگان
36 آموزش جاوا (Java) قسمت 36 : Enum و ویژگی های آن رایگان
37 آموزش جاوا (Java) قسمت 37 : معرفی Abstract رایگان
38 آموزش جاوا (Java) قسمت 38 : استفاده از کپسول بندی (Encapsulation) رایگان
39 آموزش جاوا (Java) قسمت 39 : استفاده از اینترفیس ها رایگان
40 آموزش جاوا (Java) قسمت 40 : پکیج(Package) و نحوه استفاده رایگان
41 آموزش جاوا (Java) قسمت 41 : معرفی داده ساختارها Enumeration رایگان
42 آموزش جاوا (Java) قسمت 42 : داده ساختار BitSet رایگان
43 آموزش جاوا (Java) قسمت 43 : داده ساختار Vector رایگان
44 آموزش جاوا (Java) قسمت 44 : داده ساختار Stack (پشته) رایگان
45 آموزش جاوا (Java) قسمت 45 : داده ساختار Dictionary رایگان
46 آموزش جاوا (Java) قسمت 46 : داده ساختار Hashtable رایگان
47 آموزش جاوا (Java) قسمت 47 : داده ساختار Properites رایگان
48 آموزش جاوا (Java) قسمت 48 : معرفی و آموزش جنریک (Generic) رایگان
49 آموزش جاوا (Java) قسمت 49 : برنامه نویسی سوکت و شبکه قسمت 1 رایگان
50 آموزش جاوا (Java) قسمت 50 : برنامه نویسی سوکت و شبکه قسمت 2 رایگان
51 آموزش جاوا (Java) قسمت 51 : استفاده از Lambda Expression رایگان
52 آموزش جاوا (Java) قسمت 52 : Thread و Multi-Threading رایگان
53 آموزش جاوا (Java) قسمت 53 : Runnable در Thread و Multi-Threading رایگان
54 آموزش جاوا (Java) قسمت 54 : کلاس Thread و متدها رایگان
زمان و قیمت کل 0″ 0
0 نظر

هیچ نظری ارسال نشده است! اولین نظر برای این مطلب را شما ارسال کنید...

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره پاییزه می تونی امروز ارزونتر از فردا خرید کنی ....