首页 > 代码库 > 内部类
内部类
什么是内部类?
一个类的定义放在另一个类的定义内部,这个类这就是内部类。类名不需要和文件夹相同。
代码:
public class Outer { public class Inner { } }
编译后:
生成两个.class文件:Outer.class和Outer$Inner.class;因为是两个不同的类,所以内部类的成员变量和方法名可以和外部类相同。
Outer反编译代码1:
public class jichu.Outer { public jichu.Outer(); }
Outer反编译代码2:
public class Outer { public class Inner { public Inner() {} } }
Outer$Inner反编译代码1:
public class jichu.Outer$Inner { final jichu.Outer this$0; public jichu.Outer$Inner(jichu.Outer); }
Outer$Inner反编译代码2:
public class Outer$Inner { public Outer$Inner(Outer paramOuter) {} }
Outer$Inner反编译代码1中:
final jichu.Outer this$0;
this$0为外部类的引用。
public jichu.Outer$Inner(jichu.Outer);
这是编译器自动生成的构造器,参数为外部类对象,来建立外部类与内部类的联系。
内部类的分类
1、类级内部类(static修饰)、对象级内部类(没有static修饰)。
2、成员内部类(类中定义),静态内部类(类中定义)、局部内部类(方法中定义),匿名内部类(方法中定义)。
成员内部类(作为外部类的一个成员存在的类称为成员内部类)
1、内部类可直接使用外部类的私有成员变量或方法,外部类对内部类是可见的;
2、外部类中可以创建私有内部类对象。
3、外部类可通过内部类的对象调用内部类的私有成员变量或方法;
4、当内部类与外部类有同名成员变量和方法时,内部类可通过Outer.this方式来引用外部类成员。
5、必须先创建外部类才能创建内部类。
6、成员内部类不能含有static的变量和方法。因为成员内部类需要先创建外部类,才能创建它自己的。
详见成员内部类详解
局部内部类(定义在方法中的内部类)
1、内部类不能被public、private、static修饰;
2、在外部类中不能创建内部类的实例;
3、创建内部类的实例只能在包含他的方法中;
4、内部类访问包含他的方法中的变量必须有final修饰;
5、外部类不能访问局部内部类,只能在方法体中访问局部内部类,且访问必须在内部类定义之后。
6、可知局部内部类可随意访问外部类的成员变量和方法,即使是私有的。
7、内部类和外部类有同名变量和方法时,需要通过Outer.this方式来访问外部类成员变量或方法。
详见局部内部类详解
静态内部类(有static关键字修饰的内部类)
1、创建静态内部类方式:Outer.Inner inner = new Outer.Inner();静态内部类不依赖于外部类。
2、外部类可通过内部类的对象调用内部类的私有成员变量或方法。
3、静态内部类访问外部类的静态成员变量或方法必须是静态的。
4、静态内部类中可定义静态的成员变量和方法。
5、外部类可以创建静态内部类的实例,即使是私有的;并可通过内部类的实例访问内部类的成员变量和方法,即使是私有的。
详见静态内部类详解
匿名内部类(没有名字的内部类)
1、匿名内部类不能定义任何静态成员、方法。
2、匿名内部类中的方法不能是抽象的;
3、匿名内部类必须实现接口或抽象父类的所有抽象方法。
4、匿名内部类不能定义构造器;
5、匿名内部类访问的外部类成员变量或成员方法必须用static修饰;
6、内部类可以访问外部类私有变量和方法。
详见匿名内部类详解
内部类