1.什么是內部類
在一個類的里面再定義一個類,新定義的這個類就是內部類
舉例:在Outer類的里面定義一個Inter類
class Outer{class Inter{}
}
在這里Outer叫外部類,Inter叫內部類
內部類的應用場景
定義一個汽車類:
屬性:汽車品牌,型號,價格,發動機的型號和使用年限的等等
這里發動機是一個獨立的個體,但是又依附于汽車,單獨純在沒有意義
代碼示例:
class Car{ //汽車類String carName;int carAge;int carPrice;class Engine{ //發動機String engineName;int engineAge;}
}
注意:
內部類表示的事物是外部類的一部分
內部類單獨出現沒有任何意義
內部類的訪問特點
1.內部類可以直接訪問外部類的成員,包括私有
2.外部類要訪問內部類的成員,必須創建對象
2.成員內部類
1.成員內部類是寫在成員位置的,屬于外部類的成員(上述Enging類就是成員內部類)
2.成員內部類可以被一些修飾符所修飾,比如:private,default(默認),protected,public,static(被static修飾的成員內部類叫靜態內部類)
3.在成員內部類里面,JDK16之前不能定義靜態變量,JDK16以后才可定義靜態變量
如何獲取成員內部類
1.直接創建
格式:
外部類.內部類.對象名=外部類對象.內部類對象() Outer.Inner oi=new Outer().new Inner();
2.外部類編寫方法,對外提供內部類對象
樣例:
class Car{String carName;int carAge;int carPrice; //private修飾的內部類,main無法訪問,也不能使用外部類.出來private class Engine{String engineName;int engineAge;} //獲取內部類的方法public Engine getinstance(){return new Engine();}} public class T1 {public static void main(String[] args) { //方法1:創建一個外部類對象,用Object形成多態接收內部類 Car car=new Car(); Object en=car.getinstance(); //方法二,直接使用內部類 Car car1=new Car();System.out.println(car1.getinstance());} }
成員內部類面試題:
class Outer{int a=10;class Inter{int a=20;public void show(){int a=30;System.out.println();//打印10System.out.println();//打印20System.out.println();//打印30}}
}
當變量名不同使,直接調用即可
當外部類和內部類還有局部的變量名相同時,直接打印會遵循就近原則
想要打印分別打贏就可以按下面這種方式調用
class Outer{int a=10;class Inter{int a=20;public void show(){int a=30;System.out.println(Outer.this.a);//打印10System.out.println(this.a);//打印20System.out.println(a);//打印30}} }
?
3.靜態內部類
1.靜態內部類就是被static修飾的成員內部類
2.靜態內部類只能訪問外部類中的靜態變量和靜態方法,如果要訪問非靜態的變量和方法,需要創建對象
3.創建靜態內部類對象的格式:
外部類名.內部類名 對象名=new 外部類名.內部類名(); Outer.Inter oi=new Outer.Inter();
4.調用靜態內部類中非靜態的方法:先創建對象,使用對象調用
5.調用靜態內部類中的靜態方法:外部類名.內部類名.方法名();
4.局部內部類
1.將內部類定義在方法里面的類就叫做局部內部類,類似與方法中的局部變量
2.外界無法直接使用,需要在方法內部創建對象并使用
3.該類可以直接訪問外部類的成員,也可訪問方法類的局部變量
5.匿名內部類(重點)
匿名內部類本質上就是隱藏了名字的內部類
格式:
new 類名或接口名(){
重寫方法;
}舉例:
new Inter(){
public void show(){}
}
遵循編譯看左邊,運行看右邊的原則
Swin s=new Swin(){//實現了多態
public void swin(){
sout("重寫接口里面swin的方法");
}
};
s.swin();
匿名內部類是一個對象,可以直接點方法調用自己類里面的方法
new Swin(){
public void swin(){
sout("重寫接口里面swin的方法");
}
}.swin();
使用場景:
1.當方法的參數是接口或者類時
2.以接口為例,可以傳遞這個接口的實現類對象
3.如果實現類只要使用一次,就可以使用匿名內部類簡化代碼
注意:匿名內部類可以寫在局部位置也可以寫在成員位置