🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## [嵌套类](https://lingcoder.gitee.io/onjava8/#/book/11-Inner-Classes?id=%e5%b5%8c%e5%a5%97%e7%b1%bb) 如果不需要内部类对象与其外部类对象之间有联系,那么可以将内部类声明为**static**,这通常称为嵌套类。想要理解**static**应用于内部类时的含义,就必须记住,普通的内部类对象隐式地保存了一个引用,指向创建它的外部类对象。然而,当内部类是**static**的时,就不是这样了。嵌套类意味着: 1. 要创建嵌套类的对象,并不需要其外部类的对象。 2. 不能从嵌套类的对象中访问非静态的外部类对象。 嵌套类与普通的内部类还有一个区别。普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有**static**数据和**static**字段,也不能包含嵌套类。但是嵌套类可以包含所有这些东西: ~~~ // innerclasses/Parcel11.java // Nested classes (static inner classes) public class Parcel11 { private static class ParcelContents implements Contents { private int i = 11; @Override public int value() { return i; } } protected static final class ParcelDestination implements Destination { private String label; private ParcelDestination(String whereTo) { label = whereTo; } @Override public String readLabel() { return label; } // Nested classes can contain other static elements: public static void f() {} static int x = 10; static class AnotherLevel { 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**方法。