15.內部類

1.內部類

1.1內部類的限制

a.在外部類的非靜態方法之外的任何位置創建內部類的對象的時候,不能直接調用內部類的構造函數,而是應該藉助外部類的對象進行對象的創建

b.不能含有static函數(這裏不包含嵌套類)

 

1.2內部的特權

a.內部類可以直接使用外部類的所有屬性(包含static屬性)

b.內部類可以被private修飾,這樣的話內部類就只能在外部類中進行使用,在一般的類中就不能使用。

 

1.3創建內部類對象

條件---必須依賴外部類對象(除了嵌套類),這也是爲什麼內部類可以訪問外部類屬性的原因(內部類包含一個外部類的引用)

非靜態內部類對象有着指向其外部類對象的引用 

外部類中

a.靜態函數---利用this,直接創建內部類對象

b.非靜態函數-先創建外部類對象,再創建內部類對象

 

一般類中

a.先創建外部類對象,再創建內部類對象

 

1.4.幾種特殊的內部類

a.局部內部類

---1)函數內部

只能在函數內部使用,若要在外部使用,必須實現接口,向上轉型

 

public static Myinterface g(){
        class Inner1 implements Myinterface{
            private String label="yangyun";
            @Override
            public String toString(){
                return String.format(""+label);
            }
        }
        return new Inner1();
    }
}

 

---2).代碼內部---if語句中

b.匿名內部類--利用接口或者是父類(沒有構造函數)

 

interface Content{int value();}
public Content getContent(){
     return new Content(){
            int num=100;
            public int value(){
                    return num*10;
            }
     };
}

c.嵌套內部類---靜態內部類

靜態內部類的特徵

 

1.創建嵌套類對象的時候並不需要創建外部類的對象--(一般的內部類必須藉助外部類的對象)

2.不能使用外部類的非靜態屬性

3.普通的內部類中不能包含static字段,嵌套類就可以

 

1.5傳入內部類中的參數必須是final的--重點

注意:只是局部變量必須是final,一般的外部類屬性不必是final的

 

public Myinterface f(final String m){
        return new Myinterface(){
            private String name=m;
        };
  }

 

 原因

  • 通過反編譯可以知道,傳入的變量拷貝了一份被內部類使用
  • 爲了保證數據的一致性,要求傳入的數據必須是final

 

1.7 接口中能不能有內部類

可以有嵌套類---接口中的屬性,必須是public、static、final的

 

interface Myinterface{
    class MyInner{
        private String info="ABC";
        @Override
        public String toString(){
            return info;
        }
    }
}

 

 

1.8回調與閉包

  • 閉包
  • 從字面上很難理解閉包什麼玩意,閉包是一個可調用對象,包含了一些創建該對象的作用域中的信息(就是外部類對象的引用),從這個定義來看,內部類就是Java的閉包,js中是通過內部函數進行實現的,Java中必報的實現方式就是內部類。

 

  • 回調
  • 回調就是內部類調用外部類函數的過程,利用外部類的引用

 

1.9內部類的總結

java中的內部類和接口加在一起,可以解決常被C++程序員抱怨java中存在的一個問題——沒有多繼承。實際上,C++的多繼承設計起來很複雜,而java通過內部類加上接口,可以很好的實現多繼承的效果,內部類可以嵌套很多層。

 

參考文獻

http://progress.iteye.com/blog/582460

http://lovejavaei.iteye.com/blog/401167

http://flowercat.iteye.com/blog/33371

http://blog.csdn.net/yu422560654/article/details/7001797

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章