Java 中的區域性內部類


在 Java 中,就像方法一樣,類的變數也可以擁有另一個類作為其成員。在 Java 中允許在一個類中編寫另一個類。在內部編寫的類稱為**巢狀類**,包含內部類的類稱為**外部類**。

語法

以下是編寫巢狀類的語法。這裡,類**Outer_Demo**是外部類,類**Inner_Demo**是巢狀類。

class Outer_Demo {
   class Inner_Demo {
   }
}

巢狀類分為兩種型別。

  • **非靜態巢狀類** - 這些是類的非靜態成員。

  • **靜態巢狀類** - 這些是類的靜態成員。

內部類(非靜態巢狀類)

內部類是 Java 中的一種安全機制。我們知道類不能與訪問修飾符**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();
   }
}

在這裡您可以觀察到**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

同樣,您可以使用匿名內部類覆蓋具體類和介面的方法。

匿名內部類作為引數

通常,如果一個方法接受介面、抽象類或具體類的物件,那麼我們可以實現介面,擴充套件抽象類並將物件傳遞給該方法。如果是類,則可以直接將其傳遞給方法。

但在所有三種情況下,您都可以將匿名內部類傳遞給方法。以下是將匿名內部類作為方法引數傳遞的語法。

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

更新於:2020年6月25日

2K+ 瀏覽量

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告