Java - İç sınıflar

Bu bölümde, Java'nın iç sınıflarını tartışacağız.

Yuvalanmış Sınıflar

Java'da, yöntemler gibi, bir sınıfın değişkenleri de üye olarak başka bir sınıfa sahip olabilir. Java'da başka bir sınıfın içinde yazmaya izin verilir. İçinde yazılan sınıfanested classve iç sınıfı tutan sınıfa outer class.

Syntax

İç içe bir sınıf yazmak için sözdizimi aşağıdadır. İşte sınıfOuter_Demo dış sınıf ve sınıftır Inner_Demo iç içe geçmiş sınıftır.

class Outer_Demo {
   class Inner_Demo {
   }
}

İç içe geçmiş sınıflar iki türe ayrılır -

  • Non-static nested classes - Bunlar, bir sınıfın statik olmayan üyeleridir.

  • Static nested classes - Bunlar bir sınıfın statik üyeleridir.

İç Sınıflar (Statik Olmayan İç İçe Sınıflar)

İç sınıflar, Java'da bir güvenlik mekanizmasıdır. Bir sınıfın erişim değiştiriciyle ilişkilendirilemeyeceğini biliyoruzprivate, ancak sınıfa başka bir sınıfın üyesi olarak sahipsek, iç sınıf özel hale getirilebilir. Bu ayrıca bir sınıfın özel üyelerine erişmek için de kullanılır.

İç sınıflar, onları nasıl ve nerede tanımladığınıza bağlı olarak üç türdendir. Onlar -

  • İç Sınıf
  • Yöntem-yerel İç Sınıf
  • Anonim İç Sınıf

İç Sınıf

İçsel bir sınıf oluşturmak oldukça basittir. Bir sınıf içinde bir sınıf yazmanız yeterlidir. Bir sınıfın aksine, bir iç sınıf özel olabilir ve bir iç sınıfı özel olarak tanımladığınızda, sınıfın dışındaki bir nesneden ona erişilemez.

Aşağıda, bir iç sınıf oluşturmak ve ona erişmek için program verilmiştir. Verilen örnekte, iç sınıfı özel yapıyoruz ve sınıfa bir yöntemle erişiyoruz.

Example

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();
   }
}

Burada bunu gözlemleyebilirsiniz Outer_Demo dış sınıf, Inner_Demo iç sınıftır display_Inner() iç sınıfı örneklediğimiz yöntemdir ve bu yöntem, main yöntem.

Yukarıdaki programı derler ve çalıştırırsanız, aşağıdaki sonucu alırsınız -

Output

This is an inner class.

Özel Üyelere Erişim

Daha önce belirtildiği gibi, iç sınıflar ayrıca bir sınıfın özel üyelerine erişmek için kullanılır. Bir sınıfın kendilerine erişmek için özel üyeleri olduğunu varsayalım. İçine bir iç sınıf yazın, özel üyeleri iç sınıftaki bir yöntemden döndürün, diyelim ki,getValue()ve son olarak başka bir sınıftan (özel üyelere erişmek istediğiniz) iç sınıfın getValue () yöntemini çağırın.

İç sınıfı somutlaştırmak için, başlangıçta dış sınıfı somutlaştırmanız gerekir. Bundan sonra, dış sınıfın nesnesini kullanarak, iç sınıfı somutlaştırmanın yolu aşağıdadır.

Outer_Demo outer = new Outer_Demo();
Outer_Demo.Inner_Demo inner = outer.new Inner_Demo();

Aşağıdaki program, iç sınıfı kullanarak bir sınıfın özel üyelerine nasıl erişileceğini gösterir.

Example

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());
   }
}

Yukarıdaki programı derler ve çalıştırırsanız, aşağıdaki sonucu alırsınız -

Output

This is the getnum method of the inner class: 175

Yöntem-yerel İç Sınıf

Java'da, bir yöntem içinde bir sınıf yazabiliriz ve bu yerel bir tür olacaktır. Yerel değişkenler gibi, iç sınıfın kapsamı da yöntem içinde sınırlandırılmıştır.

Yöntem yerel bir iç sınıf, yalnızca iç sınıfın tanımlandığı yöntem içinde başlatılabilir. Aşağıdaki program yerel bir yöntem iç sınıfının nasıl kullanılacağını gösterir.

Example

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();	   	   
   }
}

Yukarıdaki programı derler ve çalıştırırsanız, aşağıdaki sonucu alırsınız -

Output

This is method inner class 23

Anonim İç Sınıf

Sınıf adı olmadan bildirilen bir iç sınıf, anonymous inner class. Anonim iç sınıflar durumunda, bunları aynı anda bildirir ve başlatırız. Genellikle, bir sınıfın veya bir arabirimin yöntemini geçersiz kılmanız gerektiğinde kullanılırlar. Anonim bir iç sınıfın sözdizimi aşağıdaki gibidir -

Syntax

AnonymousInner an_inner = new AnonymousInner() {
   public void my_method() {
      ........
      ........
   }   
};

Aşağıdaki program, anonim iç sınıf kullanılarak bir sınıfın yönteminin nasıl geçersiz kılınacağını gösterir.

Example

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();	
   }
}

Yukarıdaki programı derler ve çalıştırırsanız, aşağıdaki sonucu alırsınız -

Output

This is an example of anonymous inner class

Aynı şekilde, somut sınıfın yöntemlerini ve anonim bir iç sınıf kullanarak arabirimi geçersiz kılabilirsiniz.

Bağımsız Değişken Olarak Anonim İç Sınıf

Genel olarak, bir yöntem bir arabirimin, soyut bir sınıfın veya somut bir sınıfın bir nesnesini kabul ederse, arabirimi uygulayabilir, soyut sınıfı genişletebilir ve nesneyi yönteme iletebiliriz. Eğer bir sınıfsa, onu doğrudan yönteme geçirebiliriz.

Ancak her üç durumda da, yönteme anonim bir iç sınıfı geçirebilirsiniz. Yöntem argümanı olarak anonim bir iç sınıfı iletmenin sözdizimi:

obj.my_Method(new My_Class() {
   public void Do() {
      .....
      .....
   }
});

Aşağıdaki program, anonim bir iç sınıfın yöntem argümanı olarak nasıl geçirileceğini gösterir.

Example

// 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 class 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";
         }
      });
   }
}

Yukarıdaki programı derler ve çalıştırırsanız, size şu sonucu verir -

Output

Hello, This is an example of anonymous inner class as an argument

Statik İç İçe Sınıf

Statik bir iç sınıf, dış sınıfın statik bir üyesi olan iç içe geçmiş bir sınıftır. Diğer statik üyeler kullanılarak dış sınıfı somutlaştırmadan erişilebilir. Tıpkı statik üyeler gibi, statik iç içe geçmiş bir sınıfın dış sınıfın örnek değişkenlerine ve yöntemlerine erişimi yoktur. Statik iç içe geçmiş sınıfın sözdizimi aşağıdaki gibidir -

Syntax

class MyOuter {
   static class Nested_Demo {
   }
}

Statik iç içe geçmiş bir sınıfın somutlaştırılması, bir iç sınıfın somutlaştırılmasından biraz farklıdır. Aşağıdaki program statik iç içe bir sınıfın nasıl kullanılacağını gösterir.

Example

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();
   }
}

Yukarıdaki programı derler ve çalıştırırsanız, aşağıdaki sonucu alırsınız -

Output

This is my nested class