0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

static定義內(nèi)部類(lèi)

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-10 16:08 ? 次閱讀

1. static定義內(nèi)部類(lèi)

1.1 static定義內(nèi)部類(lèi)

如果說(shuō)現(xiàn)在內(nèi)部類(lèi)上使用了static定義,那么這個(gè)內(nèi)部類(lèi)就變成了“外部類(lèi)”,static定義的都是獨(dú)立于類(lèi)的結(jié)構(gòu),所以該類(lèi)結(jié)構(gòu)就相當(dāng)于是一個(gè)獨(dú)立的程序類(lèi)了。需要注意,static定義的不管是類(lèi)還是方法只能夠訪(fǎng)問(wèn)static成員, 所以static定義的內(nèi)部類(lèi)只能夠訪(fǎng)問(wèn)外部?jī)?nèi)中的static屬性和方法 ;

public class Outer {
    private static final String MSG = "哈哈";
    static class Inner{
        public void print(){
            System.out.println(Outer.MSG);
        }
    }
}

這個(gè)時(shí)候的Inner類(lèi)是一個(gè)獨(dú)立類(lèi) ,如果此時(shí)要想實(shí)例化Inner類(lèi)對(duì)象,只需要根據(jù)“ 外部類(lèi).內(nèi)部類(lèi) ”的結(jié)構(gòu)實(shí)例化對(duì)象即可

格式如下 外部類(lèi).內(nèi)部類(lèi) 內(nèi)部類(lèi)對(duì)象 = new 外部類(lèi).內(nèi)部類(lèi)() ;

這個(gè)時(shí)候類(lèi)名稱(chēng)帶有“.”

我們現(xiàn)在實(shí)例化static內(nèi)部類(lèi)對(duì)象

public class Test {
    public static void main(String[] args) {
       Outer.Inner in = new Outer.Inner();
       in.print();
    }
}

輸出結(jié)果是“haha”

所以以后如果發(fā)現(xiàn)類(lèi)名稱(chēng)上提供有“.”,首先應(yīng)該立刻想到這是一個(gè)內(nèi)部類(lèi)的結(jié)構(gòu),如果可以直接進(jìn)行實(shí)例化,則應(yīng)該立刻認(rèn)識(shí)到這是一個(gè)static定義的內(nèi)部類(lèi),但是static定義內(nèi)部類(lèi)的形式來(lái)講并不常用, static定義內(nèi)部接口的形式最為常用 。

1.2 static定義內(nèi)部接口

上代碼,注意內(nèi)部接口IMessage和IChannel

public interface IMessageWarp {
    static interface  IMessage{
        public String getContent();
    }
 
    static interface IChannel{
        public boolean connect();  //消息的發(fā)送通道
    }
 
 
    //消息發(fā)送
    public static void send(IMessage msg,IChannel channel){
        if(channel.connect()){
            System.out.println(msg.getContent());
        }else{
            System.out.println("消息通道無(wú)法建立");
        }
    };   
}
public class DefaultMessage implements IMessageWarp.IMessage {
    @Override
    public String getContent() {
        return "哈哈";
    }
}
public class NetChannel implements IMessageWarp.IChannel{
    @Override
    public boolean connect() {
        return true;
    }
}
public class Test {
    public static void main(String[] args) {
        IMessageWarp.send(new DefaultMessage() , new NetChannel());
    }
}

之所以使用static定義的內(nèi)部接口,主要是因?yàn)檫@些操作時(shí)屬于一組相關(guān)的定義,有了外部接口之后可以更加明確的表述出這些接口的主要目的

2.方法中定義內(nèi)部類(lèi)

內(nèi)部類(lèi)可以在任意的結(jié)構(gòu)中定義,這就包括了:類(lèi)中、方法中、代碼塊中。但在方法中定義內(nèi)部類(lèi)的情況比較多。

