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

全面探究 Java 內部類

 更新時間:2021年09月20日 10:20:51   作者:春風~十一載  
說起內部類這個詞,想必很多人都不陌生,但是又會覺得不熟悉。原因是平時編寫代碼時可能用到的場景不多,用得最多的是在有事件監(jiān)聽的情況下,并且即使用到也很少去總結內部類的用法。今天我們就來一探究竟

內部類(inner class)是定義在另一個類中的類。為什么要使用內部類呢?主要有兩個原因:1.內部類可以對同一個包中的其他類隱藏。2.內部類方法可以訪問定義這個類的作用域中的數據,包括原本私有的數據。
下面,我就來帶領大家去學習Java中比較常見的幾種內部類,希望對大家有一定的收獲!

一. 實例內部類

1. 定義

什么是實例內部類呢?顧名思義,就是在一個普通類的內部再定義一個類,即為實例內部類。
如:

class OuterClass{
    public int data1=1;
    public static int data2=2;
    class InnerClass{
        public int data3=3;
    }
}

但是應該注意實例內部類里不能有static修飾的靜態(tài)成員變量,我們可以把實例內部類當做類中的一個實例成員,那么當我們調用它的時候,可以認為調用的過程是依賴于對象的,但是static又不依賴于對象,因此我們可以推出不能有static修飾的字段。如果非要使用靜態(tài)的,那么必須再加上final,即用static final來修飾,因為用final修飾后的值是無法更改的,可以把它當做是一個常量,即在編譯期間可以確定它的值,這樣就不會報錯了

2. 如何獲取實例內部類這個對象的引用

在創(chuàng)建好一個內部類后,我們該如何訪問內部類里的成員屬性呢?一般通過new 兩次對象來獲?。?/p>

OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();

當然我們也可以通過匿名對象的方法直接獲取:

 OuterClass.InnerClass innerClass2 = new OuterClass().new InnerClass();

此處的語法還是比較繞的如果實在理解不了的話直接記住就行~

3. 注意事項

當實例內部類中與外部類有同名的成員變量時,通過實例內部類去訪問這個成員變量會訪問實例內部類自己的,例如:

class OuterClass{
    public int data1=1;
    public static int data2=2;
    class InnerClass{
        public int data1=10;
    }
}
public class TestDemo {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        System.out.println(innerClass.data1);
    }
}

運行結果為:

在這里插入圖片描述

那么我們如何通過實例內部類的引用去訪問外部類中的data1呢?方法如下:

class OuterClass{
    public int data1=1;
    public static int data2=2;
    class InnerClass{
        public int data1=10;
        public void func(){
            System.out.println(data1);
            System.out.println(this.data1);//this為自己的對象的引用
            System.out.println(OuterClass.this.data1);//this為外部類對象的引用
        }
    }
}
public class TestDemo {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.func();
    }
}

打印結果為:

在這里插入圖片描述

二. 靜態(tài)內部類

1. 定義

和實例內部類一樣,我們也可以把靜態(tài)內部類當做外部類的一個成員屬性,只不過是靜態(tài)的
代碼演示如下:

class OuterClass{
    public int data1=1;
    public static int data2=2;
    static class InnerClass{
        public int data1=10;
        public static int data2=20;
        public void func(){
            System.out.println(data1);
            System.out.println(this.data1);
            System.out.println(OuterClass.this.data1);
        }
    }
}

注意,靜態(tài)內部類中可以定義靜態(tài)的成員屬性了

2. 如何獲取靜態(tài)內部類這個對象的引用

和獲取實例內部類對象引用的方法差不多,但稍有變動:OuterClass.InnerClass innerClass=new OuterClass.InnerClass();

3. 注意事項

同樣,我們也有一些需要注意的問題,在靜態(tài)內部類當中,我們不能訪問外部類的非靜態(tài)數據成員。
因為靜態(tài)內部類不依賴于對象,而外部類不是靜態(tài)的,是依賴于對象的,如果非要訪問,我們可以在內部類中構造一個外部類對象的引用out
代碼示例如下:

class OuterClass{
    public int data1=1;
    public static int data2=2;
    static class InnerClass{
        public int data1=10;
        public static int data2=20;
        public OuterClass out;
        public InnerClass(OuterClass o){
            this.out=o;
        }
        public void func(){
            System.out.println(data1);
            System.out.println(this.out.data1);
        }
    }
}
public class TestDemo {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass=new OuterClass.InnerClass(outerClass);
        innerClass.func();
    }

打印結果為:

在這里插入圖片描述

三. 匿名內部類

1. 定義

匿名內部類是一個用法較為簡單的類,寫法示例如下:

class OuterClass{
    public void func(){
        System.out.println("匿名內部類");
    }
}
public class TestDemo{
    public static void main(String[] args) {
        new OuterClass(){
//此處為匿名內部類
        };
    }
}

當然,在匿名內部類中也可以重寫外部類中的方法:

lass OuterClass{
    public void func(){
        System.out.println("匿名內部類");
    }
}
public class TestDemo{
    public static void main(String[] args) {
        new OuterClass(){
            @Override
            public void func() {
                System.out.println("此處為重寫后的func方法");
            }
        };
    }
}

調用重寫后的方法步驟如下:

