java中匿名內(nèi)部類(lèi)詳解
java匿名內(nèi)部類(lèi):
1:匿名內(nèi)部類(lèi),匿名內(nèi)部類(lèi)也就是沒(méi)有名字的內(nèi)部類(lèi)。
2:匿名內(nèi)部類(lèi)的作用
正因?yàn)闆](méi)有名字,所以匿名內(nèi)部類(lèi)只能使用一次,它通常用來(lái)簡(jiǎn)化代碼編寫(xiě)。
3:匿名內(nèi)部類(lèi)的實(shí)現(xiàn)
匿名內(nèi)部類(lèi)的兩種實(shí)現(xiàn)方式:第一種,繼承一個(gè)類(lèi),重寫(xiě)其方法;第二種,實(shí)現(xiàn)一個(gè)接口(可以是多個(gè)),實(shí)現(xiàn)其方法。
4:匿名內(nèi)部類(lèi)的創(chuàng)建
匿名類(lèi)是不能有名稱(chēng)的類(lèi),所以沒(méi)辦法引用它們。必須在創(chuàng)建時(shí),作為new語(yǔ)句的一部分來(lái)聲明它們。
package com.mianshi.test;
/**
* 類(lèi)名稱(chēng):AnonymousInnerClassTest
* 描述: 匿名內(nèi)部類(lèi)測(cè)試
* 創(chuàng)建人:王秋林
* 創(chuàng)建時(shí)間:2017-2-12
*/
public class AnonymousInnerClassTest {
public static void main(String args[]){
AnonymousInnerClassTest test = new AnonymousInnerClassTest();
test.show();
}
//在這個(gè)方法中構(gòu)造了一個(gè)匿名內(nèi)部類(lèi)
private void show(){
Out anonyInter = new Out(){//獲取匿名內(nèi)部類(lèi)實(shí)例
void show(){//重寫(xiě)父類(lèi)的方法
System.out.println("this is Anonymous InnerClass showing.");
}
};
anonyInter.show();//調(diào)用其方法
}
}
//這是一個(gè)已經(jīng)存在的類(lèi),匿名內(nèi)部類(lèi)通過(guò)重寫(xiě)其方法,將會(huì)獲得另外的實(shí)現(xiàn)
class Out{
void show(){
System.out.println("this is Out showing.");
}
}
5:匿名內(nèi)部類(lèi)的基本實(shí)現(xiàn)
(1)抽象方法實(shí)現(xiàn)
abstract class Person {
public abstract void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
運(yùn)行結(jié)果:eat something
(2)接口實(shí)現(xiàn)
interface Person {
public void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
運(yùn)行結(jié)果:eat something
由上面的例子可以看出,只要一個(gè)類(lèi)是抽象的或是一個(gè)接口,那么其子類(lèi)中的方法都可以使用匿名內(nèi)部類(lèi)來(lái)實(shí)現(xiàn)。最常用的情況就是在多線程的實(shí)現(xiàn)上,因?yàn)橐獙?shí)現(xiàn)多線程必須繼承Thread類(lèi)或是繼承Runnable接口。
(3)Thread類(lèi)的匿名內(nèi)部類(lèi)實(shí)現(xiàn)
public class Demo {
public static void main(String[] args) {
Thread t = new Thread() {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
}
};
t.start();
}
}
運(yùn)行結(jié)果:1 2 3 4 5
(4)Runnable接口的匿名內(nèi)部類(lèi)實(shí)現(xiàn)
public class Demo {
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
}
};
Thread t = new Thread(r);
t.start();
}
}
運(yùn)行結(jié)果:1 2 3 4 5
二、匿名內(nèi)部類(lèi)的注意事項(xiàng)
(1)匿名內(nèi)部類(lèi)不能有構(gòu)造方法。
(2)匿名內(nèi)部類(lèi)不能定義任何靜態(tài)成員、方法和類(lèi)。
(3)匿名內(nèi)部類(lèi)不能是public,protected,private,static。
(4)只能創(chuàng)建匿名內(nèi)部類(lèi)的一個(gè)實(shí)例。
(5)一個(gè)匿名內(nèi)部類(lèi)一定是在new的后面,用其隱含實(shí)現(xiàn)一個(gè)接口或?qū)崿F(xiàn)一個(gè)類(lèi)。
(6)因匿名內(nèi)部類(lèi)為局部?jī)?nèi)部類(lèi),所以局部?jī)?nèi)部類(lèi)的所有限制都對(duì)其生效。
(7)匿名類(lèi)和內(nèi)部類(lèi)中的中的this:有時(shí)候,我們會(huì)用到一些內(nèi)部類(lèi)和匿名類(lèi)。當(dāng)在匿名類(lèi)中用this時(shí),這個(gè)this則指的是匿名類(lèi)或內(nèi)部類(lèi)本身。這時(shí)如果我們要使用外部類(lèi)的方法和變量的話,則應(yīng)該加上外部類(lèi)的類(lèi)名。
以上就是本篇文章內(nèi)容,需要的朋友可以參考
相關(guān)文章
Spring Boot2中如何優(yōu)雅地個(gè)性化定制Jackson實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Spring Boot2中如何優(yōu)雅地個(gè)性化定制Jackson實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Java實(shí)現(xiàn)數(shù)獨(dú)小游戲
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)數(shù)獨(dú)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05
淺談SpringMVC中的session用法及細(xì)節(jié)記錄
下面小編就為大家?guī)?lái)一篇淺談SpringMVC中的session用法及細(xì)節(jié)記錄。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
關(guān)于Long和Integer相互轉(zhuǎn)換方式
這篇文章主要介紹了關(guān)于Long和Integer相互轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
springboot 使用ThreadLocal的實(shí)例代碼
這篇文章主要介紹了springboot 使用ThreadLocal的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot利用dag加速Spring beans初始化的方法示例
本文介紹了利用DAG加速SpringBoot中Spring beans初始化,先解釋了DAG 概念及特性,包括節(jié)點(diǎn)入度出度、拓?fù)渑判虻?接著闡述加速Spring Bean初始化的實(shí)現(xiàn)思路,如識(shí)別依賴(lài)關(guān)系構(gòu)建DAG、拓?fù)渑判?、并行初始化Bean及與Spring集成,還展示了相關(guān)代碼工程、測(cè)試結(jié)果及引用2024-12-12
使用jenkins部署springboot項(xiàng)目的方法步驟
這篇文章主要介紹了使用jenkins部署springboot項(xiàng)目的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

