JavaSE基礎知識——內部類
阿新 • • 發佈:2021-11-19
JavaSE基礎知識——內部類使用說明
目錄
1. 什麼是內部類
- 類的內部成員之五:內部類
- Java中允許將一個類A宣告在另一個類B中,則類A就是內部類,類B稱為外部類
- 內部類的分類:成員內部類(靜態、非靜態) vs 區域性內部類(方法內、程式碼塊內、構造器內)
- 成員內部類:
- 一方面,作為外部類的成員:
呼叫外部類的結構
可以被static修飾
可以被4種不同的許可權修飾
- 另一方面,作為一個類:
- 類內可以定義屬性、方法、構造器等
- 可以被final修飾,表示此類不能被繼承。言外之意,不使用final,就可以被繼承
- 可以被abstract修飾
- 關於內部類應該關注如下的3個問題
1.如何例項化成員內部類的物件
2.如何在成員內部類中區分呼叫外部類的結構
3.開發中區域性內部類的使用 見《InnerClassTest1.java》
2. 內部類使用參考程式碼
public class InnerClassTest { public static void main(String[] args) { //建立Dog例項(靜態的成員內部類): Person.Dog dog = new Person.Dog(); dog.show(); //建立Bird例項(非靜態的成員內部類): // Person.Bird bird = new Person.Bird();//錯誤的 非靜態需要例項化後才能呼叫 Person p = new Person(); //例項化類 Person.Bird bird = p.new Bird(); // bird.sing(); System.out.println(); bird.display("黃鸝"); } } class Person{ String name = "小明"; int age; public void eat(){ System.out.println("人:吃飯"); } //靜態成員內部類 static class Dog{ String name; int age; public void show(){ System.out.println("卡拉是條狗"); // eat(); } } //非靜態成員內部類 class Bird{ String name = "杜鵑"; public Bird(){ } public void sing(){ System.out.println("我是一隻小小鳥"); Person.this.eat();//呼叫外部類的非靜態屬性 eat(); System.out.println(age); } public void display(String name){ System.out.println(name);//方法的形參 System.out.println(this.name);//內部類的屬性 System.out.println(Person.this.name);//外部類的屬性 } } public void method(){ //區域性內部類——方法內 class AA{ } } { //區域性內部類——程式碼塊內 class BB{ } } public Person(){ //區域性內部類——構造器內 class CC{ } } }
3. 匿名內部類
- 匿名內部類不能定義任何靜態成員、方法和類,只能建立匿名內部類的一個例項。一個匿名內部類一定是在 new 的後面,用其隱含實現一個介面或實現一個類。
- 格式:
- new 父類構造器(實參列表)|實現介面(){
//匿名內部類的類體部分
} - 匿名內部類的特點
匿名內部類必須繼承父類或實現介面
匿名內部類只能有一個物件
匿名內部類物件只能使用多型形式引用
4. 匿名內部類使用參考程式碼
public class InnerClassTest1 { //開發中很少見 public void method(){ //區域性內部類 class AA{ } } //返回一個實現了Comparable介面的類的物件 public Comparable getComparable(){ //建立一個實現了Comparable介面的類:區域性內部類 //方式一: // class MyComparable implements Comparable{ // // @Override // public int compareTo(Object o) { // return 0; // } // // } // // return new MyComparable(); //方式二: return new Comparable(){ @Override public int compareTo(Object o) { return 0; } }; } }