在撰写Java程序时,经常会有临时继承某个类或操作某个接口并建立实例的需求。由于这类子类或接口操作类只使用一次,不需要为这些类定义名称,这时可以使用匿名内部类(Anonymous Inner Class)来解决这个需求。匿名内部类的语法为:
new 父类() | 接口(){
//类本体操作
}
以继承Object重新定义toString()方法为例:
Object o = new Object(){
@override
public String toString(){
return "just for testing."
}
}
如果是操作某个接口,例如若Some接口定义了doService()方法,要建立匿名类实例,可以如下:
Some some = new Some(){
public void doService(){
System.out.println("do something.");
}
}
匿名类的使用主要是用在继承的子类或实现的接口只使用一次的情况,因此我们没有必要为了使用该子类而去重新定义一个完整的类。比如我们在程序中要使用Some类作为父类,但是其子类只使用一次,完整定义一个子类如下:
public class Other extends Some{
…………
}
然后再利用新生成的子类去新建一个对象
Other other = new Other();
新建完对象后就再也不会用到Other类了,因此我们使用匿名类来简化这一过程,将新建类和新建对象合在一起操作。同时,因为我们新建的类没有名称,所以在新建对象时是用父类的名称,如下:
Some some = new Some(){
…………
}
我们要对Other子类新增的功能或者对父类Some重新定义的行为就直接在新建对象的时候完成。
内部类就是指一个类定义在另一个类的内部,从而成为外部类的一个成员。因此一个类中可以有成员变量、方法,还可以有内部类。实际上Java的内部类可以被称为成员类,内部类实际上是它所在类的成员。所以内部类也就具有和成员变量、成员方法相同的性质。比如,成员方法可以访问私有变量,那么成员类也可以访问私有变量了。也就是说,成员类中的成员方法都可以访问成员类所在类的私有变量。内部类最重要的特点就是能够访问外部类的所有成员。