1、局部类
在一个方法中定义的类称为方法中的内部类,或者叫做局部类(local class)。
示例:Ex5_TestInnerInMethod.java
方法中的内部类
public class Ex5_TestInnerInMethod {
public static void main(String[] args) {
Object obj = new Outer().makeTheInner(47);
System.out.println("Hello World!\n" + obj.toString());
}
}
class Outer{
private int size = 5;
public Object makeTheInner(int localVar) {
final int finalLocalVar = 99;
class Inner{
public String toString() {
return ("InnerSize:" + size + "\n" +
//"localVar:" + localVar + //Error!
"finalLocalVar:" + finalLocalVar);
}
}
return new Inner();
}
}
运行结果:
Hello World!
InnerSize:5
finalLocalVar:99
在方法中定义内部类时,需要注意以下几点:
- 同局部变量一样,方法中的内部类前面不能用 public,private,protected 修饰,也不能用 static 修饰,但可以被 final 或abstract 修饰;
- 方法中的内部类,可以访问其外部类的成员;若是 static 方法中的内部类,可以访问外部类的 static 成员;
- 方法中的内部类中,不能访问该方法的局部变量,除非是 final 的局部变量或 final 的参变量;
- 方法中定义的类,在其它地方引用时,没有类的名字,只能用其父类来引用这样的变量。
2、匿名类
在类或者方法中,定义一种不取名字,且在定义的同时new
一个对象,这种类称为匿名类。
匿名类的特点:
- 这种类不取类名,而直接用其父类或者它所实现的接口的名字;
- 类的定义与创建与创建该类的一个实例同时进行,即类的定义前面有一个
new
,不使用关键字class
,同时带上()
表示创建对象,即定义方法为:
new 类名或接口名 () {...}
- 类名前面不能有修饰符;
- 类中不能定义构造方法,因为它没有名字。在构造对象时,使用父类的构造方法,如果实现接口,则接口名后的圆括号不能带参数。
示例:Ex5_TestInnerAnonymous.java
将上面的类改写为匿名类
public class Ex5_TestInnerAnonymous {
public static void main(String[] args) {
Object obj = new Outer().makeTheInner(47);
System.out.println("Hello World!\n" + obj.toString());
}
}
class Outer{
private int size = 5;
public Object makeTheInner(int localVar) {
final int finalLocalVar = 99;
return new Object() {
public String toString() {
return ("InnerSize:" + size + "\n" +
"finalLocalVar:" + finalLocalVar);
}
};
}
}
匿名类可以简化程序的书写,主要使用在那些需要扩展某个类或实现某个接口做参数的地方,在图形化界面与事件监听时,会大量用到匿名类。
内容摘自:《Java程序设计》唐大仕编著