欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 匿名對(duì)象與匿名內(nèi)部類的使用

 更新時(shí)間:2024年01月31日 15:25:09   作者:雨翼輕塵  
很多小伙伴對(duì)匿名對(duì)象和匿名內(nèi)部類的寫法有點(diǎn)陌生,本文主要介紹了Java 匿名對(duì)象與匿名內(nèi)部類的使用,具有一定的參考價(jià)值,感興趣的可以了解一下

很多小伙伴對(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)就是地址值

image.png

如果這樣,也是地址值

image.png

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)就是“張三”:

image.png

??那么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
    }
}

輸出:

image.png

匿名對(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é)果:

image.png

像這樣直接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)行看右
    }
}

輸出:

image.png

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è)方法的重寫:

image.png

之前說接口不能new,我們來(lái)看一下這樣:

image.png

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

image.png

沒有區(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();
    }
}

打印輸出:

image.png

可以看到,調(diào)用的是花括號(hào)里面重寫IA接口的方法。

我們new了一個(gè)接口之后,后面的大括號(hào)里面可以看作一個(gè)類的結(jié)構(gòu)。如下:

image.png

在花括號(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)色部分):

image.png

現(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();
    }
}

輸出:

image.png

這就是匿名內(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();
    }
}

??輸出

image.png

這里的ib就表示:

image.png

那就可以直接拿它調(diào)用sleep()方法:

image.png

??看一下正常的一般寫法:

image.png

再看一下這兩種方式:

image.png

到此這篇關(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ò)誤信息定制操作

    這篇文章主要介紹了Springboot錯(cuò)誤頁(yè)面和錯(cuò)誤信息定制操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • jeefast和Mybatis實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)的示例代碼

    jeefast和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-10
  • javaWeb用戶權(quán)限控制簡(jiǎn)單實(shí)現(xiàn)過程

    javaWeb用戶權(quán)限控制簡(jiǎn)單實(shí)現(xiàn)過程

    這篇文章主要為大家詳細(xì)介紹了javaWeb用戶權(quán)限控制簡(jiǎn)單實(shí)現(xiàn)過程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Java中高效的判斷數(shù)組中某個(gè)元素是否存在詳解

    Java中高效的判斷數(shù)組中某個(gè)元素是否存在詳解

    相信大家在操作Java的時(shí)候,經(jīng)常會(huì)要檢查一個(gè)數(shù)組(無(wú)序)是否包含一個(gè)特定的值?這是一個(gè)在Java中經(jīng)常用到的并且非常有用的操作。同時(shí),這個(gè)問題在Stack Overflow中也是一個(gè)非常熱門的問題。本文將分析幾種常見用法及其時(shí)間成本,有需要的朋友們可以參考借鑒。
    2016-11-11
  • Eclipse可視化插件WindowBuilder的安裝方法

    Eclipse可視化插件WindowBuilder的安裝方法

    這篇文章主要介紹了Eclipse可視化插件WindowBuilder的安裝方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • MyBatis動(dòng)態(tài)<if>標(biāo)簽使用避坑指南

    MyBatis動(dòng)態(tài)<if>標(biāo)簽使用避坑指南

    這篇文章主要為大家介紹了MyBatis動(dòng)態(tài)<if>標(biāo)簽使用避坑指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • java 后臺(tái)將base64字符串保存為圖片的方法

    java 后臺(tái)將base64字符串保存為圖片的方法

    本篇文章主要介紹了java 后臺(tái)將base64字符串保存為圖片的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-09-09
  • SpringBoot接收接口入?yún)⒌姆绞叫〗Y(jié)

    SpringBoot接收接口入?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-01
  • Java將byte[]轉(zhuǎn)圖片存儲(chǔ)到本地的案例

    Java將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)簽常用方法

    這篇文章主要介紹了關(guān)于MyBatis的foreach標(biāo)簽常用方法,foreach 標(biāo)簽可以用來(lái)遍歷數(shù)組、列表和 Map 等集合參數(shù),實(shí)現(xiàn)批量操作或一些簡(jiǎn)單 SQL 操作,需要的朋友可以參考下
    2023-05-05

最新評(píng)論