1. 程式人生 > >內部類, 靜態內部類, 區域性類, 匿名內部類的解析和區別

內部類, 靜態內部類, 區域性類, 匿名內部類的解析和區別

內部類:

    成員內部類可訪問外部類所有的方法和成員變數。

    不能有靜態的方法和成員變數。

靜態內部類:

    只能訪問外部類的靜態成員變數與靜態方法。

    靜態內部類的非靜態成員可訪問外部類的靜態變數,而不可訪問外部類的非靜態變數。

匿名內部類:

    沒有類名,沒有class關鍵字也沒有extends和implements等關鍵字修飾。

    類的定義和物件的例項化同時進行。
--------------------- 

眾所周知,外部頂級類的類名需和類檔名相同,只能使用public和default。而內部類是指在外部類的內部再定義一個類,類名不需要和檔名相同。內部類可以是靜態static的,也可用public,default(包限定),protected和private修飾。

內部類:

概念:

我們所說的內部類,官方的叫法是巢狀類(Nested Classes)。巢狀類包括靜態內部類(Static Nested Classes)和內部類(Inner Classes)。而內部類分為成員內部類,區域性內部類(Local Classes)和匿名內部類(Anonymous Classes)。

image.png

內部類是一個編譯是的概念,一旦編譯成功,就會成為完全不同的兩個類,分別為outer.class和outer$inner.class類。所以內部類的成員變數/方法名可以和外部類的相同。

內部類有什麼作用?

1.內部類可以很好的實現隱藏
一般的非內部類,是不允許有 private 與protected許可權的,但內部類可以
2.內部類擁有外圍類的所有元素的訪問許可權 (private修飾也能訪問)
3.可是實現多重繼承 (讓多個內部類分別繼承多個其他類,使外部類可以同時獲取多個其他類的屬性)
4.可以避免修改介面而實現同一個類中兩種同名方法的呼叫。(外部類繼承,讓內部類實現介面)

靜態內部類:

形如:

public class OuterClass {
    private String name;

    static class StaticInerCls{
        private String name;
    }
}

靜態內部類除了訪問許可權修飾符比外圍類多以外, 和外圍類沒有區別, 只是程式碼上將靜態內部類組織在了外部類裡面。靜態內部類不能訪問外部類的非公開成員。
建立靜態內部類:以Class.Iner的形式

OuterClass.StaticInerCls staticInerCls = new OuterClass.StaticInerCls();  

非靜態內部類:

非靜態內部類能訪問外部類的一切成員, 包括私有成員。外部類雖然不能直接訪問內部類的成員, 但是可以通過內部類的例項訪問內部類的私有成員。

成員內部類:

形如:

public class OuterCls {
    private String name;
    public String getName(){
        return name;
    }

    class InerCls{
        private String name;

        public String getName(){
            return name;
        }
    }

}

成員內部類可以直接使用外部類的所有成員和方法,即使是private修飾的。而外部類要訪問內部類的所有成員變數和方法,內需要通過內部類的物件來獲取。(誰叫它是親兒子呢?) 要注意的是,成員內部類不能含有static的變數和方法。因為成員內部類需要先建立了外部類,才能建立它自己的。
建立內部類物件方法,以object.new Iner的形式:

OuterCls outerCls = new OuterCls();
OuterCls.InerCls inerCls = outerCls.new InerCls();  

成員內部類不能有static修飾的成員,但是卻允許定義常量。

public class OuterClass {
    private String name;

    static class StaticInerCls{
        private String name;
    }

    class InerCls{
        private String name;
        private static int id;    //不允許,會報錯
        private static final int TYPE = 0;   //允許
    }
}

區域性內部類:

指內部類定義在方法體內,只能在該方法或條件的作用域內才能使用,退出這寫作用域就無法引用。

public class OuterCls {
    private String name;
    public String getName(){
        return name;
    }

    public void getInerCls(){
        class InerCls{
            private String name;

            public String getName(){
                return name;
            }
        }
    }

}

作為非靜態內部類的一種特殊形式, 非靜態內部類的所有限制對區域性類同樣成立。區域性類不僅可以訪問外部類的所有成員,還可以訪問方法體的區域性變數,但必須是final修飾的區域性變數。

為什麼區域性類訪問區域性變數,變數必須加上final?

