今天同学遇到一个奇怪的问题,让我帮他看,结果发现了一个 javac 的处理小 bug 。
看这段代码:
public class OuterClass {
private InnerClass test = new InnerClass();
private static class InnerClass {
}
}
你可能认为,这段代码编译之后,会生成两个 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
据说原因是:
写道
当内部类是私有的且没有明确书写公有的构造函数时,那么缺省构造函数就是私有的,javac(SUN JDK 1.4)对这种情况的处理就是创建一个可以访问的带有一个参数的构造函数,而这个参数的类型是一个匿名的静态类,所以编译时就会多生成一个class文件。
解决的办法是:给 InnerClass 加上一个 public 的构造函数,或者去掉 InnerClass 的 private 修饰符。
public class OuterClass {
private InnerClass test = new InnerClass();
private static class InnerClass {
public InnerClass() {
}
}
}
用 Eclipse 编译就没有这个问题。这个问题的麻烦之处就在于:如果用 emma 测覆盖率,那么那个 OuterClass$1 就没办法覆盖到,结果类覆盖率大打折扣。