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

全面探究 Java 內(nèi)部類(lèi)

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

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

一. 實(shí)例內(nèi)部類(lèi)

1. 定義

什么是實(shí)例內(nèi)部類(lèi)呢?顧名思義,就是在一個(gè)普通類(lèi)的內(nèi)部再定義一個(gè)類(lèi),即為實(shí)例內(nèi)部類(lèi)。
如:

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

但是應(yīng)該注意實(shí)例內(nèi)部類(lèi)里不能有static修飾的靜態(tài)成員變量,我們可以把實(shí)例內(nèi)部類(lèi)當(dāng)做類(lèi)中的一個(gè)實(shí)例成員,那么當(dāng)我們調(diào)用它的時(shí)候,可以認(rèn)為調(diào)用的過(guò)程是依賴(lài)于對(duì)象的,但是static又不依賴(lài)于對(duì)象,因此我們可以推出不能有static修飾的字段。如果非要使用靜態(tài)的,那么必須再加上final,即用static final來(lái)修飾,因?yàn)橛胒inal修飾后的值是無(wú)法更改的,可以把它當(dāng)做是一個(gè)常量,即在編譯期間可以確定它的值,這樣就不會(huì)報(bào)錯(cuò)了

2. 如何獲取實(shí)例內(nèi)部類(lèi)這個(gè)對(duì)象的引用

在創(chuàng)建好一個(gè)內(nèi)部類(lèi)后,我們?cè)撊绾卧L問(wèn)內(nèi)部類(lèi)里的成員屬性呢?一般通過(guò)new 兩次對(duì)象來(lái)獲?。?/p>

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

當(dāng)然我們也可以通過(guò)匿名對(duì)象的方法直接獲?。?/p>

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

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

3. 注意事項(xiàng)

當(dāng)實(shí)例內(nèi)部類(lèi)中與外部類(lèi)有同名的成員變量時(shí),通過(guò)實(shí)例內(nèi)部類(lèi)去訪問(wèn)這個(gè)成員變量會(huì)訪問(wèn)實(shí)例內(nèi)部類(lèi)自己的,例如:

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

運(yùn)行結(jié)果為:

在這里插入圖片描述

那么我們?nèi)绾瓮ㄟ^(guò)實(shí)例內(nèi)部類(lèi)的引用去訪問(wèn)外部類(lèi)中的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為自己的對(duì)象的引用
            System.out.println(OuterClass.this.data1);//this為外部類(lèi)對(duì)象的引用
        }
    }
}
public class TestDemo {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.func();
    }
}

打印結(jié)果為:

在這里插入圖片描述

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

1. 定義

和實(shí)例內(nèi)部類(lèi)一樣,我們也可以把靜態(tài)內(nèi)部類(lèi)當(dāng)做外部類(lèi)的一個(gè)成員屬性,只不過(guò)是靜態(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)內(nèi)部類(lèi)中可以定義靜態(tài)的成員屬性了

2. 如何獲取靜態(tài)內(nèi)部類(lèi)這個(gè)對(duì)象的引用

和獲取實(shí)例內(nèi)部類(lèi)對(duì)象引用的方法差不多,但稍有變動(dòng):OuterClass.InnerClass innerClass=new OuterClass.InnerClass();

3. 注意事項(xiàng)

同樣,我們也有一些需要注意的問(wèn)題,在靜態(tài)內(nèi)部類(lèi)當(dāng)中,我們不能訪問(wèn)外部類(lèi)的非靜態(tài)數(shù)據(jù)成員。
因?yàn)殪o態(tài)內(nèi)部類(lèi)不依賴(lài)于對(duì)象,而外部類(lèi)不是靜態(tài)的,是依賴(lài)于對(duì)象的,如果非要訪問(wèn),我們可以在內(nèi)部類(lèi)中構(gòu)造一個(gè)外部類(lèi)對(duì)象的引用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();
    }

打印結(jié)果為:

在這里插入圖片描述

三. 匿名內(nèi)部類(lèi)

