導(dǎo)語(yǔ)
學(xué)完匿名內(nèi)部類就懂的情書(shū)瘸味。
// 情書(shū)
// 在我的世界你永遠(yuǎn)18歲
me.world(new You() { // 在我的世界只有最初的你
public void getAge() { // 你的年齡
System.out.println("18歲"); // 永遠(yuǎn)18歲
}
});
主要內(nèi)容
- 接口與抽象類和匿名內(nèi)部類的關(guān)系
具體內(nèi)容
匿名內(nèi)部類也就是沒(méi)有名字的內(nèi)部類宫仗,正因?yàn)闆](méi)有名字,所以匿名內(nèi)部類只能使用一次旁仿,它通常用來(lái)簡(jiǎn)化代碼編寫(xiě)锰什,但使用匿名內(nèi)部類還有個(gè)前提條件:必須繼承一個(gè)父類或?qū)崿F(xiàn)一個(gè)接口。
為什么需要存在有匿名內(nèi)部類丁逝。
范例:觀察如下代碼
interface Message {
public void print();
}
class MessageImpl imlements Message {
public void print() {
System.out.println("Hello World !");
}
}
public class TestDemo {
public static void main(String args[]) {
fun(new MessageImpl());
}
public static void fun(Message msg) {
msg.print();
}
}
輸出結(jié)果:
Hello World !
正常的規(guī)律就是一個(gè)接口或者是抽象類需要有子類汁胆,子類要覆寫(xiě)所有的抽象方法。
可是如果說(shuō)現(xiàn)在的MessageImpl子類只使用唯一的一次霜幼,那么還有必要將其單獨(dú)定義為一個(gè)類嗎嫩码?所以這個(gè)時(shí)候,就可以采用匿名內(nèi)部類的方式進(jìn)行代碼的簡(jiǎn)化罪既。
范例:簡(jiǎn)化后的代碼
interface Message {
public void print();
}
public class TestDemo {
public static void main(String args[]) {
fun(new Message() {
public void print() {
System.out.println("Hello World !");
}
});
}
public static void fun(Message msg) {
msg.print();
}
}
輸出結(jié)果:
Hello World !
下面這個(gè)代碼塊就被稱為匿名內(nèi)部類铸题。
{
public void print() {
System.out.println("Hello World !");
}
}
使用匿名內(nèi)部類的時(shí)候,有一個(gè)前提:必須要基于接口或抽象類的應(yīng)用琢感。
但是需要強(qiáng)烈強(qiáng)調(diào)的是丢间,如果匿名內(nèi)部類定義在了方法里面,方法的參數(shù)或者是變量要被匿名內(nèi)部類所訪問(wèn)驹针,那么必須加上final關(guān)鍵字(JDK 1.8之后此要求被改變了)烘挫。
總結(jié)
匿名內(nèi)部類是在抽象類和接口的基礎(chǔ)上發(fā)展的,匿名內(nèi)部類的最大好處是幫助用戶減少了類的定義柬甥。