Java 匿名對(duì)象與匿名內(nèi)部類的使用
很多小伙伴對(duì)匿名對(duì)象和匿名內(nèi)部類的寫法有點(diǎn)陌生,這里專門寫一篇來(lái)幫助大家認(rèn)識(shí)一下他們的寫法。
一、匿名對(duì)象
比如現(xiàn)在有一個(gè)Student
類,里面啥也沒有寫:
/** * ClassName: Student * Package: PACKAGE_NAME * Description: * * @Author 雨翼輕塵 * @Create 2024/1/31 0031 11:39 */ public class Student { }
然后還有一個(gè)測(cè)試類Test
:
/** * ClassName: Test * Package: PACKAGE_NAME * Description: * * @Author 雨翼輕塵 * @Create 2024/1/31 0031 11:39 */ public class Test { public static void main(String[] args) { //類->對(duì)象 格式:類名Student 對(duì)象名stu = new 類名Student(); Student stu=new Student(); } }
類->對(duì)象
格式:類名Student 對(duì)象名stu = new 類名Student();
如下:
public class Test { public static void main(String[] args) { //類->對(duì)象 格式:類名Student 對(duì)象名stu = new 類名Student(); Student stu=new Student(); } }
現(xiàn)在打印出來(lái)就是地址值:
如果這樣,也是地址值:
每new
一次,就會(huì)創(chuàng)建一個(gè)對(duì)象,相當(dāng)于在堆中開辟了一塊空間,所以地址值都不一樣,如下:
public class Test { public static void main(String[] args) { //類->對(duì)象 格式:類名Student 對(duì)象名stu = new 類名Student(); Student stu=new Student(); System.out.println(stu); //test.Student@4eec7777 System.out.println(new Student()); //test.Student@3b07d329 System.out.println(new Student()); //test.Student@41629346 } }
上面的stu
是有名字的對(duì)象,而現(xiàn)在的new Student()
沒有對(duì)象名,叫做匿名對(duì)象。
有了new關(guān)鍵字,就表示在堆里面創(chuàng)建了一個(gè)新的空間。
現(xiàn)在在Student
類里面加上屬性,比如:
public class Student { String name; //姓名 }
正常情況下,name
可以賦值:
public class Test { public static void main(String[] args) { //類->對(duì)象 格式:類名Student 對(duì)象名stu = new 類名Student(); Student stu=new Student(); System.out.println(stu); //test.Student@4eec7777 stu.name="張三"; System.out.println(stu.name); //張三 } }
打印出來(lái)就是“張三”:
??那么new Student()
可以給name
賦值嗎?
是可以的。
它是一個(gè)匿名對(duì)象,雖然沒有名字,但是它可以給屬性賦值的。如下:
public class Test { public static void main(String[] args) { System.out.println(new Student().name="李四"); //test.Student@3b07d329 System.out.println(new Student()); //test.Student@41629346 } }
輸出:
“匿名對(duì)象”只不過是一個(gè)沒有名字的對(duì)象而已,依然是一個(gè)對(duì)象。
若是方法依然可以調(diào)用的,比如現(xiàn)在寫一個(gè)方法eat
,如下:
public class Student { String name; //姓名 public void eat(){ System.out.println("使勁吃..."); } }
測(cè)試類里面:
public class Test { public static void main(String[] args) { //類->對(duì)象 格式:類名Student 對(duì)象名stu = new 類名Student(); Student stu=new Student(); System.out.println(stu); //test.Student@4eec7777 stu.name="張三"; System.out.println(stu.name); //張三 stu.eat(); System.out.println(new Student().name="李四"); //test.Student@3b07d329 System.out.println(new Student()); //test.Student@41629346 new Student().eat(); } }
輸出結(jié)果:
像這樣直接new了一個(gè)類名,但是沒有給對(duì)象名的,叫做“匿名對(duì)象”。
區(qū)別就是,有名的對(duì)象它可以多次使用,而匿名對(duì)象卻只能使用一次。
二、匿名內(nèi)部類
提供一個(gè)接口IA
,里面寫一個(gè)抽象方法play
,如下:
package test; /** * ClassName: IA * Package: test * Description: * * @Author 雨翼輕塵 * @Create 2024/1/31 0031 12:08 */ public interface IA { //抽象方法 void play(); }
抽象方法省略了public abstract
。
抽象方法要想重寫,需要有子類去實(shí)現(xiàn)這個(gè)接口。
接下來(lái)寫一個(gè)實(shí)現(xiàn)類IAImpl
,將接口里面的抽象方法重寫一下,如下:
package test; /** * ClassName: IAImpl * Package: test * Description: * * @Author 雨翼輕塵 * @Create 2024/1/31 0031 12:12 */ public class IAImpl implements IA{ @Override public void play() { System.out.println("打游戲..."); } }
然后再來(lái)一個(gè)測(cè)試類IATest
,以多態(tài)的方式創(chuàng)建接口:
package test; /** * ClassName: IATest * Package: test * Description: * * @Author 雨翼輕塵 * @Create 2024/1/31 0031 12:14 */ public class IATest { public static void main(String[] args) { IA ia=new IAImpl(); //多態(tài) } }
IA ia=new IAImpl();
,接口不能傳對(duì)象,口訣:多態(tài)–“父父new子”。
實(shí)現(xiàn)類可以看成繼承關(guān)系。
現(xiàn)在來(lái)使用ia調(diào)用play
方法:
public class IATest { public static void main(String[] args) { IA ia=new IAImpl(); //多態(tài) ia.play(); //編譯看左,運(yùn)行看右 } }
輸出:
ia.play();
“編譯看左,運(yùn)行看右”,接口IA
里面有play
方法,它被實(shí)現(xiàn)類IAImpl
重寫了,所以執(zhí)行的時(shí)候是看實(shí)現(xiàn)類里面的。
現(xiàn)在我們來(lái)看一下這個(gè)藍(lán)色部分,這個(gè)括號(hào)里面只有一個(gè)方法的重寫:
之前說接口不能new,我們來(lái)看一下這樣:
??看一下剛才的兩個(gè)藍(lán)色部分,有什么區(qū)別?
沒有區(qū)別!只不過右邊多了一個(gè)最后的分號(hào)。
既然花括號(hào)里面的內(nèi)容和實(shí)現(xiàn)類的一模一樣,那我們可以使用i調(diào)用里面的方法play
,如下:
public class IATest { public static void main(String[] args) { IA ia=new IAImpl(); //多態(tài) ia.play(); //編譯看左,運(yùn)行看右 System.out.println("------------------"); IA i=new IA() { @Override public void play() { System.out.println("打游戲哈哈哈..."); } }; i.play(); } }
打印輸出:
可以看到,調(diào)用的是花括號(hào)里面重寫IA接口的方法。
我們new了一個(gè)接口之后,后面的大括號(hào)里面可以看作一個(gè)類的結(jié)構(gòu)。如下:
在花括號(hào)里面是對(duì)方法的重寫,重寫的是IA接口的抽象方法。
現(xiàn)在寫一個(gè)IB接口
:
public interface IB { //抽象方法 void sleep(); }
再寫一個(gè)測(cè)試類IBTest
:
public class IBTest { public static void main(String[] args) { } }
目前IB接口沒有實(shí)現(xiàn)類,還可以創(chuàng)建對(duì)象嗎?
可以的,如下:
public class IBTest { public static void main(String[] args) { IB ib=new IB() { @Override public void sleep() { } }; } }
這個(gè)結(jié)構(gòu)和它的實(shí)現(xiàn)類結(jié)構(gòu)是一樣的(藍(lán)色部分):
現(xiàn)在就不需要接口的實(shí)現(xiàn)類了,上面藍(lán)色部分就是它的匿名實(shí)現(xiàn)類
。
通過ib.sleep()
來(lái)調(diào)用重寫的抽象方法:
public class IBTest { public static void main(String[] args) { IB ib=new IB() { @Override public void sleep() { System.out.println("睡覺..."); } }; ib.sleep(); } }
輸出:
這就是匿名內(nèi)部類,new的接口,相當(dāng)于是把實(shí)現(xiàn)類的結(jié)構(gòu)拿了過來(lái),重寫了一下。
??還有一種寫法。
剛才說了匿名對(duì)象,可以直接拿匿名對(duì)象去調(diào)用方法。
同樣,我們還可以使用匿名內(nèi)部類直接調(diào)用方法。
這個(gè)叫做創(chuàng)建“匿名實(shí)現(xiàn)類的有名對(duì)象”,如下結(jié)構(gòu):
IB ib = new IB(){ //sleep()方法的重寫 }; ib.sleep(); //用ib調(diào)用方法sleep()
現(xiàn)在我們直接new一個(gè)接口IB
:
new IB(){ //sleep()方法的重寫 }
然后直接用它調(diào)用sleep()
方法,如下:
new IB(){ //sleep()方法的重寫 }.sleep();
??代碼
public class IBTest { public static void main(String[] args) { IB ib=new IB() { @Override public void sleep() { System.out.println("睡覺..."); } }; ib.sleep(); System.out.println("-------"); new IB(){ @Override public void sleep() { System.out.println("晚安嘍"); } }.sleep(); } }
??輸出
這里的ib
就表示:
那就可以直接拿它調(diào)用sleep()
方法:
??看一下正常的一般寫法:
再看一下這兩種方式:
到此這篇關(guān)于Java 匿名對(duì)象與匿名內(nèi)部類的使用的文章就介紹到這了,更多相關(guān)Java 匿名對(duì)象與匿名內(nèi)部類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot錯(cuò)誤頁(yè)面和錯(cuò)誤信息定制操作
這篇文章主要介紹了Springboot錯(cuò)誤頁(yè)面和錯(cuò)誤信息定制操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10jeefast和Mybatis實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)的示例代碼
這篇文章主要介紹了jeefast和Mybatis實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)的示例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10javaWeb用戶權(quán)限控制簡(jiǎn)單實(shí)現(xiàn)過程
這篇文章主要為大家詳細(xì)介紹了javaWeb用戶權(quán)限控制簡(jiǎn)單實(shí)現(xiàn)過程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08Java中高效的判斷數(shù)組中某個(gè)元素是否存在詳解
相信大家在操作Java的時(shí)候,經(jīng)常會(huì)要檢查一個(gè)數(shù)組(無(wú)序)是否包含一個(gè)特定的值?這是一個(gè)在Java中經(jīng)常用到的并且非常有用的操作。同時(shí),這個(gè)問題在Stack Overflow中也是一個(gè)非常熱門的問題。本文將分析幾種常見用法及其時(shí)間成本,有需要的朋友們可以參考借鑒。2016-11-11Eclipse可視化插件WindowBuilder的安裝方法
這篇文章主要介紹了Eclipse可視化插件WindowBuilder的安裝方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06MyBatis動(dòng)態(tài)<if>標(biāo)簽使用避坑指南
這篇文章主要為大家介紹了MyBatis動(dòng)態(tài)<if>標(biāo)簽使用避坑指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03java 后臺(tái)將base64字符串保存為圖片的方法
本篇文章主要介紹了java 后臺(tái)將base64字符串保存為圖片的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-09-09SpringBoot接收接口入?yún)⒌姆绞叫〗Y(jié)
這篇文章主要給大家介紹了SpringBoot接收接口入?yún)⒌膸追N方式,我們從調(diào)用方的視角去看待這個(gè)問題,對(duì)調(diào)用方來(lái)說,它在調(diào)用接口時(shí)有好幾種傳參方式,下面,將會(huì)依次對(duì)這幾種參數(shù)方式進(jìn)行講解和代碼示例,需要的朋友可以參考下2024-01-01Java將byte[]轉(zhuǎn)圖片存儲(chǔ)到本地的案例
這篇文章主要介紹了Java將byte[]轉(zhuǎn)圖片存儲(chǔ)到本地的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-10-10關(guān)于MyBatis的foreach標(biāo)簽常用方法
這篇文章主要介紹了關(guān)于MyBatis的foreach標(biāo)簽常用方法,foreach 標(biāo)簽可以用來(lái)遍歷數(shù)組、列表和 Map 等集合參數(shù),實(shí)現(xiàn)批量操作或一些簡(jiǎn)單 SQL 操作,需要的朋友可以參考下2023-05-05