首先说明下内部类可不是组合。
内部类最直白的一个作用就是名字隐藏和组织代码的模式。
虽然隐藏和组织是很有用的,但还是不能让人对它注意。它还有其它用途。当生成一个内部类的对象时,此对象与制造它的外围对象之间就有一种联系,它可以访问其外围对象的所有成员,而不需要任何特殊条件。此外,内部类还拥有其外围类的所有元素的访问权。
内部类可以返回一个对象的引用。
比如a类有个c类,c类返回此类的引用。我们可以这样用。
A a = new A();
C c = a.c;
内部类自动拥有对其外围所有成员的访问权限。这是如何做到的呢?
当某个外围类的对创建了一个内部类对象时,此内部类对象必定秘密地捕获一个指向那个外围类对象的引用。然后在你访问此外围类的成员时,就是用那个引用来选择外围类的成员。幸运的是,编译器会帮你处理所有细节,但你现在可以看到:内部类的对象只能在与其外围类的对象相关联的情况下才能被创建(内部类是非static时)。构建内部类时需要一个指向其外围类对象的引用,如果编译器访问不到这个引用就会报错。不过绝大多数时候这都无需程序员操作。
内部类的典型用途便是就是上面所说的隐藏和组织代码。通常,如果读、写的代码包含内部类,那么它们都是”平凡的“内部类,简单并且容易理解。然而内部类的语法覆盖了大量其他的更加难以理解的技术。例如可以在一个方法或者任意作用域中定义内部类。这么做有俩理由:
1、你实现了某个类型的接口,于是创建并返回对其的引用。
2、你要解决一个复杂的问题,想要创建一个类来辅助你的解决方案,但是又不希望这个类是公共可用的。