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

همانطور که در درس قبل اشاره شده در جاوا 4 نوع کلاس تو در تو وجود دارد که در این درس به دو نوع از آنها می پردازیم.

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

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

public class Outer 
{
  public static class Nested 
  {

  }
}

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

Outer.Nested instance = new Outer.Nested();

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

package myfirstprogram;

class Outer 
{
  static String  message = "Hello World!";
  
  public static class Nested 
  {
      void ShowMessage()
      {
          System.out.println(message);
      }
  }
}

public class MyFirstProgram 
{
    public static void main(String[] args) 
    {                
        Outer.Nested instance = new Outer.Nested();
        
        instance.ShowMessage();
    }   
}
Hello World!

همانطور که در مثال بالا متغیر message یک عضو استاتیک از کلاس Outer است و برای دسترسی به آن باید به صورتی که در خطوط مشاهده می کنید، عمل نمایید.

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

کلاس های داخلی غیر استاتیک در جاوا به نام inner classes معروفند. برای ایجاد یک نمونه از این کلاس ها ابتدا باید یک نمونه از کلاس خارجی ایجاد کنید. نحوه تعریف این نوع کلاس ها به صورت زیر است :

public class Outer 
{
  public class Inner 
  {

  }
}

در زیر نحوه ایجاد نمونه از یک کلاس داخلی آمده است :

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();

به نحوه قرار داده کلمه new بعد از شیء ایجاد شده از کلاس خارجی در کد بالا توجه کنید. کلاس داخلی غیر استاتیک به فیلدهای کلاس خارجی دسترسی دارد ، حتی اگر این فیلدها به صورت private تعریف شده باشند. به کد زیر توجه کنید :

package myfirstprogram;

class Outer 
{
    private String text = "I am private!";

    public class Inner 
    {
        public void ShowMessage() 
        {
            System.out.println(text);
        }
    }
}

public class MyFirstProgram 
{
    public static void main(String[] args) 
    { 
        Outer outerClass = new Outer();
        Outer.Inner innerClass =  outerClass.new Inner();
        
        innerClass.ShowMessage();
    }   
}
I am private!