Java-innerclasses

提供:Dev Guides
移動先:案内検索

Java-内部クラス

この章では、Javaの内部クラスについて説明します。

入れ子クラス

Javaでは、メソッドと同様に、クラスの変数もそのメンバーとして別のクラスを持つことができます。 Javaでは、別のクラス内にクラスを作成できます。 内部に記述されたクラスは*ネストされたクラス*と呼ばれ、内部クラスを保持するクラスは*外部クラス*と呼ばれます。

構文

ネストされたクラスを記述する構文は次のとおりです。 ここで、クラス Outer_Demo は外部クラスであり、クラス Inner_Demo はネストされたクラスです。

class Outer_Demo {
   class Inner_Demo {
   }
}

ネストされたクラスは2つのタイプに分けられます-

  • 非静的ネストクラス-これらはクラスの非静的メンバーです。
  • 静的ネストクラス-これらはクラスの静的メンバーです。

内部クラス

内部クラス(非静的なネストされたクラス)

内部クラスは、Javaのセキュリティメカニズムです。 クラスをアクセス修飾子 private に関連付けることはできませんが、クラスを他のクラスのメンバーとして持っている場合、内部クラスをプライベートにすることができます。 また、これはクラスのプライベートメンバーへのアクセスにも使用されます。

内部クラスには、定義方法と場所に応じて3つのタイプがあります。 彼らは-

  • 内部クラス
  • メソッドローカル内部クラス
  • 匿名の内部クラス

内部クラス

内部クラスの作成は非常に簡単です。 クラス内にクラスを記述するだけです。 クラスとは異なり、内部クラスはプライベートにすることができ、内部クラスをプライベートに宣言すると、クラス外部のオブジェクトからアクセスできなくなります。

以下は、内部クラスを作成してアクセスするプログラムです。 この例では、内部クラスをプライベートにし、メソッドを介してクラスにアクセスします。

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

ここで、 Outer_Demo は外部クラス、 Inner_Demo は内部クラス、* display_Inner()は内部クラスをインスタンス化するメソッドであり、このメソッドは *main メソッドから呼び出されることがわかります。

上記のプログラムをコンパイルして実行すると、次の結果が得られます-

出力

This is an inner class.

プライベートメンバーへのアクセス

前述のように、内部クラスはクラスのプライベートメンバーにアクセスするためにも使用されます。 クラスにアクセスするプライベートメンバーがいるとします。 内部クラスを記述し、内部クラス内のメソッド(* getValue()*など)からプライベートメンバーを返し、最後に別のクラス(プライベートメンバーへのアクセス元)からgetValue()メソッドを呼び出します内部クラス。

内部クラスをインスタンス化するには、最初に外部クラスをインスタンス化する必要があります。 その後、外部クラスのオブジェクトを使用して、内部クラスをインスタンス化する方法を次に示します。

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

次のプログラムは、内部クラスを使用してクラスのプライベートメンバーにアクセスする方法を示しています。

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

上記のプログラムをコンパイルして実行すると、次の結果が得られます-

出力

This is the getnum method of the inner class: 175

メソッドローカル内部クラス

Javaでは、メソッド内にクラスを記述できます。これはローカル型になります。 ローカル変数と同様に、内部クラスのスコープはメソッド内で制限されます。

メソッドローカルの内部クラスは、内部クラスが定義されているメソッド内でのみインスタンス化できます。 次のプログラムは、メソッドローカルの内部クラスの使用方法を示しています。

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

匿名の内部クラス

クラス名なしで宣言された内部クラスは、*匿名内部クラス*として知られています。 匿名の内部クラスの場合、それらを同時に宣言およびインスタンス化します。 通常、クラスまたはインターフェイスのメソッドをオーバーライドする必要がある場合は常に使用されます。 匿名の内部クラスの構文は次のとおりです-

構文

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

次のプログラムは、匿名の内部クラスを使用してクラスのメソッドをオーバーライドする方法を示しています。

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

同様に、匿名内部クラスを使用して、具象クラスのメソッドとインターフェイスをオーバーライドできます。

引数としての匿名内部クラス

一般に、メソッドがインターフェイスのオブジェクト、抽象クラス、または具象クラスを受け入れる場合、インターフェイスを実装し、抽象クラスを拡張し、オブジェクトをメソッドに渡すことができます。 クラスである場合、メソッドに直接渡すことができます。

ただし、3つの場合すべてで、匿名の内部クラスをメソッドに渡すことができます。 ここにメソッドの引数として匿名の内部クラスを渡す構文があります-

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

上記のプログラムをコンパイルして実行すると、次の結果が得られます-

出力

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

静的ネストクラス

静的内部クラスは、外部クラスの静的メンバーであるネストされたクラスです。 他の静的メンバーを使用して、外部クラスをインスタンス化せずにアクセスできます。 静的メンバーのように、静的にネストされたクラスは、外部クラスのインスタンス変数とメソッドにアクセスできません。 静的なネストされたクラスの構文は次のとおりです-

構文

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