匿名内部类一般用于比较简单,且仅在声明处使用一次的次,使用匿名类可以使代码更加简洁,又可以避免类名冲突。在你阅读Android代码中经常遇到,匿名类是基础中的基础,因此,很有必要了解它。
形式为:
new <类或接口> <类的主体>
实现方式:
1、继承一个类,重写其方法。
2、实现一个或者多个接口。
实例1:不使用匿名内部类来实现抽象方法
abstract class Animal{//抽象动物类
public abstract void eat();//抽象方法
}
class Dog extends Animal{//狗继承动物
public void eat(){//实现抽象方法
System.out.println("狗在吃屎。。。");
}
}
public class AnonymousClassDemo {
public static void main(String[] args) {
Animal dog=new Dog();//向上转型为Animal类的引用
dog.eat();
}
}
运行结果:
狗在吃屎。。。
可以看到,我们用Dog继承了Animal类,然后实现了Dog的一个实例,将其向上转型为Animal类的引用。
但是,如果此处的Dog类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?
这个时候就引入了匿名内部类。
实例2:使用匿名内部类来实现抽象方法
abstract class Animal{//抽象动物类
public abstract void eat();//抽象方法
}
public class AnonymousClassDemo{
public static void main(String[] args) {
Animal dog=new Animal(){//注意这里
public void eat(){
System.out.println("狗在吃屎。。。");
}
};//分号
dog.eat();
}
}
运行结果:
狗在吃屎。。。
可以看到,我们直接将抽象类Animal中的方法在大括号中实现了
这样便可以省略一个类的书写
并且,匿名内部类还能用于接口上
interface Animal{//动物接口
public abstract void eat();//抽象方法
}
public class AnonymousClassDemo{
public static void main(String[] args) {
Animal dog=new Animal(){//注意这里
public void eat(){
System.out.println("狗在吃屎。。。");
}
};//分号
dog.eat();
}
}
运行结果:
狗在吃屎。。。
由上面的例子可以看出,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现
最常用的情况就是在多线程的实现上,因为要 实现多线程必须继承Thread类或是继承Runnable接口
实例4:Thread类的匿名内部类实现
public class AnonymousClassDemo{
public static void main(String[] args) {
Thread thread=new Thread(){
public void run(){
for(int i=0;i<=9;i++){
System.out.println(i+" ");
}
}
};
thread.start();
}
}
运行结果:
0 1 2 3 4 5 6 7 8 9
实例5:Runnable接口的匿名内部类实现
public class AnonymousClassDemo{
public static void main(String[] args) {
Runnable r=new Runnable(){
public void run(){
for(int i=0;i<=9;i++){
System.out.print(i+" ");
}
}
};
Thread thread=new Thread(r);
thread.start();
}
}
运行结果:
0 1 2 3 4 5 6 7 8 9