今天同学遇到一个奇怪的问题,让我帮他看,结果发现了一个 javac 的处理小 bug 。
看这段代码:
你可能认为,这段代码编译之后,会生成两个 class 文件:OuterClass.class 和 OuterClass$InnerClass.class 。但事实是,还会多生成一个 OuterClass$1.class ,即使去掉 static 修饰符也是这样的。为什么会这样呢?
我经过上网查找,找到的讨论:
http://hi.baidu.com/digno/blog/item/cd894a630511a16a0c33faa5.html
http://72.5.124.102/thread.jspa?threadID=277695&tstart=9117
http://forums.sun.com/thread.jspa?threadID=594503
解决的办法是:给 InnerClass 加上一个 public 的构造函数,或者去掉 InnerClass 的 private 修饰符。
用 Eclipse 编译就没有这个问题。这个问题的麻烦之处就在于:如果用 emma 测覆盖率,那么那个 OuterClass$1 就没办法覆盖到。