OnJava8笔记5 -- 内部类

2020-04-19  本文已影响0人  给点阳光我就灿烂_ab56

内部类

一个定义在另一个类中的类,叫作内部类。

创建内部类

public class Parcel {
    class Contents {
        private int i = 11;

        public int value() { return i; }
    }
}

内部类中的 .this 和 .new

.this

.new

方法和作用域中的内部类

public class Parcel6 {
    private void internalTracking(boolean b) {
        if(b) {
            class TrackingSlip {
                private String id;
                TrackingSlip(String s) {
                    id = s;
                }
                String getSlip() { return id; }
            }
            TrackingSlip ts = new TrackingSlip("slip");
            String s = ts.getSlip();
        }
        // Can't use it here! Out of scope:
        //- TrackingSlip ts = new TrackingSlip("x");
    }
}

内部类只能在自己的作用域中能被使用

匿名内部类

public interface Contents {
    int value();
}
public class Parcel7 {
    public Contents contents() {
        return new Contents() { // Insert class definition
            private int i = 11;

            @Override
            public int value() { return i; }
        }; // Semicolon required
    }

    public static void main(String[] args) {
        Parcel7 p = new Parcel7();
        Contents c = p.contents();
    }
}

在创建 Contents 对象代码之后插入一个类的声明,这个插入的类就是匿名类(没有具体名字)

匿名内部类中的参数初始化

public class Parcel9 {
    // Argument must be final or "effectively final"
    // to use within the anonymous inner class:
    public Destination destination(final String dest) {
        return new Destination() {
            private String label = dest;
            @Override
            public String readLabel() { return label; }
        };
    }
    public static void main(String[] args) {
        Parcel9 p = new Parcel9();
        Destination d = p.destination("Tasmania");
    }
}

可以看到第6行用到的外部变量是final的(jdk8之后不用明确写final了,但还是不能被改变)
为什么必须是final的? 参考知乎 胖君 的回答:https://www.zhihu.com/question/21395848

嵌套类

static类型的内部类叫做嵌套类。嵌套类对象没有指向外部创建他的类的对象引用

为什么要使用内部类

上一篇下一篇

猜你喜欢

热点阅读