Class Test {
 Outer$In in = new  Outer$In() ; //编译错误
}
 class Outer {
static class In {}
}因为看到不少文章都说内部类只是一个编译器的语法糖,jvm本身并不认识内部类。既然如此,为什么不能通过内部类的真实类名来访问呢?
这是否意味着内部类不仅仅是语法糖?

解决方案 »

  1.   


    如果内部类经过编译后也是变成一个普通类的话,那么我觉得直接用编译器给的名字Outer$In一样能访问这个类。但现实是不能这样访问,所以我觉得内部类中的class文件一定存在一个标识,标识这个类是内部类还是普通类。事实上,我对Outer$In进行javap反编译,看到常量池应用有一个innerclass的符号,我猜编译器可能在读取源码中看到Outer$In,然后读取Outer$In.class文件中看到了innerclass的标识,所以就拒绝了这种访问方式,不允许通过编译。
      

  2.   


    如果内部类经过编译后也是变成一个普通类的话,那么我觉得直接用编译器给的名字Outer$In一样能访问这个类。但现实是不能这样访问,所以我觉得内部类中的class文件一定存在一个标识,标识这个类是内部类还是普通类。事实上,我对Outer$In进行javap反编译,看到常量池应用有一个innerclass的符号,我猜编译器可能在读取源码中看到Outer$In,然后读取Outer$In.class文件中看到了innerclass的标识,所以就拒绝了这种访问方式,不允许通过编译。我觉得你把前后因果颠倒了。
    因为一个类是内部类,编译器才给他一个特别的名字 outerClass$InnerClass, 或者OuterClass$1(匿名内部类)。 而不是因为编译器给了他一个特别的名字才让这个类编程内部类。
      

  3.   


    如果内部类经过编译后也是变成一个普通类的话,那么我觉得直接用编译器给的名字Outer$In一样能访问这个类。但现实是不能这样访问,所以我觉得内部类中的class文件一定存在一个标识,标识这个类是内部类还是普通类。事实上,我对Outer$In进行javap反编译,看到常量池应用有一个innerclass的符号,我猜编译器可能在读取源码中看到Outer$In,然后读取Outer$In.class文件中看到了innerclass的标识,所以就拒绝了这种访问方式,不允许通过编译。我觉得你把前后因果颠倒了。
    因为一个类是内部类,编译器才给他一个特别的名字 outerClass$InnerClass, 或者OuterClass$1(匿名内部类)。 而不是因为编译器给了他一个特别的名字才让这个类编程内部类。
    如果内部类经过编译后也是变成一个普通类的话,那么我觉得直接用编译器给的名字Outer$In一样能访问这个类。但现实是不能这样访问,所以我觉得内部类中的class文件一定存在一个标识,标识这个类是内部类还是普通类。事实上,我对Outer$In进行javap反编译,看到常量池应用有一个innerclass的符号,我猜编译器可能在读取源码中看到Outer$In,然后读取Outer$In.class文件中看到了innerclass的标识,所以就拒绝了这种访问方式,不允许通过编译。我觉得你把前后因果颠倒了。
    因为一个类是内部类,编译器才给他一个特别的名字 outerClass$InnerClass, 或者OuterClass$1(匿名内部类)。 而不是因为编译器给了他一个特别的名字才让这个类编程内部类。 编译器在编译源代码的时候是根据语法辨别内部类,但编译成class文件后,其他文件访问这个内部类就不需要内部类所在的源代码了。那其他文件为什么无法直接通过内部类的类名来访问这个类呢?我觉得就是在内部类的class文件里面的有innerclass的标识导致的,所以编译器拒绝直接以真实类名来访问内部类。