关于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命令不会自动把它删除?

希望高手解除小弟的疑惑。

原文地址:https://www.cnblogs.com/yjiyjige/p/2838643.html