public class Outer{
public static void main(String argv[])
         {
Inner i=new Outer().new Inner();
}
private class Inner
         {
Inner(){}//就是这一行
}
}此时编译,出现2个文件,一个是Outer.class,一个是Outer$Inner.class
但是当我去掉Inner(){}这一行时,就会多增加一个文件Outer$1.class
$1一般表示一个匿名内部类,但是我这里没有啊,怎么会多出这个文件呢?

解决方案 »

  1.   

    没有啊   你的jdk是什么版本的
      

  2.   

    楼上的,
    第一,我的jdk是j2ee1.4.2的,这个肯定没问题
    第二,这是我从书上找到的题,它的答案和我运行的结果一样。
      

  3.   

    我用j2sdk1.4,按楼主所说编译,
    为什么没有默认构造函数的时候,
    生成的也是Outer$Inner.class
    没有出现什么Outer$1.class!!
      

  4.   

    javac编译后有一些没用的代码。
    例如:new Outer().new Inner()编译后的jvm代码中就空调用一行Object.getClass(),返回的Object都创建了,它的class肯定已经被装载了,真是想不出有什么实际用处。倒是给反编译工具在反编译这段代码的时候做了个记号。
      

  5.   

    我这段时间在研究java的反编译,搂主叙述的情况确实存在。而且,在编后的class里并没有其他地方使用到那个多出来的innerclass.
      

  6.   

    new Outer().new Inner()编译后的jvm代码中就空调用一行Object.getClass(),那为什么我加了构造函数后就没有那个匿名内部类了呢?
      

  7.   

    活活,还在研究这个问题呢。在我的机器上做了个测试
    Inner class 前面加private的,就会多个匿名内部类。否则没有。分析后认为,这个可能跟jvm 的关于innerclass的机制有关。java源文件的innerclass被编译后作为一个独立的class,是不能有private的Modifier的,否则将无法被outerclass(父类)存取。可能是安全上的考虑,在private innerclass的构造函数里,需要一个匿名类作参数,用来保护该内部类作为私有内部类的安全。