關於內部類的剖析
內部類根據使用不同的修飾符或者定位的位置不同,可以分為四種:
① 實例內部類: 內部類沒有使用static修飾
② 靜態內部類: 內部類使用了static修飾
③ 局部內部類: 在方法中定義的內部類
④ 匿名內部類: 適合於僅使用一次的類,屬於局部內部類的特殊情況
外部類的訪問修飾符:要麽用public,要麽缺省。
內部類看作是外部類的一個成員,好比字段,那麽內部類可以使用public/缺省/protected/private修飾
還可以是static修飾
------------------------------------------------------------------------------
實例內部類:
沒有使用static修飾內部類,說明內部類屬於外部類的對象,而不是屬於外部類。
特點:
1:創建實例內部類前,必須存在外部類對象,通過外部類對象創建內部類對象(當存在內部類對象時,一定存在外部類對象)
1 public class InstanceClass { 2 3 //創建一個內部類對象 4 Outter.Inner inner = new Outter().new Inner();//方法一 5 //創建一個內部類對象 6 Outter outter = new Outter(); 7 Outter.Inner inner2 = outter.newInner();//方法二 8 }
2:實例內部類可以直接訪問外部類成員
class Outter{ String name = "amos"; class Inner{ public void getOutterName(){ System.out.println(name); } } }
3.外部類必須通過內部類的實例去訪問內部類的成員
class Outter{ public void getAge() { System.out.println(new Outter().new Inner().age); } class Inner{ String name = "wong"; }
}
4.如果實例內部類和外部類存在同名的字段或方法abc,那麽在內部類中
this.abc表示訪問內部類成員
外部類.this.abc:表示訪問外部類成員
class Outter{ String name = "Outter"; class Inner{ String name = "Inner"; public void getName() { String name = "local"; System.out.println(name);//local System.out.println(this.name);//Inner System.out.println(Inner.this.name);//Outter } } }
-----------------------------------------------------------------------------------------------------------------------------------------------------------
靜態內部類:
使用static修飾的內部類
特點:
1.在創建靜態內部類的實例時,不必創建外部類的實例
Outter.Inner inner = new Outter.Inner();
2.靜態內部類可以直接訪問外部類的靜態成員
package innerSubclassTest; class Outter{ static String name = "Outter"; static class Inner{ public void getOutterName() { System.out.println(name);//直接訪問外部類靜態變量name } } }
必須通過外部類的實例去訪問外部類的實例成員。
class Outter{ int age = 18; static class Inner{ public void getAge() { System.out.println(new Outter().age); } } }
3.在靜態內部類中可以定義靜態成員和實例成員
4.測試類可以通過完整的類名直接訪問靜態內部類的靜態成員。
關於內部類的剖析