1. 定義

匿名內(nèi)部類(lèi)是一個(gè)用法較為簡(jiǎn)單的類(lèi),寫(xiě)法示例如下:

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

當(dāng)然,在匿名內(nèi)部類(lèi)中也可以重寫(xiě)外部類(lèi)中的方法:

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

調(diào)用重寫(xiě)后的方法步驟如下:

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

打印結(jié)果:

在這里插入圖片描述

注意,匿名內(nèi)部類(lèi)只定義一次且沒(méi)有名字

2. 常見(jiàn)用法

 interface A {
        public void func();
    }

    A a = new A(){
        @Override
        public void func() {
            System.out.println("當(dāng)前是個(gè)匿名內(nèi)部類(lèi),實(shí)現(xiàn)了A接口,重寫(xiě)了接口的方法");
        }
    };

上面部分的代碼為匿名內(nèi)部類(lèi),這個(gè)內(nèi)部類(lèi)實(shí)現(xiàn)了A接口并且重寫(xiě)了A接口中的方法

3. 注意事項(xiàng)

匿名內(nèi)部類(lèi)中有一個(gè)變量捕獲機(jī)制,即匿名內(nèi)部類(lèi)中變量的值是無(wú)法修改的

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

此時(shí)我們的程序可以正常運(yùn)行,打印的結(jié)果為1

在這里插入圖片描述

然而,當(dāng)我們修改flag的值后,程序會(huì)報(bào)錯(cuò):

在這里插入圖片描述

因此,需要牢記匿名內(nèi)部類(lèi)中的變量捕獲機(jī)制,即無(wú)法二次修改變量的值?。?!

好啦,本期有關(guān)內(nèi)部類(lèi)的分享就到此結(jié)束了,大家一起加油鴨!

在這里插入圖片描述

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

相關(guān)文章

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

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

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

    java基本事件處理機(jī)制解析

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

    Java序列化機(jī)制與原理的深入分析

    有關(guān)Java對(duì)象的序列化和反序列化也算是Java基礎(chǔ)的一部分,下面對(duì)Java序列化的機(jī)制和原理進(jìn)行一些介紹
    2013-05-05
  • Spring基于注解管理bean實(shí)現(xiàn)方式講解

    Spring基于注解管理bean實(shí)現(xiàn)方式講解

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

    Java 調(diào)用天氣Webservice詳解及實(shí)例代碼

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

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

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

    解析Java實(shí)現(xiàn)設(shè)計(jì)模式六大原則之里氏替換原則

    里氏替換原則是用來(lái)幫助我們?cè)诶^承關(guān)系中進(jìn)行父子類(lèi)的設(shè)計(jì)。它闡述了有關(guān)繼承的一些原則,也就是什么時(shí)候應(yīng)該使用繼承,什么時(shí)候不應(yīng)該使用繼承,以及其中蘊(yùn)含的原理。它是繼承復(fù)用的基礎(chǔ),反映了基類(lèi)與子類(lèi)之間的關(guān)系,是對(duì)開(kāi)閉原則的補(bǔ)充,對(duì)實(shí)現(xiàn)抽象化具體步驟的規(guī)范
    2021-06-06
  • Java開(kāi)發(fā)工具IntelliJ IDEA安裝圖解

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

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

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

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

    Struts2的配置文件方法小結(jié)

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

最新評(píng)論

泽州县| 怀来县| 明光市| 奉新县| 涿鹿县| 双城市| 利辛县| 旬阳县| 沁阳市| 拉萨市| 汉川市| 临江市| 凤翔县| 怀化市| 平昌县| 松桃| 溧阳市| 横峰县| 勃利县| 原阳县| 芮城县| 达日县| 阿巴嘎旗| 富源县| 盘山县| 平阳县| 清徐县| 登封市| 科尔| 隆德县| 康乐县| 芦山县| 安乡县| 绥阳县| 武城县| 九龙城区| 温州市| 滦南县| 上蔡县| 安泽县| 综艺|