—— 你放心去浪,我替你說謊。對象
1、內部類與外部類之間的關係接口
一、內部類定義於外部類中,是一個相對獨立的實體,對該外部類文件進行編譯,會產生兩個.class文件,其中內部類的.class文件名名稱爲 外部類名$內部類名.class。get
二、內部類能夠訪問外部類的全部方法和屬性,即便是私有,這是由於內部類持有一個外部類的一個引用。外部類沒法直接訪問內部類的屬性和方法,必須經過內部類的對象引用才能進行訪問,若是是靜態內部類,外部類能夠經過內部類的類名來引用靜態變量。編譯
三、內部類若是要聲明靜態變量,內部類必須聲明爲靜態類。class
2、非靜態內部類對象的建立變量
一、在外部類以外建立內部類對象,須要先建立外部類對象,在經過外部類對象調用內部類的構造方法進行實例化。外部類對象只能調用內部類的構造方法,非構造方法以及元素必須經過內部類引用才能調用。引用
二、若是在外部類內部建立內部類對象,能夠直接調用內部類的構造方法進行建立。構造方法能夠被外部類調用,其餘方法和屬性必須經過內部類引用或類名才能調用。方法
3、內部類的分類static
一、成員內部類:定義在外部類中的普通類(非static),屬於外部類的成員,能夠訪問外部類的任何變量和方法。文件
二、局部內部類:定義在外部類的局部範圍內,例如定義在方法中,只容許在方法中訪問該內部類,不容許在方法外訪問。局部內部類通常用在用於輔助解決問題而又不但願建立一個公共類的場景。
三、匿名內部類:匿名內部類是沒有類名的局部內部類,所以它沒有構造方法,必須定義在方法中,不能用訪問修飾符修飾,不能具備靜態成員,必須實現抽象類或者接口。
四、靜態內部類:非靜態內部類在編譯完成後會擁有外部類的一個引用,所以它能夠調用外部類的全部屬性方法,同時,非靜態內部類不能擁有靜態變量。靜態內部類沒有擁有外部類的引用,靜態內部類只能調用外部類的靜態成員,不能訪問非靜態成員,外部類能夠直接調用靜態內部類的成員
4、內部類的建立
一、外部類外:經過外部類實例來調用new InnerClass()進行實例化
二、外部類內:new InnerClass(),對於靜態內部類,不須要藉助外部類實例進行建立,對於非靜態內部類,須要藉助外部類實例才能建立。
class Test{ public static void getInnerClass1(){ new InnerClass1();//不須要藉助外部類實例建立 } static class InnerClass1{ } public static void getInnerClass2(){ new Test(). new InnerClass2();//須要藉助外部類實例建立 } class InnerClass2{ }}