public class Outer {
    private String msg = "haha";
    public void fun (long time){
        class Inner {    //內(nèi)部類(lèi)
            public void print(){
                System.out.println(Outer.this.msg);
                System.out.println(time);
            }
        }
        new Inner().print();    //方法中直接實(shí)例化內(nèi)部類(lèi)對(duì)象
    }
}
public class Test {
    public static void main(String[] args) {
        new Outer().fun(2390239023L);
    }
}

輸出:haha 和 2390239023

此時(shí)在fun()方法內(nèi)部提供有Inner內(nèi)部類(lèi)的定義,并且發(fā)現(xiàn)內(nèi)部類(lèi)可以直接訪(fǎng)問(wèn)外部類(lèi)中的私有屬性也可以直接訪(fǎng)問(wèn)方法中的參數(shù),但對(duì)于方法中的參數(shù)直接訪(fǎng)問(wèn)時(shí)從JDK1.8開(kāi)始支持的。而在JDK1.8之前**,如果方法中定義的內(nèi)部類(lèi)要想訪(fǎng)問(wèn)方法中的參數(shù)則參數(shù)前必須追加final。**

之所以取消這樣的限制是為了擴(kuò)展函數(shù)式編程準(zhǔn)備的

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

匿名類(lèi)是一種簡(jiǎn)化的內(nèi)部類(lèi)的處理形式,其主要是在抽象類(lèi)和接口的子類(lèi)上使用的。

接口和抽象類(lèi)是一樣的

public interface IMessage {
    public void send(String str);
}
public class MessageImpl implements IMessage {
    @Override
    public void send(String str) {
        System.out.println(str);
    }
}
public class Test {
    public static void main(String[] args) {
        IMessage msg = new MessageImpl();
        msg.send("哈哈");
 
    }
}

如果說(shuō)現(xiàn)在IMessage接口中的MessageImpl子類(lèi)只使用唯一的一次,那么是否還有必要將其定義為單獨(dú)的類(lèi)?那么在這樣的要求下就發(fā)現(xiàn)這個(gè)時(shí)候定義的子類(lèi)是有些多余了,所以就可以利用內(nèi)部類(lèi)的形式來(lái)解決此問(wèn)題

public interface IMessage {
    public void send(String str);
}
public class Test {
    public static void main(String[] args) {
        IMessage msg = new IMessage() {
           @Override
            public void send(String str) {    //匿名內(nèi)部類(lèi)
                System.out.println(str);
            }
        };
        msg.send("哈哈");
    }
}

匿名內(nèi)部類(lèi)不一定要在抽象類(lèi)或接口上,但只有在抽象類(lèi)和接口上才有意義。有些時(shí)候?yàn)榱烁臃降捏w現(xiàn)出匿名內(nèi)部類(lèi)的使用,往往可以利用靜態(tài)方法做一個(gè)內(nèi)部類(lèi)的匿名內(nèi)部類(lèi)實(shí)現(xiàn)

在接口中直接定義匿名內(nèi)部類(lèi)

public interface IMessage {
    public void send(String str);
}
public interface IMessage {
    public void send(String str);
 
    public static IMessage getInstance(){
        return new IMessage() {
            @Override
            public void send(String str) {
                System.out.println(str);
            }
        };
    }
}
public class Test {
    public static void main(String[] args) {
        IMessage.getInstance().send("哈哈");
    }
}

與內(nèi)部類(lèi)相比匿名內(nèi)部類(lèi)只是一個(gè)沒(méi)有名字的只能夠使用一次的,并且結(jié)構(gòu)固定的一個(gè)子類(lèi)。

4.總結(jié):