public static void main(String[] args) {
        new OuterClass(){
            @Override
            public void func() {
                System.out.println("此處為重寫后的func方法");
            }
        }.func();
    }

打印結果:

在這里插入圖片描述

注意,匿名內部類只定義一次且沒有名字

2. 常見用法

 interface A {
        public void func();
    }

    A a = new A(){
        @Override
        public void func() {
            System.out.println("當前是個匿名內部類,實現了A接口,重寫了接口的方法");
        }
    };

上面部分的代碼為匿名內部類,這個內部類實現了A接口并且重寫了A接口中的方法

3. 注意事項

匿名內部類中有一個變量捕獲機制,即匿名內部類中變量的值是無法修改的

public static void main(String[] args) {
        int flag=1;
        new OuterClass(){
            @Override
            public void func() {
                System.out.println("此處為重寫后的func方法");
                System.out.println(flag);
            }
        }.func();
    }

此時我們的程序可以正常運行,打印的結果為1

在這里插入圖片描述

然而,當我們修改flag的值后,程序會報錯:

在這里插入圖片描述

因此,需要牢記匿名內部類中的變量捕獲機制,即無法二次修改變量的值?。?!

好啦,本期有關內部類的分享就到此結束了,大家一起加油鴨!

在這里插入圖片描述

到此這篇關于全面探究 Java 內部類的文章就介紹到這了,更多相關Java 內部類內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解java中&和&&的區(qū)別

    詳解java中&和&&的區(qū)別

    這篇文章主要介紹了java中&和&&的區(qū)別,在java中比較常見的運算符:&&(短路與)、&、||(短路或)、|,需要的朋友可以參考下
    2015-07-07
  • java基本事件處理機制解析

    java基本事件處理機制解析

    這篇文章主要介紹了java基本事件處理機制解析,?Java事件處理機制是一種用于處理用戶交互和系統(tǒng)事件的編程模型,它基于事件驅動的思想,通過監(jiān)聽和響應事件來實現程序的交互性和動態(tài)性,需要的朋友可以參考下
    2023-10-10
  • Java序列化機制與原理的深入分析

    Java序列化機制與原理的深入分析

    有關Java對象的序列化和反序列化也算是Java基礎的一部分,下面對Java序列化的機制和原理進行一些介紹
    2013-05-05
  • Spring基于注解管理bean實現方式講解

    Spring基于注解管理bean實現方式講解

    很多時候我們需要根據不同的條件在容器中加載不同的Bean,或者根據不同的條件來選擇是否在容器中加載某個Bean,這就是Bean的加載控制,一般我們可以通過編程式或注解式兩種不同的方式來完成Bean的管理
    2023-01-01
  • Java 調用天氣Webservice詳解及實例代碼

    Java 調用天氣Webservice詳解及實例代碼

    這篇文章主要介紹了Java 調用天氣Webservice詳解及實例代碼的相關資料,這里附實例代碼,使用java 調用webservice 的小應用,需要的朋友可以參考下
    2016-11-11
  • 關于HashMap的put方法執(zhí)行全過程

    關于HashMap的put方法執(zhí)行全過程

    這篇文章主要介紹了關于HashMap的put方法執(zhí)行全過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 解析Java實現設計模式六大原則之里氏替換原則

    解析Java實現設計模式六大原則之里氏替換原則

    里氏替換原則是用來幫助我們在繼承關系中進行父子類的設計。它闡述了有關繼承的一些原則,也就是什么時候應該使用繼承,什么時候不應該使用繼承,以及其中蘊含的原理。它是繼承復用的基礎,反映了基類與子類之間的關系,是對開閉原則的補充,對實現抽象化具體步驟的規(guī)范
    2021-06-06
  • Java開發(fā)工具IntelliJ IDEA安裝圖解

    Java開發(fā)工具IntelliJ IDEA安裝圖解

    這篇文章主要介紹了Java開發(fā)工具IntelliJ IDEA安裝圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot整合WebSocket實現后端向前端發(fā)送消息的實例代碼

    SpringBoot整合WebSocket實現后端向前端發(fā)送消息的實例代碼

    WebSocket使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據,下面這篇文章主要給大家介紹了關于SpringBoot整合WebSocket實現后端向前端發(fā)送消息的相關資料,需要的朋友可以參考下
    2023-03-03
  • Struts2的配置文件方法小結

    Struts2的配置文件方法小結

    最近正在學習Struts2,在配置文件中遇到好多標簽,各種意義不同。下面這篇文章就來給大家介紹關于Struts2配置文件的相關資料,文中通過圖文介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-04-04

最新評論

嘉义市| 巴林左旗| 乌苏市| 长兴县| 麦盖提县| 汉寿县| 建平县| 新巴尔虎右旗| 紫云| 永宁县| 建湖县| 丹东市| 碌曲县| 运城市| 仪陇县| 疏附县| 集安市| 凤阳县| 高陵县| 拉孜县| 霍城县| 巫山县| 晴隆县| 思南县| 左权县| 建始县| 分宜县| 翼城县| 河东区| 阳朔县| 西华县| 永定县| 芮城县| 青田县| 轮台县| 福建省| 台东县| 玉山县| 米易县| 海原县| 海伦市|