浅谈匿名内部类

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

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类的定义会消失】
② 类在定义后马上用到
③ 类非常小
那么我们在使用匿名内部类时,应该遵循什么原则呢?
① 匿名内部类不能有构造方法,因为匿名内部类没有类名,所以无法定义构造器
② 匿名内部类中不能定义任何静态成员、方法和类
③ 匿名内部类不能是抽象的,因为系统在创建匿名内部类时,会立即生成内部类对象,所以不能定义为抽象的
④ 使用匿名内部类时,我们必须继承一个类或者实现一个接口
⑤ 匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

趣谈编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值