含义:
由于Java中接口和抽象类都不能实例化对象,故使用接口或抽象类时,必须有一个实现类(对应接口)或继承类(对应抽象类)。而该实现类或继承类的对象被使用次数很少,不值得去专门编码时候,就可以使用匿名内部类,此时该类不必命名,并且对象只被创建一次。即匿名内部类的实质是:一个重写或实现了父类或接口的子类对象。
格式:
new 抽象类/接口(){
匿名内部类类体部分;
}
用法:
(1)接口或抽象类的使用,省略掉特意书写一个类去实现这个接口或抽象类的方法,直接在实例化的时候就写好这个方法。
接口使用匿名内部类:
//定义Animal接口,包含抽象方法jump()
public interface Animal {
public abstract void jump();
}
public static void main(String [] args){
Animal a = new Animal(){
public void jump() {
System.out.println("测试--接口用匿名内部类");
}
};
}
上述代码中,首先定义了接口Animal,在使用接口时,省略了单独书写接口的实现类,直接在实例化该实现类的时候,重写接口中的抽象方法,并且该实现类没有名称,为匿名内部类。
抽象类使用匿名内部类:
//定义Animal抽象类,包含抽象方法jump()
public abstract class Animal {
public abstract void jump();
}
public static void main(String [] args){
Animal a = new Animal(){
public void jump() {
System.out.println("测试--接口用匿名内部类");
}
};
}
上述代码中,首先定义了抽象类Animal,在使用抽象类时,省略了单独书写抽象类的继承类,直接在实例化该继承类的时候,重写抽象类中的抽象方法,并且该继承类没有名称,为匿名内部类。
(2)当接口或抽象类类型的引用数据类型作为参数在方法中,可以直接使用匿名内部类的方式创建相应的对象。
//定义接口Shout,包含两个抽象方法shout1()和shout2()
interface Shout{
void shout1();
void shout2();
}
//测试类中定义静态方法test(),其中方法的参数类型是接口类型
public static void test(Shout a){
a.shout1();
a.shout2();
}
//在主函数中调用静态方法test()
public static void main(String [] args){
test(new Shout(){
public void shout1() {
System.out.println("测试--shout1");
}
public void shout2() {
System.out.println("测试--shout2");
}
});
}
上述代码中,首先定义了接口Shout,并且包含两个抽象方法。在测试类中定义一个静态方法,该静态方法的参数是接口类型的引用数据类型。在主函数中,调用该静态方法,方法的参数必须是该接口的实现类的对象,此处省略掉书写该接口的实现类,使用匿名内部类,直接new一个接口的匿名内部类对象。
总结:
匿名内部类的本质是抽象类或接口的继承类或实现类,即匿名内部类必须继承一个抽象类或实现一个接口,并且只能继承一个抽象类或实现一个抽象类。