91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解Java的內部類

發布時間:2021-09-24 15:08:34 來源:億速云 閱讀:79 作者:柒染 欄目:開發技術

今天就跟大家聊聊有關如何理解Java的內部類,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

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

一. 實例內部類

1. 定義

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

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

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

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

在創建好一個內部類后,我們該如何訪問內部類里的成員屬性呢?一般通過new 兩次對象來獲取:

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

運行結果為:

如何理解Java的內部類

那么我們如何通過實例內部類的引用去訪問外部類中的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();
    }
}

打印結果為:

如何理解Java的內部類

二. 靜態內部類

1. 定義

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

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

注意,靜態內部類中可以定義靜態的成員屬性了

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

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

3. 注意事項

同樣,我們也有一些需要注意的問題,在靜態內部類當中,我們不能訪問外部類的非靜態數據成員。
因為靜態內部類不依賴于對象,而外部類不是靜態的,是依賴于對象的,如果非要訪問,我們可以在內部類中構造一個外部類對象的引用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();
    }

打印結果為:

如何理解Java的內部類

三. 匿名內部類

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

打印結果:

如何理解Java的內部類

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

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

如何理解Java的內部類

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

如何理解Java的內部類

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

如何理解Java的內部類

看完上述內容,你們對如何理解Java的內部類有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

和顺县| 大庆市| 西华县| 涟水县| 林州市| 宜昌市| 和龙市| 津市市| 竹山县| 阿坝| 水城县| 泾阳县| 奎屯市| 高要市| 固阳县| 乐陵市| 资阳市| 阿图什市| 沙河市| 滕州市| 巴南区| 杂多县| 龙胜| 容城县| 宽城| 兴文县| 聊城市| 锡林郭勒盟| 霍林郭勒市| 侯马市| 武乡县| 天柱县| 磐安县| 黔南| 衡东县| 建昌县| 元谋县| 炎陵县| 邢台县| 聊城市| 西平县|