java炒冷饭系列12 嵌套类(静态内部类)

如果不需要内部类对象与外围对象之间有联系,那么可以将内部类声明为static。这通常称为嵌套类。想要理解static就用于内部类时的含义,就必须记住,普通的内部类对象隐式地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时候,就不是这样了。嵌套类意味着:

  1. 要创建嵌套类的对象,并不需要其外围类的对象
  2. 不能从嵌套类的对象中访问非静态的外围类对象

嵌套类与普通的内部类还有一个区别:普通内部类的字段与方法(这里应该是静态字段与方法),只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类。但是嵌套类可以包含所有这些东西。

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

    protected static class ParcelDestination implements Destination{
        private String label;
        private ParcelDestination(String whreTo){
            label = whreTo;
        }
        @Override
        public String readLabel() {
            return label;
        }

        public static void f(){}

        static int x = 10;

        static class AntherLevel{
            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("Tasmania");
    }
}

main()中没有任何Parcel11的对象是必需的;而是使用选取static成员的普通语法来调用方法--这些方法返回的ContentsDestination的引用。
在一个普通的(非static)内部类中,通过一个特殊的this引用可以链接到其外围类对象。嵌套类就没有这个特殊的this引用,这使得它类似于一个static方法。

练习:创建一个包含嵌套类的类。在main()中创建其内部类的实例

public class OutWithStaticInner {
    static class Inner{}

    public static void main(String[] args) {
        //注意普通内部类与静态内部类在实例化的区别哦
        OutWithStaticInner.Inner oi = new OutWithStaticInner.Inner();
    }
}

练习:创建一个包含了内部类的类,而此内部类又包含有内部类。使用嵌套类重复这个过程。注意编译器生成的.class文件的名字

public class One {
    public class Two{
        public class Three{

        }
    }

    public static void main(String[] args) {
        new One().new Two().new Three();
    }
}

用javac编译以后得到如下结果

$ javac One.java
$ ls *.class
One.class  One$Two.class  One$Two$Three.class

参考文献

《Java编程思想》10.7嵌套类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值