Java 匿名對象與匿名內(nèi)部類的使用
很多小伙伴對匿名對象和匿名內(nèi)部類的寫法有點(diǎn)陌生,這里專門寫一篇來幫助大家認(rèn)識一下他們的寫法。
一、匿名對象
比如現(xiàn)在有一個Student類,里面啥也沒有寫:
/**
* ClassName: Student
* Package: PACKAGE_NAME
* Description:
*
* @Author 雨翼輕塵
* @Create 2024/1/31 0031 11:39
*/
public class Student {
}
然后還有一個測試類Test:
/**
* ClassName: Test
* Package: PACKAGE_NAME
* Description:
*
* @Author 雨翼輕塵
* @Create 2024/1/31 0031 11:39
*/
public class Test {
public static void main(String[] args) {
//類->對象 格式:類名Student 對象名stu = new 類名Student();
Student stu=new Student();
}
}
類->對象
格式:類名Student 對象名stu = new 類名Student();
如下:
public class Test {
public static void main(String[] args) {
//類->對象 格式:類名Student 對象名stu = new 類名Student();
Student stu=new Student();
}
}
現(xiàn)在打印出來就是地址值:

如果這樣,也是地址值:

每new一次,就會創(chuàng)建一個對象,相當(dāng)于在堆中開辟了一塊空間,所以地址值都不一樣,如下:
public class Test {
public static void main(String[] args) {
//類->對象 格式:類名Student 對象名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是有名字的對象,而現(xiàn)在的new Student()沒有對象名,叫做匿名對象。
有了new關(guān)鍵字,就表示在堆里面創(chuàng)建了一個新的空間。
現(xiàn)在在Student類里面加上屬性,比如:
public class Student {
String name; //姓名
}
正常情況下,name可以賦值:
public class Test {
public static void main(String[] args) {
//類->對象 格式:類名Student 對象名stu = new 類名Student();
Student stu=new Student();
System.out.println(stu); //test.Student@4eec7777
stu.name="張三";
System.out.println(stu.name); //張三
}
}
打印出來就是“張三”:

??那么new Student()可以給name賦值嗎?
是可以的。
它是一個匿名對象,雖然沒有名字,但是它可以給屬性賦值的。如下:
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
}
}
輸出:

“匿名對象”只不過是一個沒有名字的對象而已,依然是一個對象。
若是方法依然可以調(diào)用的,比如現(xiàn)在寫一個方法eat,如下:
public class Student {
String name; //姓名
public void eat(){
System.out.println("使勁吃...");
}
}
測試類里面:
public class Test {
public static void main(String[] args) {
//類->對象 格式:類名Student 對象名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了一個類名,但是沒有給對象名的,叫做“匿名對象”。
區(qū)別就是,有名的對象它可以多次使用,而匿名對象卻只能使用一次。
二、匿名內(nèi)部類
提供一個接口IA,里面寫一個抽象方法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)這個接口。
接下來寫一個實(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("打游戲...");
}
}
然后再來一個測試類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(); ,接口不能傳對象,口訣:多態(tài)–“父父new子”。
實(shí)現(xiàn)類可以看成繼承關(guān)系。
現(xiàn)在來使用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í)現(xiàn)類里面的。
現(xiàn)在我們來看一下這個藍(lán)色部分,這個括號里面只有一個方法的重寫:

之前說接口不能new,我們來看一下這樣:

??看一下剛才的兩個藍(lán)色部分,有什么區(qū)別?

沒有區(qū)別!只不過右邊多了一個最后的分號。
既然花括號里面的內(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)用的是花括號里面重寫IA接口的方法。
我們new了一個接口之后,后面的大括號里面可以看作一個類的結(jié)構(gòu)。如下:

在花括號里面是對方法的重寫,重寫的是IA接口的抽象方法。
現(xiàn)在寫一個IB接口:
public interface IB {
//抽象方法
void sleep();
}
再寫一個測試類IBTest:
public class IBTest {
public static void main(String[] args) {
}
}
目前IB接口沒有實(shí)現(xiàn)類,還可以創(chuàng)建對象嗎?
可以的,如下:
public class IBTest {
public static void main(String[] args) {
IB ib=new IB() {
@Override
public void sleep() {
}
};
}
}
這個結(jié)構(gòu)和它的實(shí)現(xiàn)類結(jié)構(gòu)是一樣的(藍(lán)色部分):

現(xiàn)在就不需要接口的實(shí)現(xiàn)類了,上面藍(lán)色部分就是它的匿名實(shí)現(xiàn)類。
通過ib.sleep()來調(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)拿了過來,重寫了一下。
??還有一種寫法。
剛才說了匿名對象,可以直接拿匿名對象去調(diào)用方法。
同樣,我們還可以使用匿名內(nèi)部類直接調(diào)用方法。
這個叫做創(chuàng)建“匿名實(shí)現(xiàn)類的有名對象”,如下結(jié)構(gòu):
IB ib = new IB(){
//sleep()方法的重寫
};
ib.sleep(); //用ib調(diào)用方法sleep()
現(xiàn)在我們直接new一個接口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 匿名對象與匿名內(nèi)部類的使用的文章就介紹到這了,更多相關(guān)Java 匿名對象與匿名內(nèi)部類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
jeefast和Mybatis實(shí)現(xiàn)三級聯(lián)動的示例代碼
這篇文章主要介紹了jeefast和Mybatis實(shí)現(xiàn)三級聯(lián)動的示例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
javaWeb用戶權(quán)限控制簡單實(shí)現(xiàn)過程
這篇文章主要為大家詳細(xì)介紹了javaWeb用戶權(quán)限控制簡單實(shí)現(xiàn)過程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-08-08
Eclipse可視化插件WindowBuilder的安裝方法
這篇文章主要介紹了Eclipse可視化插件WindowBuilder的安裝方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
MyBatis動態(tài)<if>標(biāo)簽使用避坑指南
這篇文章主要為大家介紹了MyBatis動態(tài)<if>標(biāo)簽使用避坑指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
SpringBoot接收接口入?yún)⒌姆绞叫〗Y(jié)
這篇文章主要給大家介紹了SpringBoot接收接口入?yún)⒌膸追N方式,我們從調(diào)用方的視角去看待這個問題,對調(diào)用方來說,它在調(diào)用接口時有好幾種傳參方式,下面,將會依次對這幾種參數(shù)方式進(jìn)行講解和代碼示例,需要的朋友可以參考下2024-01-01
關(guān)于MyBatis的foreach標(biāo)簽常用方法
這篇文章主要介紹了關(guān)于MyBatis的foreach標(biāo)簽常用方法,foreach 標(biāo)簽可以用來遍歷數(shù)組、列表和 Map 等集合參數(shù),實(shí)現(xiàn)批量操作或一些簡單 SQL 操作,需要的朋友可以參考下2023-05-05

