內(nèi)部類(lèi)(一)

1.1 鏈接到外部類(lèi)

內(nèi)部類(lèi)擁有其外部類(lèi)的所有元素的訪(fǎng)問(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)部類(lèi)中需要生成對(duì)外部類(lèi)對(duì)象的引用時(shí),可以使用外部類(lèi)的名字跟.this。如果我們?cè)谕獠款?lèi)中需要?jiǎng)?chuàng)建內(nèi)部類(lèi)的對(duì)象,可以使用外部類(lèi)的引用.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)部類(lèi)

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

public interface Flower {
    String flowerName();
}
/**
 * 定義在方法中的類(lèi)(局部?jī)?nèi)部類(lè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)部類(lè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();
    }
}

在匿名類(lèi)中不可能有命名構(gòu)造器,但通過(guò)實(shí)例初始化,可以達(dá)到為匿名內(nèi)部類(lè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)部類(lèi)與正規(guī)的繼承相比有些限制,因?yàn)槟涿麅?nèi)部類(lèi)既可以擴(kuò)展類(lèi),也可以實(shí)現(xiàn)接口,但不能兩者兼?zhèn)?。而且如果?shí)現(xiàn)接口,也只可以實(shí)現(xiàn)一個(gè)接口。

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

下面的例子,flower()的參數(shù)必須是final的,因?yàn)樗鼈兪窃谀涿?lèi)內(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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