匿名内部类的用法

很早就知道匿名内部类,但没去探究,后面也没用到,索性算个知识盲点,今天顺便研究下。匿名内部类,顾名思义,没有名字的内部类。

存在即合理,那匿名内部类的使用场景是什么呢,如果实现父类(或继承接口的)实现类只在业务中被调用一次,也即只使用一次,那么它的存在就是有点尴尬的,只为了一部分的要求而单独写个类这在工程上也不合理,那么此刻,为了解决这种尴尬,匿名内部类就被引入了。看个例子,加深理解吧。
使用匿名内部类之前:

//抽象父类
public abstract class Animal {
    public abstract void eat();
}  
//继承类
public class Dog extends Animal{
    public  void eat(){
        System.out.println("eat food");
    }
} 
//继承类的使用
public class Demo {
    public static void main(String[] args) {
        Person p = new Child();
        p.eat();
    }
} 

使用匿名内部类:

//抽象类
public abstract class Animal {
    public abstract void eat();
}
//匿名内部类使用
public class Demo {
    public static void main(String[] args) {
        Animal p = new Animal() {
        public void eat() {
            System.out.println("eat food");
        }
    };
    p.eat();
    }
}

使用时需要注意几点:

1.必须继承一个抽象类或实现一个接口,并且仅只能继承一个抽象类或实现一个接口。
2. 匿名内部类不是抽象的,所以需要实现接口或抽象类所有的抽象方法。
3. 不存在静态成员变量、静态方法、构造函数。

那么不存在构造函数,匿名内部类怎么传参呢?外面的参数是可以直接传进来的,匿名内部类是可以读取的,但是匿名内部类里对参数的改变并不会影响外部参数的改变,所以为了参数一致性,编译器要求传参定义为final类型。举个例子吧,还是刚才的代码,修改一下,如下:

public class Demo {
    public static void main(String[] args) {
        Demo demo = new Demo();
        demo.display("bone");
    }

    public void display(final String food){
        final String something="water";
        Animal p = new Animal() {
            public void eat() {
                System.out.println("dog eat "+food);
                System.out.println("dog drink "+something);
            }
        };
        p.eat();
    }
}

如果有考虑不全之处,欢迎评论斧正,相互交流,共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值