کلاس داخلی بی نام (Anonymous Inner Class)

به کلاس داخلی که نام نداشته باشد، کلاس داخلی بی نام یا Anonymous Inner Class گفته می شود. از این کلاس ها برای Override کردن متد یک کلاس یا یک رابط (interface) استفاده می شود. نحوه تعریف کلاس های داخلی بی نام به صورت زیر است :

AnonymousInner ObjectName = new AnonymousInner()
{
    Modifier ReturnType MethodName()
    {
        //Some Code
    }	    
};

همانطور که احتتمالا از کد بالا متوجه شده اید، تعریف و ایجاد شیء از این نوع کلاس ها به صورت همزمان می باشد. به این نکته هم توجه کنید که بعد از علامت آکولاد بسته از علامت سمیکالن (;) استفاده می شود. همانطور که در درس زیر ذکر شد، برای پیاده سازی یا Override یک متد از کلاس پایه توسط کلاس فرزند باید دو کلاس ایجاد شود که یکی از دیگری ارث بری کند :

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

  1: class Parent
  2: {
  3:     public void ShowMessage()
  4:     {
  5:         System.out.println("Message from Parent.");
  6:     }
  7: }
  8: 
  9: public class AnonymousClassDemo
 10: {
 11:     public static void main(String[] args)
 12:     {
 13: 
 14:         Parent parent = new Parent()                      
 15:         {                                                 
 16:             public void ShowMessage()                      
 17:             {                                             
 18:                 System.out.println("Message from Child.");
 19:             }                                             
 20:         };                                                
 21: 
 22:         parent.ShowMessage();
 23:     }
 24: }
Message from Child.

در کد بالا، یک کلاس تعریف شده است(خطوط 7-1) که دارای یک متد می باشد(6-3). این متد را به وسیله کلاس بی نام(20-14) Override کرده ایم(19-16). خطوط 7-1 کد بالا می تواند یک کلاس انتزاعی (abstract class) باشد :

abstract class Base
{
    abstract void ShowMessage();
}

و یا یک رابط (interface) :

interface IBase
{
  void ShowMessage();
}

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

   1: interface MyInterface
   2: {
   3:     String Message();
   4: }
   5: 
   6: class MyClass
   7: {
   8:     public void ShowMessage(MyInterface m)
   9:     {
  10:         System.out.println(m.Message());
  11:     }
  12: }
  13: 
  14: class AnonymousClassDemo
  15: {    
  16:     public static void main(String args[])
  17:     {
  18:         MyClass MC = new MyClass();
  19: 
  20:         MC.ShowMessage(new MyInterface()
  21:         {                               
  22:             @Override                   
  23:             public String Message()     
  24:             {                           
  25:                 return "Hello World!";  
  26:             }                           
  27:         });
  28:    }
  29: }
Hello World!

در خط 4-1 کد بالا یک رابط که دارای یک متد است را نوشته ایم. در خطوط 12-6 هم کلاسی داریم که دارای یک متد می باشد که یک آرگومان از نوع رابط MyInterface دریافت می کند. برای پیاده سازی یا Override متد مربوط به راط همانطور که مشاهده می کنید در خط 20 متد ()ShowMessage مربوط به کلاس MyClass را فراخوانی کرده و یک کلاس بی نام به آن ارسال می کنیم. سپس در داخل همین کلاس بی نام متد ()Message مربوط به رابط را Override می کنیم. ارسال کلاس بی نام به عنوان آرگومان همانطور که در آینده خواهید دید در مبحث Swing کاربرد دارد.