場景:

    public static void main(String[] args){
        Outer out = new Outer();
        Object obj = out.method();
    }

    Object method(){
        int localVariable = 0;
        class Inner{
            void println(){
                System.out.println("localVariable " + localVariable);
            }
        }
        Object in = new Inner();
        return in;
    }
}

這裡的localVariable會變紅,提示需要給localVariable變數加final修飾。
解析:這是作用域的問題。在方法method執行完成後,區域性變數value就失效了,而在new Inner()產生的in物件還存在obj的引用,這樣物件就訪問了一個不存在的變數,是不允許的。iner還存在,在外面和後續呼叫該區域性變數時,這個區域性變數可能已經失效了。但為什麼加上final就可以保證能訪問呢?這裡Java採用了一種copy local variable的方法實現,定義為final的變數,會拷貝一份存到區域性內部類中,後續使用持續維護這個物件在生命週期內,所以可以繼續訪問。

注:final可以修飾的範圍有類,方法,屬性。修飾類,該類不可以被繼承;修飾方法,該方法不可以被子類重寫;修飾變數,該變數值不能被修改。

匿名內部類:

為了免去給內部類命名,或者只想使用一次,就可以選擇使用匿名內部類。

    public void countDown(){
        new Thread(){
            @Override
            public void run() {

            }
        }.start();
    }



作者:翻滾吧李博
連結:https://www.jianshu.com/p/f0fdea957792
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。

相關推薦

細說Java部類, 靜態部類, 區域性, 匿名部類

前言 自己看了一眼oracle官網關於內部類的介紹, 不多, 但是有些點還是要注意的. 當然這些知識只能說是面試有用, 平時使用內部類, 如果違反規則, 編譯器會提示你的, 所以看看就行, 沒必要背熟. 名詞介紹 先把我們用的名詞說清楚. 我們說的內

部類, 靜態部類, 區域性, 匿名部類解析區別

內部類:     成員內部類可訪問外部類所有的方法和成員變數。     不能有靜態的方法和成員變數。 靜態內部類:     只能訪問外部類的靜態成員變數與靜態方法。     靜態內部類的非靜態成員可訪問外部類的靜態變數,而不可訪問外部類的非靜態變數。 匿名內部類:

10、【C++】前向宣告、巢狀區域性部類

一、前向宣告     在C++中,類需要先定義,而後才能被例項化,但是實際存在一種場景是:兩個類需要相互引用或相互成為類中的子物件成員時,就無法先定義使用,在編譯環節就出現錯誤導致編譯失敗,這時就需要用到前向宣告,此外,前向宣告的類不能被例項化。 【示例】 //

匿名部類可以訪問的變數---靜態成員變數final修飾的區域性變數

  在學習多執行緒的時候用到了匿名內部類,匿名內部類可以訪問static靜態成員變數或者final修飾的區域性變數。   匿名內部類在編譯之後會生成class檔案,比如Test內的第一個匿名內部類編譯之後就是Test$1.class;   匿名內部類中訪問的final修飾的區域性變數在生成Test$1.c

部類------巢狀區域性匿名、lambda

巢狀類、區域性類:是帶有名字的,可以多次使用,巢狀類使用相對更為靈活一點,區域性類在函式內內部。匿名類只是使用一次,lambda是匿名類的簡寫。 巢狀類: 是否有名稱空間:是 是否可以生面為static型別:可以宣告為static類,建立方式OuterClass.S

