本文来自对《疯狂Java讲义》的理解
定义匿名内部类格式如下:
<span style="font-size:18px;">new 父类构造器(实参列表)|实现接口()
{
//匿名内部类的类体部分
}</span>
从上面定义可知,匿名内部类必须继承一个父类,或者实现一个接口,但最多只能继承一个父类或者实现一个接口。
创建匿名内部类的时候同时也创建了其对象,故匿名内部类不能是抽象类;
匿名内部类没有类名,不能定义构造器,但可以定义实例初始化块完成实例的初始化工作;
匿名内部类可以继承抽象父类,并实现抽象方法(必须)和重写方法等,也可以继承非抽象父类,然后重写其方法等。
<span style="font-size:18px;">//内部类的测试
interface Product{
public double getPrice();
public String getName();
}
abstract class Device{
private String name;
public abstract double getPrice();
public Device(){}
public Device(String name){
this.name =name;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
}
class Computer{
private double price =1.25;
private String name ="索尼";
public double getPrice(){
return this.price;
}
public String getName(){
return this.name;
}
}
public class AnonymousInner{
public void test1(Product p){
System.out.println("购买了一个产品:"+p.getName()+",花了"+p.getPrice());
}
public void test2(Device d ){
System.out.println("购买了一个设备:"+d.getName()+",花了"+d.getPrice());
}
public void test3(Computer c){
System.out.println("购买了一个电脑:"+c.getName()+",花了"+c.getPrice());
}
public static void main(String [] args){
AnonymousInner ai =new AnonymousInner();
//实现接口的方法
ai.test1(new Product(){
public double getPrice(){
return 10.5;
}
public String getName(){
return "产品1";
}
});
//实现抽象类的抽象方法
ai.test2(new Device("设备1"){
public double getPrice(){
return 15.5;
}
});
Device d =new Device(){
//添加初始化块
{
System.out.println("匿名类Device的初始化块");
}
//实现抽象类的抽象方法
public double getPrice(){
return 20.5;
}
//重写方法
public String getName(){
return "设备2";
}
};
ai.test2(d);
//继承普通类并重写方法
ai.test3(new Computer(){
public double getPrice(){
return super.getPrice()*5;
}
});
}
</span>
另外,如果匿名内部类需要访问外部类的局部变量,则必须使用final修饰符来修饰外部类的局部变量。