关于Java内部类的一个疑问
今天有同学拿一段代码给我看,问我这段代码会编译生成几个类文件:
1 public class OuterClass { 2 3 public static void main(String[] args) { 4 5 new InnerClass().said(); 6 7 } 8 9 10 11 private static class InnerClass { 12 13 public void said() { 14 15 System.out.println("Hello"); 16 17 } 18 19 } 20 21 }
不就是两个吗~~~
一个是OuterClass.class和一个OuterClass$InnerClass.class。可是我在命令行中编译,结果让我大跌眼镜:
怎么多出一个呢?OuterClass$1.class这个从名字上看像是匿名内部类生成的。可是我这里没有匿名内部类啊~~~神马情况。我试着把InnerClass改成public的。代码变成:
1 public class OuterClass { 2 3 public static void main(String[] args) { 4 5 new InnerClass().said(); 6 7 } 8 9 10 11 public static class InnerClass { 12 13 public void said() { 14 15 System.out.println("Hello"); 16 17 } 18 19 } 20 21 }
这一次用命令行就是生成两个类文件了。
我又试着在Eclipse编写同样的代码,结果让我更加不解~~~在Eclipse中无论是用public还是用private修饰InnerClass都只会生成OutClass.class和OutClass$InnerClass.class两个类文件。
而且我把OuterClass$1.class文件删掉也是可以正常运行的。证明这个类文件是没有用处的。
那为什么编译器会产生这个?还是说这个文件是中间文件只是javac命令不会自动把它删除?
希望高手解除小弟的疑惑。