为何在循环内定义内部类时Java编译器不报错重复类?
为什么循环内定义同名内部类不会报重复类错误?
首先要明确:循环里每次定义的InnerClass,是属于当前迭代的局部作用域的,就像你在循环里每次定义的局部变量int temp = i;,每次循环的temp都是独立的,互相不干扰。
具体原因有两点:
- 作用域隔离:每个循环迭代的代码块是独立的局部作用域,在这个作用域里定义的内部类,只能在当前迭代的代码块内被访问。下一次迭代的
InnerClass是另一个作用域里的全新类,两者完全没有命名冲突的基础。 - 字节码唯一命名:Java编译器在编译时,会给这些局部内部类生成唯一的字节码文件名。比如假设外部类叫
Outer,第一次循环的内部类会被命名为Outer$1InnerClass,第二次是Outer$2InnerClass,字节码层面完全不会重复。
而你以为的等价代码(直接定义两个同名类),是在同一个全局/包作用域下定义的,两个类的作用域重叠,编译器自然会报“重复类”的错误——这和循环内的情况本质上是作用域的区别,完全不是一回事。
内容的提问来源于stack exchange,提问作者Mehdi Rahimi
相关产品推荐
相关产品推荐

