最近在看Java相關知識的時候發現Java中同時存在內部類以及非公有類概念,而且這兩個類都可以不需要單獨的文件編寫,可以與其他類共用一個文件。現根據個人總結將兩者的異同點總結如下,如有什么不當地方,歡迎大家指正。
1、非公有類和內部類對應的文件名與這兩種類的類名無關;
2、一個源文件中可以包含多個非公有類或者內部類;
3、非公有類不能使用public關鍵字(一般前面不加關鍵字),內部類可以使用public、private、protected關鍵字;
4、非公有類中可以添加0到多個內部類;
5、非公有類是包可見的,一個包中只能有一個同名非公有類,所以在包外無法調用非公有類;但是在包外可以通過包中外部類對象調用該包中的內部類。
6、非公有類在源文件中直接調用,例如,在源文件Test.java中存在一個公有類Test,一個非公有類priTest,那么可以使用preTest pt = new preTest() 實例化一個非公有類的對象;而對於內部類,在非靜態方法外部必須使用外部類的對象來調用內部類的構造方法,例如在源文件Outer.java中存在一個外部類Outer,一個內部類Inner,那么使用以下方式調用內部類:Outer out = new Outer(),Inner in = out.new Inner()。在非靜態方法內部直接使用new類實例化內部類對象,即Inner in = new Inner()。
7、非公有類只能通過創建公有類對象實現對於公有類的成員變量的使用,而內部類可以隨意使用外部類的成員變量(包括私有變量)而不用生成外部類的對象。
8、如果源文件中有一個公有類和多個非公有類,在編譯的時候編譯器會為文件中每個類創建一個單獨的.class文件,文件名就是對應的類名(所以一個包中只能有一個同名的非公有類);假如一個文件中有一個外部類,多個內部類,則在編譯的時候也會為每個類創建一個.class文件,但是內部類對應的文件名為"外部類$內部類.class",$代表這個內部類所屬的外部類。
9、在內部類中訪問變量有三種形式:
a、變量名--訪問局部變量;
b、this.變量名--訪問內部類變量;
c、外部類名.this.變量名--訪問外部類變量。
如果內部類沒有同名成員變量和局部變量,內部類可以直接通過變量名訪問外部類變量,而不用指定"外部類名.this.變量名"。
10、如果一個內部類是靜態內部類,使用關鍵字static,則內部類只能訪問外部類的靜態成員變量,同時可以將"外部類名.內部類名"看成一個整體,直接new出內部類的對象,而不用先生成外部類對象,例如外部類為Out,靜態內部類為In,則可以使用Out.In in = new Out.In()直接創建內部類對象。
11、如果一個內部類是“私有的”,則該類只能在外部類中生成對象進行操作,而無法再使用Out.In in = new Out().new In()生成內部類對象。