精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

static定義內部類

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

1. static定義內部類

1.1 static定義內部類

如果說現在內部類上使用了static定義,那么這個內部類就變成了“外部類”,static定義的都是獨立于類的結構,所以該類結構就相當于是一個獨立的程序類了。需要注意,static定義的不管是類還是方法只能夠訪問static成員, 所以static定義的內部類只能夠訪問外部內中的static屬性和方法

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

這個時候的Inner類是一個獨立類 ,如果此時要想實例化Inner類對象,只需要根據“ 外部類.內部類 ”的結構實例化對象即可

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

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

我們現在實例化static內部類對象

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

輸出結果是“haha”

所以以后如果發現類名稱上提供有“.”,首先應該立刻想到這是一個內部類的結構,如果可以直接進行實例化,則應該立刻認識到這是一個static定義的內部類,但是static定義內部類的形式來講并不常用, static定義內部接口的形式最為常用

1.2 static定義內部接口

上代碼,注意內部接口IMessage和IChannel

public interface IMessageWarp {
    static interface  IMessage{
        public String getContent();
    }
 
    static interface IChannel{
        public boolean connect();  //消息的發送通道
    }
 
 
    //消息發送
    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定義的內部接口,主要是因為這些操作時屬于一組相關的定義,有了外部接口之后可以更加明確的表述出這些接口的主要目的

2.方法中定義內部類

內部類可以在任意的結構中定義,這就包括了:類中、方法中、代碼塊中。但在方法中定義內部類的情況比較多。

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

輸出:haha 和 2390239023

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

之所以取消這樣的限制是為了擴展函數式編程準備的

3.匿名內部類

匿名類是一種簡化的內部類的處理形式,其主要是在抽象類和接口的子類上使用的。

接口和抽象類是一樣的

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

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

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

匿名內部類不一定要在抽象類或接口上,但只有在抽象類和接口上才有意義。有些時候為了更加方的體現出匿名內部類的使用,往往可以利用靜態方法做一個內部類的匿名內部類實現

在接口中直接定義匿名內部類

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

與內部類相比匿名內部類只是一個沒有名字的只能夠使用一次的,并且結構固定的一個子類。

4.總結:

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8254

    瀏覽量

    149942
  • 程序
    +關注

    關注

    115

    文章

    3719

    瀏覽量

    80355
  • 代碼
    +關注

    關注

    30

    文章

    4670

    瀏覽量

    67760
  • static
    +關注

    關注

    0

    文章

    33

    瀏覽量

    10320
收藏 人收藏

    評論

    相關推薦

    ARM之靜態變量簡析

    靜態變量的值可以一直保持到程序結束,使用關鍵字static可以將變量聲明為靜態的:static int x ;static float y;根據聲明的位置不同,靜態變量也可以分為內部類
    發表于 04-24 09:27

    接口、內部類和Java API基礎

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

    java中static的作用及常見的誤區

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

    java內部類分析詳解

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

    java內部類怎么寫

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

    java中static關鍵字的作用

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

    基于static變量來實現一個模塊的封裝

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

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

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

    Java內部類持有外部類導致內存泄露的原因以及其解決方案

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

    JAVA中static、final、static final如何區分

    當我們在使用java寫類的屬性時總會用到很多的類型去修飾它,比如字符串String,整數型int,但是我們偶爾也會遇到 static、final、static final,那么他們的區別是什么呢?
    的頭像 發表于 02-14 14:55 ?1116次閱讀
    JAVA中<b class='flag-5'>static</b>、final、<b class='flag-5'>static</b> final如何區分

    Java內部類使用不當導致的內存泄露問題及解決辦法

    非靜態內部類會持有外部類,如果有地方引用了這個非靜態內部類,會導致外部類也被引用,垃圾回收時無法回收這個外部類(即使外
    的頭像 發表于 05-18 16:09 ?1038次閱讀
    Java<b class='flag-5'>內部類</b>使用不當導致的內存泄露問題及解決辦法

    LL庫中常見關鍵字__STATIC_INLINE

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

    如何在普通類中使用內部結構

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

    Java中對static關鍵詞的介紹

    static 是Java的一個關鍵字,可以用來修飾成員變量、修飾成員方法、構造靜態代碼塊、實現靜態導包以及實現靜態內部類,下面我們來分別介紹。 1、修飾成員變量 用 static 修飾成員變量
    的頭像 發表于 10-11 15:26 ?384次閱讀
    Java中對<b class='flag-5'>static</b>關鍵詞的介紹

    java內部類可以用public修飾嗎

    Java的內部類是指一個類被定義在另一個類的內部。根據定義的位置和訪問權限的不同,內部類可以分為四種:成員
    的頭像 發表于 11-21 10:23 ?847次閱讀