在Java中,允許一個類的定義位於另一個類的內部,前者稱為內部類,後者稱為外部類。 1.內部類的分類 成員內部類(靜態和非靜態)和局部內部類(方法內、代碼塊內、構造器內) 2.成員內部類的理解 一方面,作為外部類的成員: >調用外部類的結構 >可以被static修飾 >可以被4種不同的許可權修飾 另一 ...
在Java中,允許一個類的定義位於另一個類的內部,前者稱為內部類,後者稱為外部類。
1.內部類的分類
成員內部類(靜態和非靜態)和局部內部類(方法內、代碼塊內、構造器內)2.成員內部類的理解
一方面,作為外部類的成員:
>調用外部類的結構
>可以被static修飾
>可以被4種不同的許可權修飾
另一方面,作為一個類:
> 類內可以定義屬性、方法、構造器等
> 可以被final修飾,表示此類不能被繼承。言外之意,不使用final,就可以被繼承
> 可以被abstract修飾
特點:
- 成員內部類可以無條件的訪問外部類的所有的成員屬性和方法不受 private 和 static影響
- 當內部類的成員屬性或者方法與外部類的同名時,會發生隱藏現象。直接在內部類中調用的是內部類的成員屬性和方法。需要用 “外部類”.this.成員變數/成員方法
- 如果外部類需要訪問內部類,需要生成內部對象,才能訪問內部類對象。
- 成員內部類是依附外部類存在的,如果需要訪問成員內部類,那麼一定需要先創建外部類。
-
由於成員內部類的以為外部類的成員的方式存在,所以類修飾可以用 private public protect 無許可權的修飾符修飾來表示內部的訪問許可權的問題。而外部內不可以。
public class test { public static void main(String[] args) { //創建靜態的成員內部類的對象 Person.Inner2 inner2 = new Person.Inner2(); //創建非靜態的成員內部類的對象 Person p = new Person(); Person.Inner1 inner1 = p.new Inner1(); inner1.show();//name = 小張, age = 23 inner2.show();//靜態成員內部類 } } class Person{ String name; int age; //非靜態成員內部類 class Inner1{ public void show(){ name = "小張"; age = 23; System.out.println("name = " + name + ", age = "+ age); } } //靜態成員內部類 static class Inner2{ public void show(){ System.out.println("靜態成員內部類"); } } public void eat(){ System.out.println("人吃飯"); } }
3.如何在成員內部類中調用外部類的結構?
class Person{ String name = "小明"; public void eat(){ } //非靜態成員內部類 class Bird{ String name = "杜鵑"; public void display(String name){ System.out.println(name);//方法的形參 System.out.println(this.name);//內部類的屬性 System.out.println(Person.this.name);//外部類的屬性 //Person.this.eat(); } } }
4.局部內部類
特點:
- 不能用訪問許可權修飾符關鍵字
- 作用區間只在申明的局部內
5.匿名內部類
特點:
- 匿名內部類不能使用 static 和許可權修飾符
- 匿名內部沒有構造器。通過new XXX 的生成一個對象引用。
- 匿名內部類屬於局部內部類,所有局部內部類限制的條件在匿名內部中依然有效
作者:Java之美
日期:2020-03-30