当前位置: 首页 > news >正文

【Java基础】5、java中的匿名内部类

匿名内部类也就是没有名字的内部类

正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写

但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口

 

实例1:使用匿名内部类来实现抽象方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
abstract  class  Person {
     public  abstract  void  eat();
}
 
class  Child  extends  Person {
     public  void  eat() {
         System.out.println( "eat something" );
     }
}
 
public  class  Demo {
     public  static  void  main(String[] args) {
         Person p =  new  Child();
         p.eat();
     }
}

运行结果:eat something

可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用

但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?

这个时候就引入了匿名内部类

 

实例2:匿名内部类的基本实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
abstract  class  Person {
     public  abstract  void  eat();
}
 
public  class  Demo {
     public  static  void  main(String[] args) {
         Person p =  new  Person() {
             public  void  eat() {
                 System.out.println( "eat something" );
             }
         };
         p.eat();
     }
}

运行结果:eat something

可以看到,我们直接将抽象类Person中的方法在大括号中实现了

这样便可以省略一个类的书写

并且,匿名内部类还能用于接口上

 

实例3:在接口上使用匿名内部类

interface  Person {
     public  void  eat();
}
 
public  class  Demo {
     public  static  void  main(String[] args) {
         Person p = new  Person() {
             public  void  eat() {
                 System.out.println( "eat something" );
             }
         };
         p.eat();
     }
}

运行结果:eat something

 

由上面的例子可以看出,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现

最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口

 

实例4:Thread类的匿名内部类实现

public  class  Demo {
     public  static  void  main(String[] args) {
         new  Thread() {
             public  void  run() {
                 for  ( int  i = 1 ; i <= 5 ; i++) {
                     System.out.print(i + " " );
                 }
             }
         }.start();
     }
}

运行结果:1 2 3 4 5

 

实例5:Runnable接口的匿名内部类实现

1
2
3
4
5
6
7
8
9
10
11
12
13
public  class  Demo {
     public  static  void  main(String[] args) {
         Runnable r =  new  Runnable() {
             public  void  run() {
                 for  ( int  i =  1 ; i <=  5 ; i++) {
                     System.out.print(i +  " " );
                 }
             }
         };
         Thread t =  new  Thread(r);
         t.start();
     }
}

 

其实还可以写的更精简一些

    public static void main(String[] args) {
        new Thread(new Runnable() {
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.print(i + " ");
                }
            }
        }).start();
    }

 

运行结果:1 2 3 4 5

相关文章:

  • Android textview及其子类
  • 正则表达式匹配IP和月日
  • Oracle 快速插入1000万条数据的实现方式
  • Fedora 25上安装微软SQL Server过程
  • Nginx 和 PHP 的两种部署方式比较
  • MVVM 简介
  • Android支付宝SDK开发笔记
  • Future模式-多任务并行汇总 or 同步任务回调
  • mysql组内排序取最大值
  • 科学家制作“更绿”香草
  • Advanced Auto Layout:Programmatically Creating Constraints
  • JavaScript中基本数据类型和引用数据类型的区别
  • 人类的情感需要与未来私人机器人助理
  • Linux后台研发超实用命令总结
  • 《转》python学习(5)--数据类型
  • __proto__ 和 prototype的关系
  • canvas 绘制双线技巧
  • chrome扩展demo1-小时钟
  • js面向对象
  • Linux gpio口使用方法
  • MySQL QA
  • PHP 小技巧
  • Python语法速览与机器学习开发环境搭建
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 消息队列系列二(IOT中消息队列的应用)
  • 一份游戏开发学习路线
  • 一个完整Java Web项目背后的密码
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 阿里云ACE认证之理解CDN技术
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 数据库巡检项
  • (1)Nginx简介和安装教程
  • (30)数组元素和与数字和的绝对差
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (办公)springboot配置aop处理请求.
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (一)Dubbo快速入门、介绍、使用
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .Net程序帮助文档制作
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • [ 数据结构 - C++] AVL树原理及实现
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [BZOJ3757] 苹果树
  • [BZOJ4016][FJOI2014]最短路径树问题
  • [C++] new和delete
  • [CareerCup][Google Interview] 实现一个具有get_min的Queue
  • [Django开源学习 1]django-vue-admin
  • [IE编程] 如何在IE8 下调试BHO控件/工具栏(调试Tab进程)