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

来源:互联网 发布:windows用户管理工具 编辑:程序博客网 时间:2024/05/23 13:47

如果不需要内部类对象与外围对象之间有联系,那么可以将内部类声明为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 *.classOne.class  One$Two.class  One$Two$Three.class

参考文献

《Java编程思想》10.7嵌套类

阅读全文
0 0