## Java編程那些事兒71——內部類簡介
陳躍峰
出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb)
### 8.10? 內部類(Inner Class)
內部類是Java語言中的一種特殊的語法,簡單的來說,就是在一個類的內部再聲明一個類,這些聲明在類內部的類就被稱作內部類。在實際聲明時,內部類可以聲明在類的內部、類的方法內部,也可以聲明在類的構造方法內部,內部類聲明的語法格式和一般類的聲明一樣,只是內部類聲明時可以使用static修飾符進行修飾。
對于內部類的相關使用,本部分不做深入的介紹,只是進行簡單的說明,輔助建立內部類的概念,能夠進行一些基本的使用。
下面是一個簡單的內部類的示例代碼:
~~~
?????????????????? /**
?* 內部類基本使用示例代碼
?*/
public class OutClass {
???????? int i = 0;
????????
???????? public classInnerClass{
?????????????????? public voidtest(){
??????????????????????????? i++;
?????????????????? }
???????? }
}
~~~
在該示例代碼中,類InnerClass聲明在了類OutClass的內部,所以InnerClass被稱為內部類,而OutClass則被稱為InnerClass的外部類。
該代碼編譯以后,將生成兩個class文件,一個是OutClass.class,另外一個是OutClass$InnerClass.class。這里需要說明的是,內部類也被編譯成一個獨立的類文件,類文件的名稱為:外部類類名$內部類類名.class。
在內部類中,可以很方便的訪問外部類的屬性i,而外部類不能直接引用內部類中的屬性和方法,語法中提供了一套專門的格式來訪問內部類中的屬性和方法,這些語法這里就不作介紹了。
內部類是Java語言誕生以后新增的一個語法,設計該語法的初衷主要有兩個:
1、隱藏內部類的實現
也就是將只有被外部類使用的功能隱藏在內部類的內部,其它類訪問這個內部類時的語法會比較復雜,從而在一定程度了避免了其它類對于內部類的訪問。
2、內部類可以訪問外部類的所有屬性和方法,避免了參數傳遞
在內部類中,可以訪問外部類中的所有屬性和方法,private訪問控制符修飾的屬性和方法也可以被內部類訪問,這樣將方便內部類的編寫,避免了參數傳遞,也減少了外部類需要向其它類開放的屬性和方法的數量。
當然,內部類除了帶來一系列的好處以外,還帶來了一系列的不足,主要的不足有如下幾點:
1、增加了語法的復雜度
在一個類的內部聲明一個類,使Java語言的復雜度增加了很多,也在一定程度上損害了Java語言的編程風格,同時使閱讀代碼的難度大幅度的增加。
2、使整個項目的結構變得復雜
內部類通過增加每個類的復雜度,使得項目的結構變得更加復雜,而且沒有原來的結構那么清晰。
當前內部類的語法在以下編程技術中的應用比較多:
1、圖形用戶界面編程中的事件處理
2、Java語言API中部分功能類的實現
綜合以上說明,在實際的開發過程中,如果不是十分必要,不建議編寫內部類,對于內部類實現的功能可以使用類和類之間的調用進行實現,這樣可以保留Java語言清晰的編程風格。
最后需要特別說明的是:在Java語法中,一個源代碼內部可以編寫多個類,例如:
~~~
?????????????????? /**
?* 一個類內部聲明多個類
?*/
public class TwoClassInOneFile {
???????? int n = 0;
???????? public void method(){}
}
?
class AnotherClass {
???????? char c;
???????? public void t(){}
}
~~~
這樣的源代碼,在編譯時,將生成兩個獨立的class的文件:TwoClassInOneFile.class和AnotherClass.class,這樣的結構不是內部類。
在實際項目中,不推薦進行這樣的編碼,主要原因是不方便類源代碼的查找,而推薦每個源文件內部只聲明一個類的形式。
?
- 前言
- (1)序言
- (2)程序設計是什么?
- (3)你適合學習程序設計嗎?
- (4)如何學好程序設計?
- (5)程序設計介紹小結
- (6)計算機軟件基本概念
- (7)進制的概念
- (8)計算機內部的數據表達
- (9)網絡編程基礎
- (10)Java語言簡介
- (11)JDK的獲得、安裝和配置
- (12)第一個HelloWorld程序
- (13)Eclipse基本使用
- (14)Eclipse基礎使用進階
- (15)如何學好Java語法
- (16)代碼框架、關鍵字和標識符
- (17)基本數據類型
- (18)變量和常量
- (19)數據類型轉換
- (20)空白、語句結束和注釋
- (21)算術運算符
- (22)比較運算符
- (23)邏輯運算符
- (24)賦值運算符
- (25)位運算符
- (26)移位運算符
- (27)其它運算符
- (28)運算符優先級
- (29)表達式
- (30)流程控制基礎
- (31)if語句語法(1)
- (32)if語句語法(2)
- (33)if語句語法(3)
- (34)switch語句語法
- (35)while語句語法
- (36)do-while語句語法
- (37)for語句語法
- (38)break和continue語句
- (39)流程控制綜合示例1
- (40)流程控制綜合示例2
- (41)流程控制綜合示例3
- (42)流程控制綜合練習
- (43)數組概述
- (44)數組基礎語法
- (45)數組使用示例1
- (46)數組使用示例2
- (47)數組使用示例3
- (48)多維數組基礎
- (49)多維數組使用示例1
- (50)多維數組使用示例2
- (51)多維數組練習
- (52)方法聲明
- (53)方法聲明示例
- (54)方法調用
- (55)方法重載和參數傳遞
- (56)方法練習
- (57)面向對象基礎
- (58)類(一)
- (59)類(二)
- (60)對象
- (61)面向對象設計方法和面向對象特性(一)
- (62)繼承(二)
- (63)多態性
- (64)訪問控制符、修飾符和其它關鍵字
- (65)static修飾符
- (66)final修飾符
- (67)this和super
- (68)抽象類和接口(一)
- (69)抽象類和接口(二)
- (70)抽象類和接口(三)
- (71)內部類簡介
- (72)包的概念
- (73)JDK文檔使用
- (74)java.lang包介紹1
- (75)String類使用
- (76)StringBuffer類和System類
- (77)包裝類
- (78)時間和日期處理
- (79)Random隨機處理
- (80)集合框架簡述
- (81)異常處理概述
- (82)異常處理語法1
- (83)異常處理語法2
- (84)IO簡介
- (85)IO類體系
- (86)文件操作之File類使用
- (87)文件操作之讀取文件
- (88)文件操作之寫文件
- (89)讀取控制臺輸入
- (90)裝飾流使用1
- (91)裝飾流使用2
- (92)IO使用注意問題
- (93)多線程基礎
- (94)多線程實現方式1
- (95)多線程實現方式2
- (96)多線程使用示例1
- (97)多線程使用示例2
- (98)多線程問題及處理1
- (99)多線程問題及處理2
- (100)多線程問題及處理3
- (101)網絡編程概述
- (102)網絡編程技術1
- (103)網絡編程技術2
- (104)網絡編程技術3
- (105)網絡編程技術4
- (106)網絡編程技術5
- (107)網絡協議概念
- (108)網絡編程示例1
- (109)網絡編程示例2
- (110)網絡編程小結