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

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

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

static定義內(nèi)部類

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

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

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

如果說現(xiàn)在內(nèi)部類上使用了static定義,那么這個(gè)內(nèi)部類就變成了“外部類”,static定義的都是獨(dú)立于類的結(jié)構(gòu),所以該類結(jié)構(gòu)就相當(dāng)于是一個(gè)獨(dú)立的程序類了。需要注意,static定義的不管是類還是方法只能夠訪問static成員, 所以static定義的內(nèi)部類只能夠訪問外部內(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類是一個(gè)獨(dú)立類 ,如果此時(shí)要想實(shí)例化Inner類對(duì)象,只需要根據(jù)“ 外部類.內(nèi)部類 ”的結(jié)構(gòu)實(shí)例化對(duì)象即可

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

這個(gè)時(shí)候類名稱帶有“.”

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

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

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

所以以后如果發(fā)現(xiàn)類名稱上提供有“.”,首先應(yīng)該立刻想到這是一個(gè)內(nèi)部類的結(jié)構(gòu),如果可以直接進(jìn)行實(shí)例化,則應(yīng)該立刻認(rèn)識(shí)到這是一個(gè)static定義的內(nèi)部類,但是static定義內(nè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("消息通道無法建立");
        }
    };   
}
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)部類

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

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

輸出:haha 和 2390239023

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

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

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

匿名類是一種簡化的內(nè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("哈哈");
 
    }
}

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

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)部類
                System.out.println(str);
            }
        };
        msg.send("哈哈");
    }
}

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

在接口中直接定義匿名內(nè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)部類相比匿名內(nèi)部類只是一個(gè)沒有名字的只能夠使用一次的,并且結(jié)構(gòu)固定的一個(gè)子類。

4.總結(jié):

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

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

    關(guān)注

    33

    文章

    8605

    瀏覽量

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

    關(guān)注

    117

    文章

    3787

    瀏覽量

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

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68628
  • static
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    10372
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    LL庫中常見關(guān)鍵字__STATIC_INLINE

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

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

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

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

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

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

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