特点
- 是没有名称的内部类,没有办法引用它们。必须在创建时,用new语句的一部分来声明并创建他们的实例
- 必须继承一个类(抽象的,非抽象的都可以)或者实现一个接口。如果父类或接口是抽象类,匿名内部类必须实现其所有的抽象方法
- 在匿名内部类中可以定义代码块,用于实例的初始化,但是不能定义静态代码块
语法
- new interface/ superclass(){ 类体 }
- 这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展。或者实现一个给定的接口,并同时创建该匿名类的一个新的实例
应用
public class AnonymousInner {
public static void main(String[] args) {
Person p=new Person();
//如果dog对象我们只使用一下下,那么给他创建一个引用是划不来的
/* Animal dog=new Dog();
p.feed(dog);*/
//使用匿名内部类,创建Animal的子类对象,直接在子对象中实现需要的方法
p.feed(new Animal(){
public void eat(){
System.out.println("eating bones");
}
});
//多次调用匿名内部类的话把匿名内部类对象赋值给引用变量
Animal cat=new Animal(){
public void eat(){
System.out.println("eating fish");
}
};
p.feed(cat);
//匿名内部类对象可以调用自身的方法,
//下面的代码除了实现父类Animal的eat方法,还拥有自己的show方法,在创建了之后,就可以直接调用。
new Animal(){
private String name="cat";
//匿名内部类可以有非静态代码块
{
name="Tiger";
}
public void eat(){
System.out.println("eating fish");
}
public void show(){
System.out.println(name);
}
}.show();
}
}
class Person{
public void feed(Animal animal){
animal.eat();
}
}
abstract class Animal{
public abstract void eat();
}
//使用了匿名内部类,这个子类也就没有必要单独建了,
//如果子类只使用一次,建议不要创建子类,而是通过匿名内部类实现父类或接口的方法来完成。
/*class Dog extends Animal{
public void eat(){
System.out.println("eating bones");
}
}*/