內部類:若是A類須要直接訪問B類中的成員,而B類又須要創建A類的對象。這時,爲了方便設計和訪問,直接將A類定義在B類中。就能夠了。A類就稱爲內部類。內部類能夠直接訪問外部類中的成員。而外部類想要訪問內部類,必需要創建內部類的對象。java
-----------------------------------------------------面試
class Outer{函數
int num = 4; this
class Inner {spa
void show(){設計
System.out.println("inner show run "+num); 對象
}繼承
}接口
public void method(){io
Inner in = new Inner();//建立內部類的對象。
in.show();//調用內部類的方法。
}
}
-------------------------------------------------------
當內部類定義在外部類中的成員位置上,可使用一些成員修飾符修飾 private、static。
1:默認修飾符。
直接訪問內部類格式:外部類名.內部類名 變量名 = 外部類對象.內部類對象;
Outer.Inner in = new Outer.new Inner();//這種形式不多用。
可是這種應用很少見,由於內部類之因此定義在內部就是爲了封裝。想要獲取內部類對象一般都經過外部類的方法來獲取。這樣能夠對內部類對象進行控制。
2:私有修飾符。
一般內部類被封裝,都會被私有化,由於封裝性不讓其餘程序直接訪問。
3:靜態修飾符。
若是內部類被靜態修飾,至關於外部類,會出現訪問侷限性,只能訪問外部類中的靜態成員。
注意;若是內部類中定義了靜態成員,那麼該內部類必須是靜態的。
內部類編譯後的文件名爲:「外部類名$內部類名.java」;
爲何內部類能夠直接訪問外部類中的成員呢?
那是由於內部中都持有一個外部類的引用。這個是引用是 外部類名.this
內部類能夠定義在外部類中的成員位置上,也能夠定義在外部類中的局部位置上。
當內部類被定義在局部位置上,只能訪問局部中被final修飾的局部變量。
匿名內部類:沒有名字的內部類。就是內部類的簡化形式。通常只用一次就能夠用這種形式。匿名內部類其實就是一個匿名子類對象。想要定義匿名內部類:須要前提,內部類必須繼承一個類或者實現接口。
匿名內部類的格式:new 父類名&接口名(){ 定義子類成員或者覆蓋父類方法 }.方法。
匿名內部類的使用場景:
當函數的參數是接口類型引用時,若是接口中的方法不超過3個。能夠經過匿名內部類來完成參數的傳遞。
其實就是在建立匿名內部類時,該類中的封裝的方法不要過多,最好兩個或者兩個之內。
--------------------------------------------------------
//面試
//1
new Object(){
void show(){
System.out.println("show run");
}
}.show();
//2
Object obj = new Object(){
void show(){
System.out.println("show run");
}
};
obj.show();
1和2的寫法正確嗎?有區別嗎?說出緣由。
寫法是正確,1和2都是在經過匿名內部類創建一個Object類的子類對象。
區別:
第一個但是編譯經過,並運行。
第二個編譯失敗,由於匿名內部類是一個子類對象,當用Object的obj引用指向時,就被提高爲了
Object類型,而編譯時檢查Object類中是否有show方法,因此編譯失敗。
-------------------------------------------------------
class InnerClassDemo6 {
+(static)class Inner{
void show(){}
}
public void method(){
this.new Inner().show();//能夠
}
public static void main(String[] args) {//static不容許this
This.new Inner().show();//錯誤,Inner類須要定義成static
}
}
------------------------------------------------------
interface Inter{
void show();
}
class Outer{//經過匿名內部類補足Outer類中的代碼。
public static Inter method(){
return new Inter(){
public void show(){}
};
}
}
class InnerClassDemo7 {
public static void main(String[] args) {
Outer.method().show();
/*
Outer.method():意思是:Outer中有一個名稱爲method的方法,並且這個方法是靜態的。
Outer.method().show():當Outer類調用靜態的method方法運算結束後的結果又調用了show方法,意味着:method()方法運算完一個是對象,並且這個對象是Inter類型的。
*/
function (new Inter(){
public void show(){}
}); //匿名內部類做爲方法的參數進行傳遞。
}
public static void function(Inter in){
in.show();
}
}