使用靜態內部類提高封裝性
轉載來自:https://blog.csdn.net/chenzhiqin20/article/details/10458747
Java中的嵌套類(Nested Class)分為兩種:靜態內部類(也叫靜態嵌套類,Static Nested Class)和內部類(Inner Class)。內部類我們介紹過很多了,現在來看看靜態內部類。什麼是靜態內部類呢?是內部類,並且是靜態(static修飾)的即為靜態內部類。隻有在是靜態內部類的情況下才能把static修複符放在類前,其他任何時候static都是不能修飾類的。
靜態內部類的形式很好理解,但是為什麼需要靜態內部類呢?那是因為靜態內部類有兩個優點:加強了類的封裝性和提高了代碼的可讀性,我們通過一段代碼來解釋這兩個優點,如下所示:
- public class Person{
- //姓名
- private String name;
- //家庭
- private Home home;
- //構造函數設置屬性值
- public Person(String _name){
- name = _name;
- }
- /* home、name的getter/setter方法省略 */
- public static class Home{
- //家庭地址
- private String address;
- //家庭電話
- private String tel;
- public Home(String _address,String _tel){
- address = _address;
- tel = _tel;
- }
- /* address、tel的getter/setter方法省略 */
- }
- }
其中,Person類中定義了一個靜態內部類Home,它表示的意思是“人的家庭信息”,由於Home類封裝了家庭信息,不用在Person類中再定義homeAddre、homeTel等屬性,這就使封裝性提高了。同時我們僅僅通過代碼就可以分析出Person和Home之間的強關聯關係,也就是說語義增強了,可讀性提高了。所以在使用時就會非常清楚它要表達的含義:
- public static void main(String[] args) {
- //定義張三這個人
- Person p = new Person("張三");
- //設置張三的家庭信息
- p.setHome(new Person.Home("上海","021"));
- }
定義張三這個人,然後通過Person.Home類設置張三的家庭信息,這是不是就和我們真實世界的情形相同了?先登記人的主要信息,然後登記人員的分類信息。可能你又要問了,這和我們一般定義的類有什麼區別呢?又有什麼吸引人的地方呢?如下所示:
提高封裝性。從代碼位置上來講,靜態內部類放置在外部類內,其代碼層意義就是:靜態內部類是外部類的子行為或子屬性,兩者直接保持著一定的關係,比如在我們的例子中,看到Home類就知道它是Person的Home信息。
提高代碼的可讀性。相關聯的代碼放在一起,可讀性當然提高了。
形似內部,神似外部。靜態內部類雖然存在於外部類內,而且編譯後的類文件名也包含外部類(格式是:外部類+$+內部類),但是它可以脫離外部類存在,也就是說我們仍然可以通過new Home()聲明一個Home對象,隻是需要導入“Person.Home”而已。
解釋了這麼多,讀者可能會覺得外部類和靜態內部類之間是組合關係(Composition)了,這是錯誤的,外部類和靜態內部類之間有強關聯關係,這僅僅表現在“字麵”上,而深層次的抽象意義則依賴於類的設計。
那靜態內部類與普通內部類有什麼區別呢?問得好,區別如下:
(1)靜態內部類不持有外部類的引用
在普通內部類中,我們可以直接訪問外部類的屬性、方法,即使是private類型也可以訪問,這是因為內部類持有一個外部類的引用,可以自由訪問。而靜態內部類,則隻可以訪問外部類的靜態方法和靜態屬性(如果是private權限也能訪問,這是由其代碼位置所決定的),其他則不能訪問。
(2)靜態內部類不依賴外部類
普通內部類與外部類之間是相互依賴的關係,內部類實例不能脫離外部類實例,也就是說它們會同生同死,一起聲明,一起被垃圾回收器回收。而靜態內部類是可以獨立存在的,即使外部類消亡了,靜態內部類還是可以存在的。
(3)普通內部類不能聲明static的方法和變量
普通內部類不能聲明static的方法和變量,注意這裏說的是變量,常量(也就是final static修飾的屬性)還是可以的,而靜態內部類形似外部類,沒有任何限製。
最後更新:2017-04-03 15:21:51