微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于Java中的匿名内部类

匿名内部类

1.概述

匿名内部类:

  • 本质上是一个没有名字的局部内部类,定义在方法中、代码块中等
  • 作用:方便创建子类对象,最终目的是为了简化代码编写

格式:

new|抽象类名|接口名(){
	重写方法;
};
Employee a = new Employee(){
	public void work(){
		System.out.println("好好工作");
	}
}
a.work();

需求:

开发一个动物园的动物表演方法,要求有各种各样的动物在表演。

  • 不采用匿名内部类

代码演示

public class Test {
    public static void main(String[] args) {

        Animal a = new Tiger();  //使用多态形式 惯用写法

        a.run();   //编译看左边 运行看右边
    }
}

//定义一个实现类 也就是子类  这是采用常规做法
class Tiger implements Animal{

    @Override
    public void run() {
        System.out.println("开始");
        System.out.println("老虎跑的很快");
        System.out.println("结束");
    }
}

 interface Animal{

    public void run();
}

说明

上述代码中,我们没有采用匿名内部类,首先声明一个动物的接口,里面有run方法,然后接着定义了一个Tiger实现类去实现Animal接口,重写run方法,然后在主方法调用并执行。

  • 采用匿名内部类

代码演示

public class Test {
    public static void main(String[] args) {

        Animal a = new Animal(){

            @Override
            public void run() {
                System.out.println("开始");
                System.out.println("老虎跑的很快");
                System.out.println("结束");
            }
        };  //使用多态形式 惯用写法

        a.run();   //编译看左边 运行看右边
    }
}

interface Animal{

    public void run();
}

说明

还是上面的代码,这里我们不用再定义一个子类去实现Animal接口,而是直接采用匿名内部类的形式,这里的 new Animal(){}

整体就是一个匿名内部类,因为有new关键字,所以实际上这里产生了匿名内部类的一个对象,该对象的类型相当于是当前new的那个类型的子类类型。

其实,上面的代码还可以写成这样:

public class Test {
    public static void main(String[] args) {

        Animal s = new Animal() {
            @Override
            public void run() {
                System.out.println("老虎跑的很快");
            }
        };
        
        go(s);  

    }
    
    System.out.println("-----------------");
    

    public static void go(Animal a){
        System.out.println("开始跑步");
        a.run();
        System.out.println("结束跑步");
    }
}

interface Animal{

    public void run();
}
 //新来一个对象狮子的时候 直接采用下面这个语句 更加简洁
     go(new Animal() {
            @Override
            public void run() {
                System.out.println("狮子跑的也很快");
            }
        });

代码执行流程:

首先,new Animal() {} 相当于是创建了一个对象,把这个对象的地址交给s,后面调用类中的静态方法go,进到go方法里边,在go里面调用重写的run方法,这里用到了一个机制,叫做 对象回调机制

2.匿名内部类特点

  • 匿名内部类是一个没有名字的内部类
  • 匿名内部类写出来就会产生一个匿名内部类的对象
  • 匿名内部类的对象类型相当于是当前new的那个类型的子类类型

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