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

深入了解Java內(nèi)部類的用法

 更新時間:2022年07月18日 10:44:41   作者:世界盡頭與你  
java類的五大成員:屬性,方法,構(gòu)造器(構(gòu)造方法),代碼塊,內(nèi)部類。本文就來和大家詳細講講ava內(nèi)部類的用法,需要的小伙伴可以參考一下

1.內(nèi)部類分類和概念

java類的五大成員:屬性,方法,構(gòu)造器(構(gòu)造方法),代碼塊,內(nèi)部類

內(nèi)部類的分類:

定義在外部類局部的位置(比如方法內(nèi)):

  • 局部內(nèi)部類(有類名)
  • 匿名內(nèi)部類(無類名)

定義在外部類成員位置上:

  • 成員內(nèi)部類(沒有static修飾)
  • 靜態(tài)內(nèi)部類(有static修飾)

概念:在一個類的內(nèi)部再定義一個完整的類,也會生成一個class文件

代碼示例:

/**
 * 內(nèi)部類
 */
public class InnerClass {
    private int n = 521;

    public InnerClass(int n) {
        this.n = n;
    }

    class Inner { // 內(nèi)部類

    }
}

謹(jǐn)記:內(nèi)部類很重要,java底層源碼內(nèi)部類使用場景很多!

2.局部內(nèi)部類

class Outer001 { // 外部類
    private int n = 521;
    private void kaka() {
        System.out.println("我是外部類的方法!");
    }
    public void show() {
        // 局部內(nèi)部類定義在外部類的局部位置,通常在方法中
        class Inner001 {
            // 局部內(nèi)部類
            public void f() {
                // 可以直接訪問外部類的所有成員,包含私有的
                System.out.println(n);
            }
        }
    }
}

不能添加訪問修飾符,但是可以添加final

局部內(nèi)部類的作用域只在定義它的方法或者代碼塊中

外部類使用內(nèi)部類的方法,直接new即可:

public void show() {
    // 局部內(nèi)部類定義在外部類的局部位置,通常在方法中
    final class Inner001 {
        // 局部內(nèi)部類
        public void f() {
            // 可以直接訪問外部類的所有成員,包含私有的
            System.out.println(n);
            kaka();
        }
    }
    // 外部類使用內(nèi)部類的方法
    Inner001 inner001 = new Inner001();
    inner001.f();
}

外部其他類不能訪問局部內(nèi)部類!

外部類和局部內(nèi)部類的成員重名時,默認(rèn)遵循就近原則,如果想要訪問外部類的成員,使用外部類名.this.成員進行訪問

3.匿名內(nèi)部類(重要)

匿名內(nèi)部類其實有名字,它的名字是底層的JDK給分配的~系統(tǒng)分配該類名的時候會在外部類的基礎(chǔ)上加上$1,存在多個內(nèi)部類的,$后面的值進行遞增

基于接口的匿名內(nèi)部類

/**
 * 匿名內(nèi)部類
 */
public class AnonymousInnerClass {
    public static void main(String[] args) {
        Outer002 outer002 = new Outer002();
        outer002.method();
    }
}

class Outer002 {
    private int n = 521;

    public void method() {
        // 基于接口的匿名內(nèi)部類
        // tiger的編譯類型是IA,運行類型就是匿名內(nèi)部類!
        // 系統(tǒng)分配該類名的時候會在外部類的基礎(chǔ)上加上$1,此處是Outer002$1
        // JDK底層在創(chuàng)建了匿名內(nèi)部類之后,立即創(chuàng)建了一個實例,并且把地址返回給tiger
        IA tiger = new IA() {
            @Override
            public void cry() {
                System.out.println("我是一只小老虎??");
            }
        };
        tiger.cry();
        System.out.println(tiger.getClass());
    }
}

interface IA {
    public void cry();
}

輸出:

我是一只小老虎??
class seniorobject.innerclass.Outer002$1

注意:匿名內(nèi)部類使用一次就不能再使用了!

基于類的匿名內(nèi)部類

基于類的匿名內(nèi)部類和基于接口的差不太多

Father類:

class Father {
    private String name;

    public Father(String name) {
        this.name = name;
    }
    public void test() {

    }
}

匿名內(nèi)部類:

// 基于類的匿名內(nèi)部類,加入大括號就搖身一變變成內(nèi)部類了
Father jack = new Father("jack"){
    @Override
    public void test() {
        super.test();
        System.out.println("?(^?^*)");
    }
};
System.out.println(jack.getClass());

輸出:

class seniorobject.innerclass.Outer002$2

一些細節(jié)

匿名內(nèi)部類是類,同時,它也可以理解為是一個對象

匿名內(nèi)部類可以訪問外部類的所有成員,包括私有的

