java之内部类和匿名类

准确来说java的内部类具体可以细分成四大类:内部类、 static内部类、局部类、匿名类。

由于其中最主要用到的是内部类和匿名类,所以标题就取这两个。当然,后文中四类都会有介绍。

内部类

内部类(inner class)是在其他类中的类。

内部类的定义:

将类的定义class xxxx{} 置入一个类的内部即可编译器生成xxxx$xxxx这样的class文件内部类不能够与外部类同名

内部类的使用

在封装它的类的内部使用内部类,和普通类的使用方式相同在其他地方使用:


类名前要冠以外部类的名字 在用new创建内部类时,也要在new前面冠以对象变量 外部对象名.new 内部类名(参数)


在内部类中使用外部类的成员内部类中可以直接访问外部类的字段及方法


即使private也可以


如果内部类中有与外部类同名的字段或方法,则可以用:


外部类名.this.字段及方法


内部类的修饰符

内部类与类中的字段、方法一样也是外部类的成员,它前面也可以有访问控制符和其他修饰符访问控制符:public、protected,默认及private注意:外部类只能使用public修饰或默认


Final,abstract


static修饰符

用static修饰内部类,表名该内部类实际是一种外部类


因为它与外部类的实例无关 有人认为static的类是嵌套类(nested class),不是内部类(inner class)


Static类在使用时:1、实例化static类时,在new前面不需要使用对象实例变量2、Static类中不能访问其他外部类的非static的字段及方法,既只能访问static成员。3、Static方法中不能访问非static的域及方法,也不能够不带前缀地new一个非static的内部类

局部类

在一个方法中也可以定义类,这种类称为“方法中的内部类”或者叫局部类(local class)

使用局部类:1、同局部变量一样,方法中的内部类


不能够用public,private,protected,static修饰 但可以被final或者abstract修饰。


2、可以访问其外部类的成员3、不能够访问该方法的局部变量,除非是final局部变量

匿名类

匿名类(anonymous class)是一种特殊的内部类


它没有类名,在定义类的同时就生成该对象的一个实例 一次性使用的类


匿名类的使用

1、不起名字,直接使用父类或接口的名字。


也就是说,该类是父类的子类,或者实现的一个接口 编译器生成XXXXX$1之类的名字


2、类的定义的同时就创建实例,即类的定义前面有一个new


New 类名或接口名 不使用关键字class,也不使用extends及implements


3、在构造对象时使用父类构造方法


不能够定义构造方法,因为它没有名字 如果new对象时,要带参数,则使用父类的构造方法


匿名类的应用

用到界面的事件处理作为方法的参数(比较器)