最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

很多小伙伴對匿名對象和匿名內(nèi)部類的寫法有點陌生,這里專門寫一篇來幫助大家認(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)在打印出來就是地址值

image.png

如果這樣,也是地址值

image.png

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);   //張三

    }
}

打印出來就是“張三”:

image.png

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

輸出:

image.png

匿名對象”只不過是一個沒有名字的對象而已,依然是一個對象。

若是方法依然可以調(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é)果:

image.png

像這樣直接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。

抽象方法要想重寫,需要有子類去實現(xiàn)這個接口

接下來寫一個實現(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子”。

實現(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();	//編譯看左,運行看右
    }
}

輸出:

image.png

ia.play(); “編譯看左,運行看右”,接口IA里面有play方法,它被實現(xiàn)類IAImpl重寫了,所以執(zhí)行的時候是看實現(xiàn)類里面的。

現(xiàn)在我們來看一下這個藍(lán)色部分,這個括號里面只有一個方法的重寫:

image.png

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

image.png

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

image.png

沒有區(qū)別!只不過右邊多了一個最后的分號。

既然花括號里面的內(nèi)容和實現(xiàn)類的一模一樣,那我們可以使用i調(diào)用里面的方法play,如下:

public class IATest {
    public static void main(String[] args) {
        IA ia=new IAImpl(); //多態(tài)
        ia.play();  //編譯看左,運行看右

        System.out.println("------------------");

        IA i=new IA() {
            @Override
            public void play() {
                System.out.println("打游戲哈哈哈...");
            }
        };

        i.play();
    }
}

打印輸出:

image.png

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

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

image.png

在花括號里面是對方法的重寫,重寫的是IA接口的抽象方法。

現(xiàn)在寫一個IB接口

public interface IB {
    //抽象方法
    void sleep();
}

再寫一個測試類IBTest

public class IBTest {
    public static void main(String[] args) {

    }
}

目前IB接口沒有實現(xiàn)類,還可以創(chuàng)建對象嗎?

可以的,如下:

public class IBTest {
    public static void main(String[] args) {
        IB ib=new IB() {
            @Override
            public void sleep() {

            }
        };
    }
}

這個結(jié)構(gòu)和它的實現(xiàn)類結(jié)構(gòu)是一樣的(藍(lán)色部分):

image.png

現(xiàn)在就不需要接口的實現(xiàn)類了,上面藍(lán)色部分就是它的匿名實現(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();
    }
}

輸出:

image.png

這就是匿名內(nèi)部類,new的接口,相當(dāng)于是把實現(xiàn)類的結(jié)構(gòu)拿了過來,重寫了一下。

??還有一種寫法。

剛才說了匿名對象,可以直接拿匿名對象去調(diào)用方法。

同樣,我們還可以使用匿名內(nèi)部類直接調(diào)用方法

這個叫做創(chuàng)建“匿名實現(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();
    }
}

??輸出

image.png

這里的ib就表示:

image.png

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

image.png

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

image.png

再看一下這兩種方式:

image.png

到此這篇關(guān)于Java 匿名對象與匿名內(nèi)部類的使用的文章就介紹到這了,更多相關(guān)Java 匿名對象與匿名內(nèi)部類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

您可能感興趣的文章:

相關(guān)文章

  • java時間日期使用與查詢代碼詳解

    java時間日期使用與查詢代碼詳解

    這篇文章主要介紹了java時間日期使用與查詢代碼詳解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-11-11
  • java設(shè)計模式之中介者模式

    java設(shè)計模式之中介者模式

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計模式之中介者模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • IntelliJ Idea常用11款插件(提高開發(fā)效率)

    IntelliJ Idea常用11款插件(提高開發(fā)效率)

    這篇文章主要介紹了IntelliJ Idea常用11款插件(提高開發(fā)效率),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • SpringBoot+Mybatis-Plus實現(xiàn)mysql讀寫分離方案的示例代碼

    SpringBoot+Mybatis-Plus實現(xiàn)mysql讀寫分離方案的示例代碼

    這篇文章主要介紹了SpringBoot+Mybatis-Plus實現(xiàn)mysql讀寫分離方案的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java字符串駝峰與下?lián)Q線格式轉(zhuǎn)換如何實現(xiàn)

    Java字符串駝峰與下?lián)Q線格式轉(zhuǎn)換如何實現(xiàn)

    這篇文章主要介紹了Java字符串駝峰與下?lián)Q線格式轉(zhuǎn)換如何實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • MyBatis輕松獲取自增長主鍵的幾種方法小結(jié)

    MyBatis輕松獲取自增長主鍵的幾種方法小結(jié)

    在日常開發(fā)中,獲取自增長主鍵是一個非常常見的需求,尤其是在使用MyBatis進(jìn)行數(shù)據(jù)庫操作時,然而,很多人在初次接觸這個功能時會感到困惑,不知道該如何下手,別擔(dān)心,本文將詳細(xì)介紹MyBatis獲取自增長主鍵的幾種方法,需要的朋友可以參考下
    2025-06-06
  • Java判斷當(dāng)前日期是周幾的方法匯總

    Java判斷當(dāng)前日期是周幾的方法匯總

    在Java編程中,我們經(jīng)常會遇到需要獲取當(dāng)前日期是周幾的需求。根據(jù)國際慣例,一周通常是從周一開始,到周日結(jié)束,記作1至7,本文將介紹幾種常用的Java方法,讓你能夠準(zhǔn)確地判斷當(dāng)前日期是周幾,感興趣的朋友一起看看吧
    2024-03-03
  • springmvc Controller方法沒有加@ResponseBody導(dǎo)致api訪問404問題

    springmvc Controller方法沒有加@ResponseBody導(dǎo)致api訪問404問題

    這篇文章主要介紹了springmvc Controller方法沒有加@ResponseBody導(dǎo)致api訪問404問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • SpringBoot實現(xiàn)前后端分離國際化的示例詳解

    SpringBoot實現(xiàn)前后端分離國際化的示例詳解

    Springboot國際化可以幫助使用者在不同語言環(huán)境中構(gòu)建應(yīng)用程序,這樣應(yīng)用程序可以有效地適應(yīng)不同語言文化背景下的用戶需求。本文主要介紹了SpringBoot實現(xiàn)前后端分離國際化的方法,需要的可以參考一下
    2023-02-02
  • 詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階)

    詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階)

    本篇文章主要介紹了詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11

最新評論

张家港市| 卫辉市| 万盛区| 大庆市| 抚远县| 固原市| 新竹市| 顺昌县| 山丹县| 泰兴市| 五大连池市| 探索| 成安县| 聂荣县| 浙江省| 江永县| 黎城县| 外汇| 德庆县| 青海省| 宽甸| 科技| 香格里拉县| 新干县| 西乌珠穆沁旗| 正蓝旗| 永宁县| 彰武县| 吕梁市| 榆社县| 泸州市| 清远市| 武陟县| 鹿邑县| 襄樊市| 南康市| 玉龙| 望谟县| 湘阴县| 盖州市| 绥宁县|