內(nèi)部類(二)

1.4 嵌套類

不需要內(nèi)部類對象與其外圍類對象之間有聯(lián)系,將內(nèi)部類聲明為static。這通常被稱為嵌套類。

在一個普通的(非static)內(nèi)部類中,通過一個特殊的this引用可以鏈接到其外圍類對。而嵌套類沒有這個特殊的this引用,這使它類似于一個static方法

  • 1)要創(chuàng)建嵌套類的對象,并不需要其外圍類的對象。
  • 2)不能從嵌套類的對象中訪問非靜態(tài)的外圍類對象。
interface Destination {
    String readLabel();
}

interface Contents {
    int value();
}

public class Parcel2 {
    
    private static class ParcelContents implements Contents {
        private int i = 11;
        @Override
        public int value() {
            return i;
        }
    }

    private static class ParcelDestination implements Destination {
        private String label;

        private ParcelDestination(String whereTo) {
            label = whereTo;
        }

        @Override
        public String readLabel() {
            return label;
        }

        public static void f() {}

        static int x = 10;

        static class AnotherLevel {
            public static void f() {}

            static int x = 10;
        }
    }
    
    public static Destination destination(String s){
        return new ParcelDestination(s);
    }
    
    public static Contents contents(){
        return new ParcelContents();
    }

    public static void main(String[] args) {
        Contents c = contents();
        Destination d = destination("China");
    }
}

1.4.1 接口內(nèi)部的類

正常情況下,不能在接口內(nèi)部放置任何代碼,但嵌套類可以作為接口的一部分。放在接口中的任何類型都自動地是public和static地。所以我們可以將類名為為下例所示,甚至可以在內(nèi)部類中實(shí)現(xiàn)其外圍接口。

public interface ClassInInterface {
    void howdy();
    class Test implements ClassInInterface{
        @Override
        public void howdy() {
            System.out.println("Howdy!");
        }

        public static void main(String[] args) {
            new Test().howdy();
        }
    }
}

運(yùn)行結(jié)果:

Howdy!

當(dāng)我們想要創(chuàng)建某些公共代碼,使得它們可以被某個接口的所有不同實(shí)現(xiàn)所共用,那么我們就可以使用接口內(nèi)部的嵌套類。

1.4.2 從多層嵌套類中訪問外部類的成員

一個內(nèi)部類被嵌套多少層并不重要——它能透明地訪問所有它所嵌入的外圍類的所有成員。

class MNA {
    private void f() {
        System.out.println("f()");
    }

    class A {
        private void g() {
            System.out.println("g()");
        }

        public class B {
            void h() {
                System.out.println("h()");
                g();
                f();
            }
        }
    }
}

public class MultiNestingAccess {
    public static void main(String[] args) {
        MNA mna = new MNA();
        MNA.A mnna = mna.new A();
        MNA.A.B mnnab = mnna.new B();
        mnnab.h();
    }
}

運(yùn)行結(jié)果:

h()
g()
f()

從例子中我們可以知到MNA.A.B中,調(diào)用方法g()和h()不需要任何條件(即使它們被定義為private)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容