Java中的匿名内部类总结-阿里云开发者社区

开发者社区> thinkgamer.cn> 正文

Java中的匿名内部类总结

简介: 匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口   实例1:不使用匿名内部类来实现抽象方法 abstract class ...
+关注继续查看

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

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

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

 

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

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


运行结果:eat something

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

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

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

 

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

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


运行结果:eat something

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

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

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

 

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

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


运行结果:eat something

 

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

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

 

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

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

运行结果:1 2 3 4 5

 

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

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


运行结果:1 2 3 4 5

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java基础-18总结Map,HashMap,HashMap与Hashtable区别,Collections工具类
你需要的是什么,直接评论留言。 获取更多资源加微信公众号“Java帮帮” (是公众号,不是微信好友哦) 还有“Java帮帮”今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 1:Map(掌握) (1)将键映射到值的对象。一个映射不能包含重复的键;每个键最多只
2413 0
Java基础-23总结多线程,线程实现Runnable接口,线程名字获取和设置,线程控制,线程安全,同步线程
你需要的是什么,直接评论留言。 获取更多资源加微信公众号“Java帮帮” (是公众号,不是微信好友哦) 还有“Java帮帮”今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 1:多线程(理解) (1)多线程:一个应用程序有多条执行路径 进程:正
2757 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
5680 0
Java基础-10总结形式参数,包,修饰符,内部类
你需要的是什么,直接评论留言。 获取更多资源加微信公众号“Java帮帮” (是公众号,不是微信好友哦) 还有“Java帮帮”今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 类,抽象类,接口的综合小练习 /* 教练和运动员案例(学生分析然后讲解
1135 0
Java中的匿名内部类
通常通过继承某个类或实现某个接口的方式来编写代码,但是有时候某一些代码只使用一次,就没有必要写专门写一个子类或实现类了,可以采用匿名内部类的写法。最常用的场景是线程方面的应用。一、不使用匿名内部类 ①继承 abstract class Player {public abstract void play(); } public class FootBallPlayer extend
684 0
+关注
thinkgamer.cn
wechat 搜索【数据与算法联盟】,专注于云计算和算法,目前就职于京东
121
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载