由于每个类都会生成一个.class文件,用于容纳与如何创建这个类型的对象有关的所有信息(这种信息产生了一个名为Class对象的元类),所以大家或许会猜到内部类也必须生成相应的.class文件,用来容纳与它们的Class对象有关的信息。这些文件或类的名字遵守一种严格的形式:先是封装类的名字,再跟随一个$,再跟随内部类的名字。例如,由InheritInner.Java创建的.class文件包括:
InheritInner.class
WithInner$Inner.class
WithInner.class
假如内部类是匿名的,那么编译器会简单地生成数字,把它们作为内部类标识符使用。若内部类嵌套于其他内部类中,则它们的名字简单地追加在一个$以及外部类标识符的后面。
这种生成内部名称的方法除了非常简单和直观以外,也非常“健壮”,可适应大多数场合的要求(注释③)。由于它是Java的标准命名机制,所以产生的文件会自动具备“与平台无关”的能力(注重Java编译器会根据情况改变内部类,使其在不同的平台中能正常工作)。
③:但在另一方面,由于“$”也是Unix外壳的一个元字符,所以有时会在列出.class文件时碰到麻烦。对一家以Unix为基础的公司——Sun——来说,采取这种方案显得有些希奇。我的猜测是他们根本没有仔细考虑这方面的问题,而是认为我们会将全部注重力自然地放在源码文件上。