JAVA部類(成員部類區域性部類匿名部類靜態部類

    在Java中,可以將一個類定義在另一個類裡面或者一個方法裡面,這樣的類稱為內部類。廣泛意義上的內部類一般來說包括這四種:成員內部類、區域性內部類、匿名內部類和靜態內部類。下面就先來了解一下這四種內部類的用法。   1.成員內部類   成員內部類是最普通的內部類,它

Java部類靜態區域性詳解

先看一個例子: class TalkingClock { private int interval; private boolean beep; public TalkingClock(int interval,boolean be

Java部類(成員部類靜態部類區域性部類匿名部類)小結

內部類不是很好理解,但說白了其實也就是一個類中還包含著另外一個類 如同一個人是由大腦、肢體、器官等身體結果組成,而內部類相當於其中的某個器官之一,例如心臟:它也有自己的屬性和行為(血液、跳動) 顯然,此處不能單方面用屬性或者方法表示一個心臟,而需要一個類

成員部類區域性部類靜態部類匿名部類

成員內部類class Demo1_InnerClass { public static void main(String[] args) { //Inner i = new Inner();

成員部類靜態部類區域性部類匿名部類的理解

說起內部類這個詞,想必很多人都不陌生,但是又會覺得不熟悉。原因是平時編寫程式碼時可能用到的場景不多,用得最多的是在有事件監聽的情況下,並且即使用到也很少去總結內部類的用法。今天我們就來一探究竟。下面是本文的目錄大綱:   一.內部類基礎   二.深入理解內部類   三.內部類的使用場景和好處   四.常見的與

成員部類.區域性部類.靜態部類.匿名部類區別

一 對於非靜態內部類,不能有靜態成員,例如變數,方法等。靜態內部類的非靜態成員可以訪問外部類的靜態變數,而不可訪問外部類的非靜態變數。非靜態內部類的非靜態成員可以訪問外部類的非靜態變數。 成員內部類可以隨意使用外部類的成員方法及成員變數,儘管這些類成員被修飾為private

Java 部類、成員區域性匿名

Java各種稱呼類詳解   Java有各種各樣類,內部類、巢狀類、成員類、區域性類(本地類)、靜態類、匿名類、檔案類以及這些組合起來的稱呼類,成員內部類,成員匿名類,成員巢狀類,本地匿名類等,真是多的不行,但有些其實是一個意思,在這裡好好理一理。 宣告

六個例項教你正確使用Java部類(成員部類匿名部類靜態部類區域性部類

內部類不是很好理解,但說白了其實也就是一個類中還包含著另外一個類 如同一個人是由大腦、肢體、器官等身體結果組成,而內部類相當於其中的某個器官之一,例如心臟:它也有自己的屬性和行為(血液、跳動) 顯然,此處不能單方面用屬性或者方法表示一個心臟,而需要一個類

-1-2 java 面向物件基本概念 封裝繼承多型 變數 this super static 靜態變數 匿名物件 值傳遞 初始化過程 程式碼塊 final關鍵字 抽象 介面 區別 多型 包 訪問許可權 內部類 匿名內部類 == 與 equal

java是純粹的面向物件的語言 也就是萬事萬物皆是物件 程式是物件的集合,他們通過傳送訊息來相互通訊 每個物件都有自己的由其他的物件所構建的儲存,也就是物件可以包含物件 每個物件都有它的型別  也就是類 某一特定型別的所有物件都可以接收相同的訊息,因為同一類事物有共同的特性 面向物件開發 •

靜態靜態部類匿名部類區域性部類

內部類有靜態內部類,靜態內部類,匿名內部類,區域性內部類 (1)非靜態內部類 直接在類的內部定義的類就是非靜態內部類,如下 public class Test { public static void main(String[] args) { Outer.Inner c1

匿名部類、成員區域性

今天看程式碼,看到幾個概念:內部類、區域性類、成員類、靜態成員類、匿名內部類;瞬間有種被搞糊塗了感覺。下面是一個小例子來對它們進行說明: public class ClassTest{ public static void main(String[] args) {

【Java 程式設計】嵌入部類區域性匿名

文章目錄 1. 嵌入類,內部類 ,外部類 2. 變數的可見性 3. 區域性類 4. 匿名類 5. 避免內部類的序列化 在程式碼中使用嵌入類,能增強程式碼的封裝性和可讀性,讓程式碼更簡潔,有效。 1. 嵌入類

java之匿名部類、成員部類、方法部類靜態部類

一、匿名內部類:必須繼承一個類或者實現介面,不能建立建構函式。 /** * 匿名內部類 * * @author: Rodge * @time: 2018年10月4日 下午3:44:03 * @version: V1.0.0 */ public class AnonymousInner

之間的關係與匿名部類的使用,異常的處理

final關鍵字 修飾類, 表示最終類,不能被繼承 修飾成員變數(欄位), 一般與static同時使用, 稱為final常量 ,在定義時必須初始化,不能修改 修飾方法, 不能被重寫 修飾區域性變數, 一旦初始化後就不能再修改. 注意,如果修飾的是引用型別變數,這個引用不能再指向其他

部類-區域性部類-匿名部類

內部類(常規內部類,靜態內部類),區域性內部類,匿名內部類。 下面的述語中,成員內部類是指常規內部類與靜態內部類。 getDeclaringClass():Class<?> 獲取成員內部類在定義時所在的類。 getEnclosingClass():C