匿名内部类

来源:互联网 发布:python 数组加减 编辑:程序博客网 时间:2024/06/10 02:44

匿名内部类一般用于比较简单,且仅在声明处使用一次的次,使用匿名类可以使代码更加简洁,又可以避免类名冲突。在你阅读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中的方法在大括号中实现了
这样便可以省略一个类的书写
并且,匿名内部类还能用于接口上

实例3:在接口上使用匿名内部类
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