说明
研究一下内部类,编译出来后的类名有什么规律
详细
内部类也是类,是个类就会有独立的class文件.可以看到,不管哪种内部类,文件名都有 $
符号. 所以, 凡是有$的class文件都是内部类
一共4种内部类
- 成员内部类(位于类中非静态)
- 静态内部类(位于勒种静态)
- 局部内部类(位于方法内,或者代码块内)
- 匿名内部类
1. 成员内部类 & 静态内部类
成员和静态内部类,生产的class文件名的规律是:
外部类名$内部类名.class
(这个规则就可保持不重名)
如:
- 成员内部类
package com.wyf.test.p01memberinner;
public class P01_01_Outer {
// 成员内部类,定义在类里面,非静态
public class MemberInner {
}
public class MemberInner2 {
}
}
生成的class是
P01_01_Outer.class
P01_01_Outer$MemberInner.class
P01_01_Outer$MemberInner2.class
- 静态内部类
package com.wyf.test.p02staticinner;
public class P02_01_Outer {
// 静态内部类,定义在类里,静态
public static class StaticInner {
}
public static class StaticInner2 {
}
}
生成的文件是:
P02_01_Outer.class
P02_01_Outer$StaticInner.class
P02_01_Outer$StaticInner2.class
2. 局部内部类
局部内部类的类定义在方法里,或者代码块里(可以非静态或静态代码块),命名的规律是:
外部类名$n内部类名.class
,其中n是1~n的整数.为什么需要n呢? 这样才能保证文件名唯一,因为在不同方法或代码块可以存在互相同名的局部内部类
package com.wyf.test.p03methodcodeblock;
public class P03_00_LocalInner {
public void m() {
class T {
}
class R {
}
}
public void m2() {
class T {
}
}
{
class X {
}
}
static {
class X {
}
}
}
P03_00_LocalInner.class
P03_00_LocalInner$1R.class
P03_00_LocalInner$1T.class
P03_00_LocalInner$1X.class
P03_00_LocalInner$2T.class
P03_00_LocalInner$2X.class
4. 匿名内部类
匿名内部类的class文件的命名:
外部类$n.class
,n是0-n的整数,同一个外部类中有多少个内部类,n就多少个
package com.wyf.test.p04anonymous;
public class P04_03_AnonymousInner {
MyInterface myInterface = new MyInterface() {
@Override
public void m() {
}
};
MyInterface myInterface2 = new MyInterface() {
@Override
public void m() {
}
};
public void m() {
MyInterface myInterface = new MyInterface() {
@Override
public void m() {
}
};
}
}
P04_03_AnonymousInner$1.class
P04_03_AnonymousInner$2.class
P04_03_AnonymousInner$3.class