首頁  >  文章  >  Java  >  10分鐘搞懂Java內部類

10分鐘搞懂Java內部類

angryTom
angryTom轉載
2019-11-26 13:59:202671瀏覽

10分鐘搞懂Java內部類

依定義的方式不同,內部類別分為靜態內部類別、成員內部類別、局部內部類別、匿名內部類別四種。

1.靜態內部類別

定義在類別內部的靜態類,就是靜態內部類別。

public class Out {
     private static int a;
     private int b;
     public static class Inner {
         public void print() {
             System.out.println(a);
         }
     }
}

1)靜態內部類別可以存取外部類別所有的靜態變數和方法,即使是private的也一樣。

(推薦影片:java影片教學#)

2)靜態內部類別和一般類別一致,可以定義靜態變數、方法、建構方法等。

3)其他類別使用靜態內部類別需要使用「外部類別.靜態內部類別」方式。如下圖所示:Out.Inner inner = new Out.Inner();  inner.print();

4)Java集合類別HashMap內部就有一個靜態內部類別Entry。 Entry是HashMap存放元素的抽象,HashMap內部維護Entry陣列用來存放元素,但是Entry對使用者是透明的。像這種和外部類別關係密切的,且不依賴外部類別實例的,都可以使用靜態內部類別。

2.成員內部類別

定義在類別內部的非靜態類,就是成員內部類別。成員內部類別不能定義靜態方法和變數(final修飾的除外)。這是因為成員內部類別是非靜態的,類別初始化的時候先初始化靜態成員,如果允許成員內部類別定義靜態變數,那麼成員內部類別的靜態變數初始化順序是有歧義的。

public class Out {
     private static int a;
     private int b;
     public class Inner {
         public void print() {
             System.out.println(a);
             System.out.println(b);
         }
     }
}

3.局部內部類別(定義在方法中的類別)

定義在方法中的類,就是局部類別。如果一個類別只在某個方法中使用,則可以考慮使用局部類別。

public class Out {
     private static int a;
     private int b;
     public void test(final int c) {
         final int d = 1;
         class Inner {
             public void print() {
                 System.out.println(c);
             }
         }
     }
}

4.匿名內部類別(要繼承一個父類別或實作一個介面、直接使用new來產生一個物件的參考)

匿名內部類,我們必須要繼承一個父類或實作一個接口,當然也只能只繼承一個父類或實作一個接口。同時它也是沒有class關鍵字,這是因為匿名內部類別是直接使用new來產生一個物件的參考。

1)匿名內部類別只能能使用一次,在建立匿名內部類別時,它會立即建立一個該類別的實例,該類別的定義會立即消失,所以匿名內部類別時不能夠被重複使用的。

2)匿名內部類別不能定義建構函數,不能存在任何的靜態成員變數和靜態方法。

3)匿名內部類別中的方法不能是抽象的,它必須要實作介面或繼承父類別的所有抽象方法。

4)匿名內部類別存取的外部類別成員變數或成員方法必須以static修飾,內部類別可以存取外部類別私有變數和方法。

public abstract class Bird {
     private String name;
     public String getName() {
         return name;
     }
     public void setName(String name) {
         this.name = name;
     }
     public abstract int fly();
}
public class Test {
     public void test(Bird bird){
         System.out.println(bird.getName() + "能够飞 " + bird.fly() + "米");
     }
     public static void main(String[] args) {
         Test test = new Test();
         test.test(new Bird() {
             public int fly() {
                 return 10000;
             }
             public String getName() {
                 return "大雁";
             }
         });
         }
}

本文來自php中文網,java教學欄目,歡迎學習!

以上是10分鐘搞懂Java內部類的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除