目录
5.1 创建内部类
5.2 成员内部类
5.3 匿名内部类
5.4 局部内部类
5.5 静态内部类
5.1 创建内部类
内部类就是在一个类的内部再定义一个类。内部类可以是静态的也可以用public、default
protected和private修饰,而外部类只能使用public和default修饰。
内部类只是一个概念,一旦编译成功,就会和外部类成为两个完全不同的类。所以内部类的成员变量、方法名可以和外部类相同。
实例:
public class OuterC {
public void showOuterC() {
System.out.println("这是外部类");
}
public class InnerC {
public void showInnerC() {
System.out.println("这是内部类");
}
}
}
public class Test {
public static void main(String[] args) {
OuterC.InnerC ic = new OuterC().new InnerC();
ic.showInnerC();
}
}
5.2 成员内部类
成员内部类是最普通的内部类,在成员内部类中可以访问外部类的全部成员。成员内部类的使用方法:
- 成员内部类定义在外部类的内部,相当于外部类的一个成员变量,成员内部类可以使用任意访问修饰符
- 成员内部类的方法可以直接访问外部类的所有数据,包括私有数据
- 定义了内部类后,就必须用外部类对象来创建内部类对象即:
内部类 对象名 = 外部类对象.new内部类();
- 成员内部类class文件格式为“外部类名$内部类名.class”
- 外部类不能直接使用内部类的方法和成员。可先创建内部类的对象,再通过内部类的对象来访问
- 如果外部类和内部类具有相同的成员变量和方法,内部类默认访问自己的成员变量和方法。如果内部类要访问外部类的成员变量和方法,可以使用this关键字(外部类名.this)
- 外部类的外部要声明完整,如外部类名.内部类名
实例:
public class Outer {
private int a = 100;
int b = 5;
public class Inner {
int b = 3;
public void test(){
System.out.println("访问外部类中的a:" + a);
System.out.println("访问外部类中的b:" + Outer.this.b);
}
}
public static void main(String[] args) {
Outer o = new Outer();
Inner i = o.new Inner();
i.test();
}
}
内部类访问外部类的变量b需要通过Outer.this.b
创建内部类对象需要通过外部类对象o实现,Inner i = o.new Inner();
5.3 匿名内部类
匿名内部类是没有名字的内部类,多用于关注实现而不关注类的名称。
实例:
button2.addActionListner(
new ActionListener() {
public void actionPerformed (ActionEvent e){
System.out.println("单机了button2");
}
});
本例中,为button2添加了一个事件监听器,addActionListener()方法的参数是一个匿名内部类。
匿名内部类是唯一没有构造器的类。大部分匿名内部类用于接口回调,命名时自动规范为Outter$1.class。一般来说,匿名内部类用于继承其他类或实现接口,不需要为它添加其他的方法。
5.4 局部内部类
局部内部类是作用域一个方法内或一个作用域内的类,它和成员内部类的区别在于,局部内部类只能访问方法内或作用域内。局部内部类,不能使用访问修饰符和static修饰符。
实例:(定义在方法内)
public class People {
public People(){
}
}
public class Man {
public Man(){
public People getWoman(){
class Woman extends People{
int age = 0;
}
return new Woman();
}
}
}
定义在作用域内:
public class Test {
private void internalTracking(boolean b) {
if(b) {
class TrackingSlip{
private String id;
TrackingSlip(String s) {
id = s;
}
String getSlip() {
return id;
}
}
TrackingSlip ts = new TrackingSlip("chenssy");
String string = ts.getSlip();
}
}
public void track() {
internalTracking(true);
}
public static void main(String[] args) {
Test t1 = new Test();
t1.track();
}
}
5.5 静态内部类
静态内部类也是定义在类中的类,不过加了一个static关键字。有如下特点:
- 静态内部类不能直接访问外部类的非静态成员,但可以通过“new 外部类().成员”的方式访问
- 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态名”访问外部类的静态成员
- 创建内部类中对象时,不需要外部类对象,可直接创建,格式为:内部类名 对象名 = new 内部类名()
实例:
public class Outer {
private int a = 100;
static int b = 5;
public static class Inner{
int b = 3;
public void test(){
System.out.println("外部类的b:" + Outer.b);
System.out.println("内部类的b:" + b);
System.out.println("外部类的非静态变量a:" + new Outer().a);
}
}
public static void main(String[] args) {
Inner inner = new Inner();
inner.test();
}
}