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