不能添加訪問修飾符

定義域在定義它的方法或者代碼塊中,轉(zhuǎn)瞬即逝!

外部其他類不能訪問匿名內(nèi)部類

外部類和匿名內(nèi)部類成員重名時,參照局部內(nèi)部類的方式即可

匿名內(nèi)部類的最佳實踐

當(dāng)作實參直接傳遞,簡潔高效

/**
 * 匿名內(nèi)部類的最佳實踐
 * 當(dāng)作實參直接傳遞,簡潔高效
 */
public class AnonymousInnerClassPractice {
    public static void main(String[] args) {
        f(new IL() {
            @Override
            public void show() {
                System.out.println("你好啊");
            }
        });
    }

    public static void f(IL il) {
        il.show();
    }
}

interface IL {
    void show();
}

4.成員內(nèi)部類

定義在外部類的成員位置上:

實例:

/**
 * 成員內(nèi)部類
 */
public class MemberInnerClass {
    public static void main(String[] args) {
        Outer003 outer003 = new Outer003();
        outer003.t();
    }
}

class Outer003 {
    private int n = 521;
    public String name = "dahe";

    class Inner003 { // 成員內(nèi)部類
        public void say() {
            System.out.println(n + name);
        }
    }

    public void t() {
        // 使用成員內(nèi)部類
        Inner003 inner003 = new Inner003();
        inner003.say();
    }
}

輸出:

521dahe

可以訪問外部類的所有成員,包括私有的

可以添加任意的訪問修飾符

作用域為整個類體中

外部類想要使用成員內(nèi)部類,創(chuàng)建對象調(diào)用即可!

外部其他類想要訪問成員內(nèi)部類,存在兩種方式:

// 直接創(chuàng)建對象
Outer003.Inner003 inner003 = outer003.new Inner003();
// 注意:這里的outer003是外部類的對象實例
// 成員內(nèi)部類的外部類創(chuàng)建一個返回內(nèi)部類對象的公有方法
public Inner003 getInner003Instance() {
    return new Inner003();
}

// 外部其他類進行調(diào)用該共有方法
Outer003.Inner003 inner0031 = outer003.getInner003Instance();
inner0031.say();

外部類和成員內(nèi)部類的成員重名時,參考局部內(nèi)部類和匿名內(nèi)部類即可

5.靜態(tài)內(nèi)部類

可以直接訪問外部類的靜態(tài)成員

可以添加任意的訪問修飾符

作用域為整個類體

外部類想要訪問靜態(tài)內(nèi)部類依然是創(chuàng)建對象訪問

外部其他類想要訪問靜態(tài)內(nèi)部類:

// 通過類名直接訪問
Outer004.Inner004 inner004 = new Outer004.Inner004();
inner004.say();
// 靜態(tài)內(nèi)部類的外部類創(chuàng)建一個返回內(nèi)部類對象的公有方法
// 返回靜態(tài)內(nèi)部類的對象實例
public Inner004 getInner004() {
    return new Inner004();
}

Outer004.Inner004 inner0041 = outer004.getInner004();
inner0041.say();
// 返回靜態(tài)內(nèi)部類的對象實例,但是是靜態(tài)方法
public static Inner004 getInner004_() {
    return new Inner004();
}

// 靜態(tài)內(nèi)部類的外部類創(chuàng)建一個返回內(nèi)部類對象的公有靜態(tài)方法
Outer004.Inner004 inner0042 = Outer004.getInner004_();
inner0042.say();

整體代碼示例:

/**
 * 靜態(tài)內(nèi)部類
 */
public class StaticInnerClass {
    public static void main(String[] args) {
        Outer004 outer004 = new Outer004();
        // 通過類名直接訪問
        Outer004.Inner004 inner004 = new Outer004.Inner004();
        inner004.say();
        // 靜態(tài)內(nèi)部類的外部類創(chuàng)建一個返回內(nèi)部類對象的公有方法
        Outer004.Inner004 inner0041 = outer004.getInner004();
        inner0041.say();
        // 靜態(tài)內(nèi)部類的外部類創(chuàng)建一個返回內(nèi)部類對象的公有靜態(tài)方法
        Outer004.Inner004 inner0042 = Outer004.getInner004_();
        inner0042.say();
    }
}

class Outer004 {
    private int n = 521;
    private static String name = "dahe";
    public static class Inner004 {
        public void say() {
            // 可以直接訪問外部類的靜態(tài)成員
            System.out.println(name);
        }
    }

    // 返回靜態(tài)內(nèi)部類的對象實例
    public Inner004 getInner004() {
        return new Inner004();
    }

