浅谈匿名内部类

来源:互联网 发布:海地软件 编辑:程序博客网 时间:2024/06/14 21:41

一、什么是匿名内部类
匿名内部类,顾名思义,就是没有名字的内部类
二、为什么需要匿名内部类
我们先看一个不使用内部类的例子

abstract class Animal{    abstract void sound();// 定义一个抽象方法,代表动物会叫}class Dog extends Animal{    void sound(){        System.out.println("汪汪");    }}public class Demo{    public static void main(String[] args) {        Animal a = new Dog();        a.sound();    }}

这里我们想使用Animal中的sound,就必须再写一个类去实现它。
但是如果Dog只使用一次,是不是创建一个类很麻烦?于是就有了匿名内部类。
匿名内部类的格式如下

new 父类构造器(参数列表) | 实现接口 (){    //匿名内部类的实体部分}

所以我们可以把上面的代码写成:

abstract class Animal{    abstract void sound();}public class Demo_Anonymous {    public static void main(String[] args) {        Animal a = new Animal(){            void sound(){                System.out.println("汪汪");            }        };        a.sound();    }}

这段代码和第一段代码的效果一模一样,我们可以看出,在匿名内部类中,对内部类没有class关键字,并且这个内部类也没有名字,那段 new Animal(){ } ,其实就相当于 new Dog();Animal代表了这个无名的类的父类是谁?在Animal()后面的大括号里面实现了Animal中的抽象方法,new Animal(){ }会生成一个对象的引用,这个引用是隐式的,这个对象就是Animal的子类的实例,只不过这个子类没有名字。
所以匿名内部类可以简化代码的编写
通过上面的例子,我们对匿名内部类应该有一个大致的了解,下来我们看一下何时需要使用内部类
① 只用到类的一个实例【因为创建一个匿名内部类时,会立即创建一个类的实例,这个类的定义会立即消失,就相当第一个例子创建Dog类的实例后Dog类的定义会消失】
② 类在定义后马上用到
③ 类非常小
那么我们在使用匿名内部类时,应该遵循什么原则呢?
① 匿名内部类不能有构造方法,因为匿名内部类没有类名,所以无法定义构造器
② 匿名内部类中不能定义任何静态成员、方法和类
③ 匿名内部类不能是抽象的,因为系统在创建匿名内部类时,会立即生成内部类对象,所以不能定义为抽象的
④ 使用匿名内部类时,我们必须继承一个类或者实现一个接口
⑤ 匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效

0 0
原创粉丝点击