好了,內(nèi)部類(lèi)的使用就介紹完了,大家可以收藏起來(lái),工作中肯定用得到。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8360

    瀏覽量

    150530
  • 程序
    +關(guān)注

    關(guān)注

    115

    文章

    3747

    瀏覽量

    80667
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4697

    瀏覽量

    68085
  • static
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    10341
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ARM之靜態(tài)變量簡(jiǎn)析

    靜態(tài)變量的值可以一直保持到程序結(jié)束,使用關(guān)鍵字static可以將變量聲明為靜態(tài)的:static int x ;static float y;根據(jù)聲明的位置不同,靜態(tài)變量也可以分為內(nèi)部類(lèi)
    發(fā)表于 04-24 09:27

    接口、內(nèi)部類(lèi)和Java API基礎(chǔ)

    理解接口的作用,理解接口和實(shí)現(xiàn)接口的類(lèi)的關(guān)系,掌握聲明接口、一個(gè)類(lèi)實(shí)現(xiàn)多個(gè)接口的聲明和使用方法。理解內(nèi)嵌類(lèi)型的概念,掌握聲明內(nèi)部類(lèi)的方法。熟悉Java語(yǔ)言包和實(shí)用包中的常用類(lèi)。
    發(fā)表于 11-23 11:52 ?0次下載

    java中static的作用及常見(jiàn)的誤區(qū)

    。在static方法內(nèi)部不能調(diào)用非靜態(tài)方法,反過(guò)來(lái)是可以的。而且可以在沒(méi)有創(chuàng)建任何對(duì)象的前提下,僅僅通過(guò)類(lèi)本身來(lái)調(diào)用static方法。這實(shí)際上正是static方法的主要用途。 這段話(huà)雖
    發(fā)表于 09-27 10:44 ?0次下載
    java中<b class='flag-5'>static</b>的作用及常見(jiàn)的誤區(qū)

    java內(nèi)部類(lèi)分析詳解

    可以將一個(gè)類(lèi)的定義放在另一個(gè)類(lèi)的定義內(nèi)部,這就是內(nèi)部類(lèi)。 內(nèi)部類(lèi)是一個(gè)非常有用的特性但又比較難理解使用的特性(鄙人到現(xiàn)在都沒(méi)有怎么使用過(guò)
    發(fā)表于 09-27 14:59 ?0次下載

    java內(nèi)部類(lèi)怎么寫(xiě)

    一。內(nèi)部類(lèi)基礎(chǔ) 二。深入理解內(nèi)部類(lèi) 三。內(nèi)部類(lèi)的使用場(chǎng)景和好處 四。常見(jiàn)的與內(nèi)部類(lèi)相關(guān)的筆試面試題 若有不正之處,請(qǐng)多諒解并歡迎批評(píng)指正。 一。內(nèi)部
    發(fā)表于 09-27 16:15 ?0次下載
    java<b class='flag-5'>內(nèi)部類(lèi)</b>怎么寫(xiě)

    java中static關(guān)鍵字的作用

    列舉了一些面試筆試中常見(jiàn)的關(guān)于static的考題。 以下是本文的目錄大綱: 一.static關(guān)鍵字的用途 二.static關(guān)鍵字的誤區(qū) 三。常見(jiàn)的筆試面試題 一.static關(guān)鍵字的用
    發(fā)表于 09-27 17:12 ?0次下載

    基于static變量來(lái)實(shí)現(xiàn)一個(gè)模塊的封裝

    static變量的一個(gè)顯著的作用就是可以實(shí)現(xiàn)一個(gè)模塊的封裝。 static存儲(chǔ)類(lèi)別的特性決定了static聲明的全局變量只能被本源文件的函數(shù)引用。當(dāng)在一個(gè)源文件中定義一個(gè)
    的頭像 發(fā)表于 01-05 10:54 ?5486次閱讀
    基于<b class='flag-5'>static</b>變量來(lái)實(shí)現(xiàn)一個(gè)模塊的封裝

    為什么C++單例模式不能直接全部使用static變量和static函數(shù)呢?

    通過(guò)getInstance()函數(shù)獲取單例對(duì)象,這種模式的關(guān)鍵之處不是在于強(qiáng)迫你用函數(shù)來(lái)獲取對(duì)象。關(guān)鍵之處是讓static對(duì)象定義在函數(shù)內(nèi)部,變成局部static變量。看下這種實(shí)現(xiàn)方式
    的頭像 發(fā)表于 06-05 14:14 ?1511次閱讀

    Java內(nèi)部類(lèi)持有外部類(lèi)導(dǎo)致內(nèi)存泄露的原因以及其解決方案

    簡(jiǎn)介 為什么要持有外部類(lèi) 實(shí)例:持有外部類(lèi) 實(shí)例:不持有外部類(lèi) 實(shí)例:內(nèi)存泄露 不會(huì)內(nèi)存泄露的方案 簡(jiǎn)介 「說(shuō)明」 本文介紹 Java 內(nèi)部類(lèi)持有外
    的頭像 發(fā)表于 10-08 16:32 ?931次閱讀

    JAVA中static、final、static final如何區(qū)分

    當(dāng)我們?cè)谑褂胘ava寫(xiě)類(lèi)的屬性時(shí)總會(huì)用到很多的類(lèi)型去修飾它,比如字符串String,整數(shù)型int,但是我們偶爾也會(huì)遇到 static、final、static final,那么他們的區(qū)別是什么呢?
    的頭像 發(fā)表于 02-14 14:55 ?1152次閱讀
    JAVA中<b class='flag-5'>static</b>、final、<b class='flag-5'>static</b> final如何區(qū)分

    Java內(nèi)部類(lèi)使用不當(dāng)導(dǎo)致的內(nèi)存泄露問(wèn)題及解決辦法

    非靜態(tài)內(nèi)部類(lèi)會(huì)持有外部類(lèi),如果有地方引用了這個(gè)非靜態(tài)內(nèi)部類(lèi),會(huì)導(dǎo)致外部類(lèi)也被引用,垃圾回收時(shí)無(wú)法回收這個(gè)外部類(lèi)(即使外
    的頭像 發(fā)表于 05-18 16:09 ?1077次閱讀
    Java<b class='flag-5'>內(nèi)部類(lèi)</b>使用不當(dāng)導(dǎo)致的內(nèi)存泄露問(wèn)題及解決辦法

    LL庫(kù)中常見(jiàn)關(guān)鍵字__STATIC_INLINE

    LL庫(kù)中常見(jiàn)關(guān)鍵字__STATIC_INLINE,其定義見(jiàn)cmsis_gcc.h
    的頭像 發(fā)表于 07-24 11:30 ?1296次閱讀
    LL庫(kù)中常見(jiàn)關(guān)鍵字__<b class='flag-5'>STATIC</b>_INLINE

    如何在普通類(lèi)中使用內(nèi)部結(jié)構(gòu)

    class Test { public static void main ( String [] args ) { Outer outer = new Outer(); outer.fun(); }} 創(chuàng)建外部類(lèi)的實(shí)例調(diào)用外部類(lèi)
    的頭像 發(fā)表于 10-10 16:26 ?379次閱讀

    Java中對(duì)static關(guān)鍵詞的介紹

    static 是Java的一個(gè)關(guān)鍵字,可以用來(lái)修飾成員變量、修飾成員方法、構(gòu)造靜態(tài)代碼塊、實(shí)現(xiàn)靜態(tài)導(dǎo)包以及實(shí)現(xiàn)靜態(tài)內(nèi)部類(lèi),下面我們來(lái)分別介紹。 1、修飾成員變量 用 static 修飾成員變量
    的頭像 發(fā)表于 10-11 15:26 ?421次閱讀
    Java中對(duì)<b class='flag-5'>static</b>關(guān)鍵詞的介紹

    java內(nèi)部類(lèi)可以用public修飾嗎

    Java的內(nèi)部類(lèi)是指一個(gè)類(lèi)被定義在另一個(gè)類(lèi)的內(nèi)部。根據(jù)定義的位置和訪(fǎng)問(wèn)權(quán)限的不同,內(nèi)部類(lèi)可以分為四種:成員
    的頭像 發(fā)表于 11-21 10:23 ?960次閱讀