內(nèi)部類(一)

1.1 鏈接到外部類

內(nèi)部類擁有其外部類的所有元素的訪問(wèn)權(quán)

interface Selector {
    boolean end();

    Object current();

    void next();
}

public class Sequence {
    private Object[] items;
    private int next = 0;

    public Sequence(int size) {
        items = new Object[size];
    }

    public void add(Object x) {
        if (next < items.length) {
            items[next++] = x;
        }
    }

    private class SequenceSelector implements Selector {
        private int i = 0;

        @Override
        public boolean end() {
            return i == items.length;
        }

        @Override
        public Object current() {
            return items[i];
        }

        @Override
        public void next() {
            if (i < items.length)
                i++;
        }
    }

    public Selector selector() {
        return new SequenceSelector();
    }

    public static void main(String[] args) {
        Sequence sequence = new Sequence(10);
        for (int i = 0; i < 10; i++)
            sequence.add(i);
        Selector selector = sequence.selector();
        while (!selector.end()) {
            System.out.println(selector.current());
            selector.next();
        }
    }
}

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

0
1
2
3
4
5
6
7
8
9

1.2 使用.this和.new

如果我們?cè)趦?nèi)部類中需要生成對(duì)外部類對(duì)象的引用時(shí),可以使用外部類的名字跟.this摆马。如果我們?cè)谕獠款愔行枰獎(jiǎng)?chuàng)建內(nèi)部類的對(duì)象蜡秽,可以使用外部類的引用.new。如下所示:

public class DotThis {
    void f(){
        System.out.println("DotThis.f()");
    }

    public class Inner{
        public DotThis outer(){
            return DotThis.this;
        }
    }

    public static void main(String[] args) {
        DotThis dt = new DotThis();
        DotThis.Inner dti = dt.new Inner();
        dti.outer().f();
    }
}

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

DotThis.f()

1.3 在方法和作用域內(nèi)的內(nèi)部類

1.3.1 局部?jī)?nèi)部類

public interface Flower {
    String flowerName();
}
/**
 * 定義在方法中的類(局部?jī)?nèi)部類)
 */
public class Rose {

    private Flower name(String s) {

        class FName implements Flower {
            private String flower;

            private FName(String s) {
                flower = s;
            }
            
            @Override
            public String flowerName() {
                return flower;
            }
        }
        return new FName(s);
    }

    public static void main(String[] args) {
        Rose r = new Rose();
        r.name("rose");
    }
}

1.3.2 匿名內(nèi)部類

public class CherryBlossoms {
    public Flower flower(){
        return new Flower() {
            private String fName = "CherryBlossoms";
            @Override
            public String flowerName() {
                return fName;
            }
        };
    }

    public static void main(String[] args) {
        CherryBlossoms c = new CherryBlossoms();
        Flower flower = c.flower();
    }
}

在匿名類中不可能有命名構(gòu)造器刹碾,但通過(guò)實(shí)例初始化,可以達(dá)到為匿名內(nèi)部類創(chuàng)建一個(gè)構(gòu)造器的效果。

public abstract class FlowerName {
    public FlowerName(String name) {
        System.out.println("flower name: " + name);
    }

    public abstract void flowerName();
}
public class Sunflower {

    public FlowerName getFlowerName(String name){
        return new FlowerName(name) {
            @Override
            public void flowerName() {
                System.out.println("flowerName()");
            }
        };
    }

    public static void main(String[] args) {
        Sunflower s = new Sunflower();
        FlowerName fn = s.getFlowerName("sunflower");
        fn.flowerName();
    }
}

匿名內(nèi)部類與正規(guī)的繼承相比有些限制繁堡,因?yàn)槟涿麅?nèi)部類既可以擴(kuò)展類,也可以實(shí)現(xiàn)接口乡数,但不能兩者兼?zhèn)渫痔恪6胰绻麑?shí)現(xiàn)接口,也只可以實(shí)現(xiàn)一個(gè)接口净赴。

在上個(gè)例子中不要求變量name一定是finnal的绳矩。因?yàn)閚ame被傳遞給匿名類的基類的構(gòu)造器,它并不會(huì)在匿名類的你內(nèi)部被直接使用玖翅。

下面的例子翼馆,flower()的參數(shù)必須是final的割以,因?yàn)樗鼈兪窃谀涿悆?nèi)部使用的。具體原因

public class Gypsophila {
    public Flower flower(final String name,final float price){
        return new Flower() {
            private int cost;
            {
                cost = Math.round(price);
                if (cost > 100){
                    System.out.println("Over budget!");
                }
            }
            private String fName = name;
            @Override
            public String flowerName() {
                return name;
            }
        };
    }

    public static void main(String[] args) {
        Gypsophila g = new Gypsophila();
        Flower f = g.flower("Gypsophila",101.44f);
        f.flowerName();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末应媚,一起剝皮案震驚了整個(gè)濱河市严沥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌中姜,老刑警劉巖消玄,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異扎筒,居然都是意外死亡莱找,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門嗜桌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奥溺,“玉大人,你說(shuō)我怎么就攤上這事骨宠「《ǎ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵层亿,是天一觀的道長(zhǎng)桦卒。 經(jīng)常有香客問(wèn)我,道長(zhǎng)匿又,這世上最難降的妖魔是什么方灾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮碌更,結(jié)果婚禮上裕偿,老公的妹妹穿的比我還像新娘。我一直安慰自己痛单,他們只是感情好嘿棘,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著旭绒,像睡著了一般鸟妙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挥吵,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天重父,我揣著相機(jī)與錄音,去河邊找鬼蔫劣。 笑死坪郭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脉幢。 我是一名探鬼主播歪沃,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嫌松!你這毒婦竟也來(lái)了沪曙?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤萎羔,失蹤者是張志新(化名)和其女友劉穎液走,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體贾陷,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缘眶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了髓废。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巷懈。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖慌洪,靈堂內(nèi)的尸體忽然破棺而出顶燕,到底是詐尸還是另有隱情,我是刑警寧澤冈爹,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布涌攻,位于F島的核電站,受9級(jí)特大地震影響频伤,放射性物質(zhì)發(fā)生泄漏恳谎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一憋肖、第九天 我趴在偏房一處隱蔽的房頂上張望因痛。 院中可真熱鬧,春花似錦瞬哼、人聲如沸婚肆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)较性。三九已至,卻和暖如春结胀,著一層夾襖步出監(jiān)牢的瞬間赞咙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工糟港, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留攀操,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓秸抚,卻偏偏與公主長(zhǎng)得像速和,于是被迫代替她去往敵國(guó)和親歹垫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容