Java語言允許在類中再定義類谐算,這種在其它類內(nèi)部定義的類就叫內(nèi)部類。內(nèi)部類又分為:==成員內(nèi)部類==、==局部?jī)?nèi)部類==灌曙、==匿名內(nèi)部類== 和 ==靜態(tài)內(nèi)部類== 四種。
靜態(tài)內(nèi)部類
- 靜態(tài)內(nèi)部類的創(chuàng)建是不需要依賴于外圍類的节芥。
- 靜態(tài)內(nèi)部類不能使用任何外圍類的非static成員變量和方法在刺。
內(nèi)部類內(nèi)要?jiǎng)?chuàng)建靜態(tài)內(nèi)部類逆害,此內(nèi)部類也需要是要靜態(tài)內(nèi)部類
Outer.Inner in=new Outer.Inner();
匿名內(nèi)部類
繼承一個(gè)父類或者實(shí)現(xiàn)一個(gè)接口,例如Android中OnClickListener蚣驼。
- 使用匿名內(nèi)部類時(shí)魄幕,我們必須是繼承一個(gè)類或者實(shí)現(xiàn)一個(gè)接口,但是兩者不可兼得颖杏,同時(shí)也只能繼承一個(gè)類或者實(shí)現(xiàn)一個(gè)接口纯陨。
- 匿名內(nèi)部類中是不能定義構(gòu)造函數(shù)的。
- 匿名內(nèi)部類中不能存在任何的靜態(tài)成員變量和靜態(tài)方法留储。
- 匿名內(nèi)部類為局部?jī)?nèi)部類翼抠,所以局部?jī)?nèi)部類的所有限制同樣對(duì)匿名內(nèi)部類生效。
- 匿名內(nèi)部類不能是抽象的获讳,它必須要實(shí)現(xiàn)繼承的類或者實(shí)現(xiàn)的接口的所有抽象方法阴颖。
public abstract class Bird {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract int fly();
}
public class Test {
public void test(Bird bird){
System.out.println(bird.getName() + "能夠飛 " + bird.fly() + "米");
}
public static void main(String[] args) {
Test test = new Test();
test.test(new Bird() {
public int fly() {
return 10000;
}
public String getName() {
return "大雁";
}
});
}
}
在Test類中,test()方法接受一個(gè)Bird類型的參數(shù)赔嚎,同時(shí)我們知道一個(gè)抽象類是沒有辦法直接new的膘盖,我們必須要先有實(shí)現(xiàn)類才能new出來它的實(shí)現(xiàn)類實(shí)例。所以在mian方法中直接使用匿名內(nèi)部類來創(chuàng)建一個(gè)Bird實(shí)例尤误。由于匿名內(nèi)部類不能是抽象類侠畔,所以它必須要實(shí)現(xiàn)它的抽象父類或者接口里面所有的抽象方法。
成員內(nèi)部類
- 成員內(nèi)部類中不能存在任何static的變量和方法损晤。
- 成員內(nèi)部類是依附于外圍類的软棺,所以只有先創(chuàng)建了外圍類才能夠創(chuàng)建內(nèi)部類。
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
局部?jī)?nèi)部類
嵌套在方法和作用于內(nèi)的尤勋。