匿名内部类由于没有名字,所以它的创建方式有点儿奇怪。创建格式如下:
[java] view plaincopyprint?
new
父类构造器(参数列表)|实现接口()
{
}
在这里我们看到使用匿名内部类我们必须要继承一个父类或者实现一个接口,当然也仅能只继承一个父类或者实现一个接口。同时它也是没有
class
关键字,这是因为匿名内部类是直接使用
new
来生成一个对象的引用。当然这个引用是隐式的。
[java] view plaincopyprint?
public
abstract
class
Bird {
private
String name;
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
public
abstract
int
fly();
}
public
class
Test {
public
void
test(Bird bird){
System.out.println(bird.getName() +
"能够飞 "
+ bird.fly() +
"米"
);
}
public
static
void
main(String[] args) {
Test test =
new
Test();
test.test(
new
Bird() {
public
int
fly() {
return
10000
;
}
public
String getName() {
return
"大雁"
;
}
});
}
}
------------------
Output:
大雁能够飞
10000
米
在Test类中,test()方法接受一个Bird类型的参数,同时我们知道一个抽象类是没有办法直接
new
的,我们必须要先有实现类才能
new
出来它的实现类实例。所以在mian方法中直接使用匿名内部类来创建一个Bird实例。
由于匿名内部类不能是抽象类,所以它必须要实现它的抽象父类或者接口里面所有的抽象方法。
对于这段匿名内部类代码其实是可以拆分为如下形式:
[java] view plaincopyprint?
public
class
WildGoose
extends
Bird{
public
int
fly() {
return
10000
;
}
public
String getName() {
return
"大雁"
;
}
}
WildGoose wildGoose =
new
WildGoose();
test.test(wildGoose);
在这里系统会创建一个继承自Bird类的匿名类的对象,该对象转型为对Bird类型的引用。
对于匿名内部类的使用它是存在一个缺陷的,就是它仅能被使用一次,创建匿名内部类时它会立即创建一个该类的实例,该类的定义会立即消失,所以匿名内部类是不能够被重复使用。对于上面的实例,如果我们需要对test()方法里面内部类进行多次使用,建议重新定义类,而不是使用匿名内部类。