    // 返回靜態(tài)內(nèi)部類的對象實例,但是是靜態(tài)方法
    public static Inner004 getInner004_() {
        return new Inner004();
    }
}

外部類和成員內(nèi)部類的成員重名時,遵循就近原則,如果想要訪問外部類的成員,使用外部類名.成員即可

以上就是深入了解Java內(nèi)部類的用法的詳細內(nèi)容,更多關(guān)于Java內(nèi)部類的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mybatis-plus通用查詢方法封裝的實現(xiàn)

    Mybatis-plus通用查詢方法封裝的實現(xiàn)

    本文主要介紹了Mybatis-plus通用查詢方法封裝的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 詳解SpringBoot?統(tǒng)一后端返回格式的方法

    詳解SpringBoot?統(tǒng)一后端返回格式的方法

    今天我們來聊一聊在基于SpringBoot前后端分離開發(fā)模式下,如何友好的返回統(tǒng)一的標(biāo)準(zhǔn)格式以及如何優(yōu)雅的處理全局異常,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-05-05
  • Java小白第一次就能看懂的網(wǎng)絡(luò)編程

    Java小白第一次就能看懂的網(wǎng)絡(luò)編程

    網(wǎng)絡(luò)編程是指編寫運行在多個設(shè)備(計算機)的程序,這些設(shè)備都通過網(wǎng)絡(luò)連接起來。本文介紹了一些網(wǎng)絡(luò)編程基礎(chǔ)的概念,并用Java來實現(xiàn)TCP和UDP的Socket的編程,來讓讀者更好的了解其原理
    2021-08-08
  • Springboot整合微信支付(訂單過期取消及商戶主動查單)

    Springboot整合微信支付(訂單過期取消及商戶主動查單)

    本文主要介紹了Springboot整合微信支付(訂單過期取消及商戶主動查單),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 關(guān)于maven install報錯原因揭秘:parent.relativePath指向錯誤的本地POM文件

    關(guān)于maven install報錯原因揭秘:parent.relativePath指向錯誤的本地POM文件

    在使用Maven進行項目構(gòu)建時,如果遇到'parent.relativePath'指向錯誤的本地POM文件的問題,可能會導(dǎo)致構(gòu)建失敗,這通常是由于父項目POM文件的相對路徑設(shè)置錯誤、本地POM文件與父項目POM文件版本或內(nèi)容不一致所致,解決方法包括檢查并修正父項目POM文件中的相對路徑設(shè)置
    2024-09-09
  • Spring Data JPA帶條件分頁查詢實現(xiàn)原理

    Spring Data JPA帶條件分頁查詢實現(xiàn)原理

    這篇文章主要介紹了Spring Data JPA帶條件分頁查詢實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • Java編程中的4種代碼塊詳解

    Java編程中的4種代碼塊詳解

    在本篇內(nèi)容里小編個總結(jié)了Java編程中的4種代碼塊相關(guān)的知識點,有興趣的朋友們可以學(xué)習(xí)下。
    2021-06-06
  • RabbitMQ?延遲隊列實現(xiàn)訂單支付結(jié)果異步階梯性通知(實例代碼)

    RabbitMQ?延遲隊列實現(xiàn)訂單支付結(jié)果異步階梯性通知(實例代碼)

    這篇文章主要介紹了RabbitMQ?延遲隊列實現(xiàn)訂單支付結(jié)果異步階梯性通知,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • Java防止文件被篡改之文件校驗功能的實例代碼

    Java防止文件被篡改之文件校驗功能的實例代碼

    這篇文章主要介紹了Java防止文件被篡改之文件校驗功能,本文給大家分享了文件校驗和原理及具體實現(xiàn)思路,需要的朋友可以參考下
    2018-11-11
  • java 增強型for循環(huán)語法詳解

    java 增強型for循環(huán)語法詳解

    增強型 for 循環(huán)(也稱為 “for-each” 循環(huán))是 Java 從 JDK 5 開始引入的一種便捷循環(huán)語法,旨在簡化對數(shù)組或集合類的迭代操作,這篇文章主要介紹了java 增強型for循環(huán) 詳解,需要的朋友可以參考下
    2025-04-04

最新評論

富蕴县| 礼泉县| 石城县| SHOW| 南投县| 通化市| 淄博市| 吐鲁番市| 柘城县| 凌云县| 加查县| 福清市| 荃湾区| 德化县| 延寿县| 莱芜市| 日土县| 丰原市| 枣阳市| 吴江市| 上犹县| 许昌县| 云阳县| 金堂县| 红原县| 天全县| 克拉玛依市| 安溪县| 榕江县| 梁河县| 大足县| 昌宁县| 雷波县| 眉山市| 新建县| 延庆县| 琼海市| 萍乡市| 五常市| 保山市| 新余市|