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一般表示一个匿名内部类,但是我这里没有啊,怎么会多出这个文件呢?
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一般表示一个匿名内部类,但是我这里没有啊,怎么会多出这个文件呢?
第一,我的jdk是j2ee1.4.2的,这个肯定没问题
第二,这是我从书上找到的题,它的答案和我运行的结果一样。
为什么没有默认构造函数的时候,
生成的也是Outer$Inner.class
没有出现什么Outer$1.class!!
例如:new Outer().new Inner()编译后的jvm代码中就空调用一行Object.getClass(),返回的Object都创建了,它的class肯定已经被装载了,真是想不出有什么实际用处。倒是给反编译工具在反编译这段代码的时候做了个记号。
Inner class 前面加private的,就会多个匿名内部类。否则没有。分析后认为,这个可能跟jvm 的关于innerclass的机制有关。java源文件的innerclass被编译后作为一个独立的class,是不能有private的Modifier的,否则将无法被outerclass(父类)存取。可能是安全上的考虑,在private innerclass的构造函数里,需要一个匿名类作参数,用来保护该内部类作为私有内部类的安全。