java匿名内部类

匿名内部类:
可以使你的代码更加简洁,你可以在定义一个类的同时对其进行实例化。它与局部类很相似,不同的是它没有类名,如果某个局部类你只需要用一次,那么你就可以使用匿名内部类
内部类顾名思义是定义在一个类内部的类,而匿名内部类即为该内部类没有名字,类似于匿名对象,与之相同,匿名内部类也只能使用一次
格式:
类名 对象名 = new 类名(可以是抽象类也可以是接口){
重写其中的所有抽象方法
}
与匿名对象相似的是:匿名内部类省略实现类或者子类,而匿名对象省略了对象名称,其共同点是都只能使用唯一的一次
一般我们使用匿名内部类多是为了简化代码量,可以不用创建实现类或者抽象类的子类,然后直接使用。匿名内部类一般只能重写父类中的方法,不建议新定义方法,这样反而会增大代码量,匿名内部类是一种多态的用法,可以调用父类中的所有方法。
普通内部类如下:

public class InnerClass {
    public class sonClass{
        public void methodSon(){
            System.out.println("内部类的方法");
        }
    }
    public void methodMain(){
        System.out.println("外部类的方法");
        new sonClass().methodSon();
    }

    public static void main(String[] args) {
        new InnerClass().methodMain();
    }
}

此时可以通过外部类来访问内部类的方法,当我们查看生成的编译文件时我们会发现,文件名为:
InnerClasssonClass,如果我们创建的是一个匿名内部类,那么生成的文件名为:Class文件名sonClass,如果我们创建的是一个匿名内部类,那么生成的文件名为:Class文件名sonClassClass阿拉伯数字
匿名内部类如下:
此时我们生成了一个接口

public interface Blog {
    void run();
}

创建匿名内部类调用run方法

  new Blog(){
            @Override
            public void run() {
                System.out.println("正在跑步");
            }
        }.run();

此时我们可以调用接口中的run方法,输出正在跑步
实战实例:
利用Thread类进行演示

 Object obj = new Object();
        new Thread(){
            @Override
            public void run() {
                while (true){
                    synchronized (obj){
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName()+"  Hello");
                        try {
                            obj.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }.start();
        new Thread(){
            @Override
            public void run() {
                while (true){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (obj){
                        System.out.println(Thread.currentThread().getName()+"  World");
                        obj.notify();
                    }
                }
                }
        }.start();

此时利用了匿名内部类直接实现调用Threa类中的方法,循环输出HelloWorld字样。我们可以看出采用匿名内部类简化了代码,可以不用创建抽象类的子类进行实现,但是此时只能使用一次,如果需要再次使用,则必须再次创建一个匿名内部类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值