如果不需要内部类对象与外围对象之间有联系,那么可以将内部类声明为static。这通常称为嵌套类。想要理解static就用于内部类时的含义,就必须记住,普通的内部类对象隐式地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时候,就不是这样了。嵌套类意味着:
- 要创建嵌套类的对象,并不需要其外围类的对象
- 不能从嵌套类的对象中访问非静态的外围类对象
嵌套类与普通的内部类还有一个区别:普通内部类的字段与方法(这里应该是静态字段与方法),只能放在类的外部层次上,所以普通的内部类不能有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成员的普通语法来调用方法--这些方法返回的Contents和Destination的引用。
在一个普通的(非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嵌套类