Java内部类的全限定名规律
成员内部类
测试结果表明,无论成员内部类是否为静态,其全限定名都使用如下命名方法:
包名.外部类名$内部类名
测试代码:
- package com.test;
- public class InnerClassTest {
- static class StaticInner{}
- class Inner{}
- public static void main(String[] args) {
- StaticInner si = new StaticInner();
- Inner in = new InnerClassTest().new Inner();
- System.out.println(si.getClass());
- System.out.println(in.getClass());
- }
- }
打印结果:
class com.test.InnerClassTest$StaticInner
class com.test.InnerClassTest$Inner
匿名内部类
匿名内部类的全限定名满足如下规律:
包名.外部类名$由1开始的正整数-按照类装载顺序依次排列
测试代码
- package com.test;
- public class InnerClassTest {
- static Object staticAnClass = new Object(){};
- static Object staticBlockAnClass;
- static {
- staticBlockAnClass = new Object(){};
- }
- Object anClass = new Object(){};
- Object blockAnClass;
- {
- blockAnClass = new Object(){};
- }
- public static void main(String[] args) {
- InnerClassTest functionClass = new InnerClassTest(){};
- System.out.println(staticAnClass.getClass());
- System.out.println(staticBlockAnClass.getClass());
- InnerClassTest test = new InnerClassTest();
- System.out.println(test.anClass.getClass());
- System.out.println(test.blockAnClass.getClass());
- System.out.println(functionClass.getClass());
- }
- }
class com.test.InnerClassTest$1
class com.test.InnerClassTest$2
class com.test.InnerClassTest$3
class com.test.InnerClassTest$4
class com.test.InnerClassTest$5
class com.test.InnerClassTest$2
class com.test.InnerClassTest$3
class com.test.InnerClassTest$4
class com.test.InnerClassTest$5
局部内部类
局部内部类全限定名使用如下命名方式:
包名.外部类名$由1开始的正整数后跟局部类名-其中数字部分是局部类在外部类上下文出现的先后顺序
测试代码
- package com.test;
- public class InnerClassTest {
- public static void main(String[] args) {
- functionA();
- functionB();
- }
- public static void functionA() {
- class Inner {};
- System.out.println(new Inner().getClass());
- }
- public static void functionB() {
- class Inner {};
- System.out.println(new Inner().getClass());
- }
- }
class com.test.InnerClassTest$1Inner
class com.test.InnerClassTest$2Inner
在测试代码的基础上在交换main中functionA、B位置后的结果:
class com.test.InnerClassTest$2Inner
class com.test.InnerClassTest$1Inner
在测试代码基础上交换functionA、B声明位置的结果:
class com.test.InnerClassTest$2Inner
class com.test.InnerClassTest$1Inner