【java提升】(18)---靜態內部類和非靜態內部類

<center> java提升](18)—靜態內部類和非靜態內部類 </center>

定義 放在一個類的內部的類咱們就叫內部類。html

本身從開發到如今其實用到內部類主要在兩個地方會考慮用內部類:java

一、使用靜態內部類的單例模式函數

二、將Json字符串轉爲Bean實體的時候,也考慮建立內部類spa

其它好比網上說的經過內部類實現多繼承,我尚未用過。這篇博客主要將靜態內部類非靜態內部類中的成員內部類,至於局部內部類和匿名內部類這邊就不闡述了。code

<font color=#FFD700> 1、概念</font>

咱們能夠簡單把內部類當成外部類的一個成員,若是你是static內部類,那麼外部類不須要建立對象就能夠訪問你,htm

若是你是非靜態類部類,那你就屬於外部類的對象的,因此必定要先建立外部對象才能來訪問你。對象

一、非靜態內部類

成員內部類也是最普通的內部類,它是外圍類的一個成員,因此它能夠訪問外圍類的全部成員屬性和方法。一樣外圍類也能夠訪問內部類的成員屬性和方法。blog

它的主要特色是:繼承

一、成員內部類中不能存在任何static的變量和方法ip

二、成員內部類是依附於外圍類的對象,因此只有先建立了外圍類對象纔可以建立內部類對象

補充:對於成員內部內並非徹底不能出現static字段的,若是你是使用finalstatic同時修飾一個屬性字段,而且這個字段是基本類型或者String

類型的,那麼是能夠編譯經過的。至於緣由須要瞭解class文件,我以前寫過一篇相關博客能夠參考:【JVM虛擬機】(7)---深刻理解Class中-屬性集合

二、靜態內部類

使用static修飾的內部類咱們稱之爲靜態內部類,咱們要知道只要是static修飾的類那它必定是內部類,不多是外部類。

靜態內部類與非靜態內部類之間存在一個最大的區別,咱們知道非靜態內部類在編譯完成以後會隱含地保存着一個引用,該引用是指向建立它的外圍類

的對象,可是靜態內部類卻沒有。沒有這個引用就意味着:

一、它的建立是不須要依賴於外圍類的對象

二、它不能使用任何外圍類的非static成員變量和方法

<br>

##<font color=#FFD700> 2、示例</font>

有關靜態內部類和非靜態內部類這裏作一個完整的代碼演示

一、代碼演示

/**
 * 外部類 OutClass
 */
public class OutClass {
    /**
     * 外部類靜態屬性
     */
    private static String name = "小小";
    /**
     * 外部類非靜態屬性
     */
    private Integer age = 3;

    /**
     * @Description: 非靜態內部類
     */
    private class InnerClass {
        // TODO 非靜態內部類不能聲明或定義靜態成員
        // private static String sex = "女";
        /**
         * 這裏定義靜態常量是不會報錯的哦
         */
        public static final String sex = "女";
        /**
         * 能夠定義 普通屬性
         */
        private int flag = 0;

        /**
         * 構造函數
         */
        public InnerClass() {
            // 非靜態內部類的非靜態成員能夠訪問外部類的非靜態變量和靜態變量
            System.out.println("非靜態類訪問外部對象的name" + name);
            System.out.println("外部對象的age " + age);
        }
    }
    /**
     * @Description: 靜態內部類
     */
    private static class InnerStaticClass {
        /**
         * 靜態內部類能夠有靜態成員和非靜態成員
         */
        private static String sex = "女";
        private int flag = 0;

        public InnerStaticClass() {
            System.out.println("靜態類訪問外部對象的name" + name);
            //靜態類只能訪問外部的靜態成員,不能訪問非靜態成員
            //System.out.println("外部對象的age " + age);
        }
    }
    
    public static void main(String[] args) {
        System.out.println("==========非靜態內部類調用==========");
        //new一個外部類
        OutClass outClass = new OutClass();
        // 經過外部類的對象new一個非靜態的內部類
        OutClass.InnerClass innerClass = outClass.new InnerClass();
        System.out.println("==========靜態內部類調用==========");
        //獲取靜態內部類的靜態屬性
        String sex = OutClass.InnerStaticClass.sex;
        //獲取靜態內部類的非靜態屬性
        OutClass.InnerStaticClass inner = new OutClass.InnerStaticClass();
        System.out.println(inner.flag);

    }
}

二、總結

這裏在針對上面代碼作一個總結

1.靜態內部類能夠有靜態成員(方法,屬性),而非靜態內部類則不能有靜態成員(方法,屬性)。
  2.靜態內部類只可以訪問外部類的靜態成員,而非靜態內部類則能夠訪問外部類的全部成員(方法,屬性)。
  3.實例化一個非靜態的內部類的方法:
         a.先生成一個外部類對象實例
         OutClass outClass=new OutClass();
         b.經過外部類的對象實例生成內部類對象
         OutClass.InnerClass inner=outClass.new InnerClass(); 
  4.實例化一個靜態內部類的方法:
         a.不依賴於外部類的實例,直接實例化內部類對象
         OutClass.InnerStaticClass inner=new OutClass.InnerStaticClass();
         b.調用內部靜態類的方法或靜態變量,經過類名直接調用
         OutClass.InnerStaticClass.static_sex

<br>

<font color=#FFD700> 補充</font>

####一、內部類的做用

我我的以爲主要有如下三點吧

一、內部類可以提供更好的隱蔽性。由於咱們的內部類是能夠用private和protected修飾的,因此在必要的時候咱們能夠保證在其它類裏是

沒法建立當前內部類對象的。就比如咱們經常使用的靜態內部類的單例模式。

二、經過內部類能夠實現多繼承

三、代碼能夠更加整潔。由於咱們在建立實體類的時候,可能類中還包含其它類,若是這個類只會被當前類使用,那咱們只需建立一個內部類就能夠了。

####二、展現一個靜態類部類的單例模式

/**
 * 外部類
 */
public class StaticInnerSingleton {
    /**
     * 私有的靜態內部類
     */
    private static class SingletonClassInstance{
        private static final StaticInnerSingleton instance = new StaticInnerSingleton();
    }
    /**
     * 獲取單例
     */
    public static  StaticInnerSingleton getInstance() {
        return SingletonClassInstance.instance;
    }
}

<br> <br>

我相信,不管從此的道路多麼坎坷,只要抓住今天,早晚會在奮鬥中嚐到人生的甘甜。抓住人生中的一分一秒,賽過虛度中的一月一年!(4)

原文出處:https://www.cnblogs.com/qdhxhz/p/11368870.html

相關文章
相關標籤/搜索