【Java基礎知識】內部類詳解__Java

來源:互聯網
上載者:User

1.定義:
將一個類的定義放在另一個類的定義內部,與之對應包含內部類的類被稱為外部類

2.內部類的作用:

(1)內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類;
(2)內部類的方法可以直接存取外部類的所有資料,包括私人的資料;
(3)內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便;
(4)每個內部類都能獨立的繼承一個(介面)實現,無論外部類是否已經繼承了個(介面)實現,對於內部類沒有影響;
(5)內部類不能被覆蓋,但可通過繼承實現。

3.普通內部類(成員內部類)

(1)使用方法:

內部類定義在外部類的內部,相當於外部類的一個成員變量的位置,內部類可以使用任意存取控制符,如 public 、 protected 、 private 等;

內部類中定義的方法可以直接存取外部類中的資料,而不受存取控制符的影響

定義了成員內部類後,必須使用外部類對象來建立內部類對象,而不能直接去 new 一個內部類對象,

即:內部類 對象名 = 外部類對象.new 內部類( );

例:

Outer o = new Outer();           //建立外部類對象Inner io = o.new Inner();        //建立內部類對象
編譯上面的程式後,會發現產生了兩個 .class ⽂檔案;外部類對應的class檔案是:外部類名 .class ,內部類對應的class檔案是:外部類名$內部類名.class

(2)注意:

外部類是不能直接使用內部類的成員和方法,可先建立內部類的對象,然後通過內部類的對象來訪問其成員變量和方法。

如果外部類和內部類具有相同的成員變量或方法,內部類預設訪問自己的成員變數量或方法,如果要訪問外部類的成員變數量,可以使用 this 關鍵字。

例:

public class Employee {    private String name = "Redis";    class Mannger {        private String name = "Netty";        public void getName(){            String name = "Lee";            System.out.println("局部變數:" + name);            System.out.println("內部類變數:" + this.name);            System.out.println("外部類變數:" + Employee1.this.name);        }    }    public static void main(String[] args) {        Employee e = new Employee();        Mannger m = e.new Mannger();        m.getName();    }}

運行結果:

局部變數:Lee內部類變數:Netty外部類變數:Redis


4.靜態內部類

(1)定義:由static關鍵字修飾的內部類。

(2)特點:

靜態內部類不能直接存取外部類的非靜態成員,但可以通過new 外部類().成員 的方式訪問

如果外部類的靜態成員與內部類的成員名稱相同,可通過“類名.靜態成員”訪問外部類的靜態成員;若不同,則可通過“成員名”直接調.用外部類的靜態成員

建立靜態內部類的對象時,不需要外部類的對象,可以直接建立
即:內部類 對象名= new 內部類();

例:

public class Employee2 {    private static String name = "Redis";    static class Mannger {        private String name = "Netty";        public String getName(){            return this.name;        }    }    public static void main(String[] args) {        Mannger m = new Mannger();        System.out.println(m.getName());    }}

運行結果:

Netty



5.方法內部類

(1)定義:
內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用。

(2)局限:
由於方法內部類不能在外部類的方法以外的地方使用,因此方法內部類不能使用存取控制符和 static 修飾符。

例:

public class Parcel {    public String destination() {        String label = "top";        class Destination {            public void readLabel() {                System.out.println("方法內部類。");            }        }        new Destination().readLabel();        return label;    }    public static void main(String[] args) {        Parcel p = new Parcel();        System.out.println(p.destination());    }}

運行結果:

方法內部類。top



6.匿名內部類

(1)定義:
只建立內部類的一個對象,沒有名稱。

(2) 注意:

使用匿名內部類時,我們必須是繼承一個類或者實現一個介面,但是兩者不可兼得,同時也只能繼承一個類或者實現一個介面。

匿名內部類中是不能定義建構函式的。

匿名內部類中不能存在任何的靜態成員變數和靜態方法。

匿名內部類為局部內部類,所以局部內部類的所有限制同樣對匿名內部類生效。

匿名內部類不能是抽象的,它必須要實現繼承的類或者實現的介面的所有抽象方法。

匿名內部類不能訪問外部類方法中的局部變數,除非變數被聲明為final類型

例:

public class Bird {    public Goose getName(int n){        return new Goose (){            int number = 6 + n;            public int getNumber(){                return number;            }        };    }    public static void main(String[] args) {        Bird bird = new Bird();        Goose goose = bird.getName(3);        System.out.println(goose.getNumber());    }}interface Goose {    int getNumber();}//輸出結果:   9



本人才疏學淺,若有錯誤,請指出~
謝謝。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.