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

完善資料讓更多小伙伴認(rèn)識你,還能領(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定義,那么這個內(nèi)部類就變成了“外部類”,static定義的都是獨立于類的結(jié)構(gòu),所以該類結(jié)構(gòu)就相當(dāng)于是一個獨立的程序類了。需要注意,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);
        }
    }
}

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

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

這個時候類名稱帶有“.”

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

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

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

所以以后如果發(fā)現(xiàn)類名稱上提供有“.”,首先應(yīng)該立刻想到這是一個內(nèi)部類的結(jié)構(gòu),如果可以直接進行實例化,則應(yīng)該立刻認(rèn)識到這是一個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)部接口,主要是因為這些操作時屬于一組相關(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();    //方法中直接實例化內(nèi)部類對象
    }
}
public class Test {
    public static void main(String[] args) {
        new Outer().fun(2390239023L);
    }
}

輸出:haha 和 2390239023

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

之所以取消這樣的限制是為了擴展函數(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子類只使用唯一的一次,那么是否還有必要將其定義為單獨的類?那么在這樣的要求下就發(fā)現(xiàn)這個時候定義的子類是有些多余了,所以就可以利用內(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)部類不一定要在抽象類或接口上,但只有在抽象類和接口上才有意義。有些時候為了更加方的體現(xiàn)出匿名內(nèi)部類的使用,往往可以利用靜態(tài)方法做一個內(nèi)部類的匿名內(nèi)部類實現(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)部類只是一個沒有名字的只能夠使用一次的,并且結(jié)構(gòu)固定的一個子類。

4.總結(jié):

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

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

    關(guān)注

    33

    文章

    8447

    瀏覽量

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

    關(guān)注

    116

    文章

    3756

    瀏覽量

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

    關(guān)注

    30

    文章

    4722

    瀏覽量

    68234
  • static
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    10350
收藏 人收藏

    評論

    相關(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ǔ)

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

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

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

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

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

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

    一。內(nèi)部類基礎(chǔ) 二。深入理解內(nèi)部類 三。內(nèi)部類的使用場景和好處 四。常見的與內(nèi)部類相關(guān)的筆試面試題 若有不正之處,請多諒解并歡迎批評指正。 一。內(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變量來實現(xiàn)一個模塊的封裝

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

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

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

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

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

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

    當(dāng)我們在使用java寫類的屬性時總會用到很多的類型去修飾它,比如字符串String,整數(shù)型int,但是我們偶爾也會遇到 static、final、static final,那么他們的區(qū)別是什么呢?
    的頭像 發(fā)表于 02-14 14:55 ?1164次閱讀
    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)部類會持有外部類,如果有地方引用了這個非靜態(tài)內(nèi)部類,會導(dǎo)致外部類也被引用,垃圾回收時無法回收這個外部類(即使外
    的頭像 發(fā)表于 05-18 16:09 ?1090次閱讀
    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 ?1350次閱讀
    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)建外部類的實例調(diào)用外部類
    的頭像 發(fā)表于 10-10 16:26 ?396次閱讀

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

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

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

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