设为首页收藏本站

IT技术擎 - 最棒的IT web技术交流社区

 找回密码
 注册为IT技术擎人

QQ登录

只需一步,快速开始

搜索
热搜: php h5 jquery
查看: 35|回复: 0

[基础教程] JAVA学习笔记--匿名内部类

[复制链接]

1万

主题

1万

帖子

3万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
35135
发表于 2018-2-1 21:25:30 | 显示全部楼层 |阅读模式
  匿名内部类,即没有名字的内部类。
  我们在编写JAVA程序时,往往要创建很多类,类是可以被重复使用的。但有时,我们创建了一个类,却只需要使用该类一次,那么单独为其编写一个类就显得有些麻烦,这时可以使用匿名内部类来编写这个类,匿名内部类只能使用一次。
· 匿名内部类没有名字,因而没有构造器;
· 使用匿名内部类有个前提条件:必须继承一个父类或实现一个接口。
匿名内部类可以通过以下语句来创建:
  new InterfaceName(){......};   
或 new SuperClassName(){......};  
{}中是匿名内部类的具体实现。
下面用几个例子来展示一下匿名内部类的使用
1)没有使用匿名内部类的普通方式:
  1. packagecom.tongye.anonymous;
  2. abstractclassBaseClass{abstractpublicvoidprintMessage();
  3. }
  4. classTestClass extendsBaseClass {publicvoidprintMessage(){ System.out.println("匿名内部类测试"); }
  5. }
  6. publicclassAnonymousClass {publicstaticvoidmain(String[] args){ TestClass testClass = newTestClass(); testClass.printMessage(); }
  7. }
  8. /*output:
  9. 匿名内部类测试
  10. */
复制代码
  本例没有使用匿名内部类,创建一个新的类继承了抽象类,并实现了抽象类的方法。显然,这个新类可以被重复调用,也可以被继承。
2)使用匿名内部类方式1
  1. packagecom.tongye.anonymous;
  2. abstractclassBaseClass{abstractpublicvoidprintMessage();
  3. }
  4. publicclassAnonymousClass {publicstaticvoidmain(String[] args){ BaseClass testClass = newBaseClass(){publicvoidprintMessage(){ System.out.println("匿名内部类测试"); } }; testClass.printMessage(); }
  5. }
  6. /*output:
  7. 匿名内部类测试
  8. */
复制代码
  这个例子看上去好像是通过 new 操作符创建了一个抽象类的实例。但我们知道,抽象类是不能通过new操作符来创建实例的,这其实是一个假象,而且和普通的类的实例化写法也不一样,后面有 {} 。这里其实是创建了一个匿名内部类,{}里面的部分就是匿名内部类的实现细节。这个匿名类继承了抽象类BaseClass,它实现了BaseClass抽象类的抽象方法,当然,还可以往里面添加自己的方法体。
3)使用匿名内部类方式2
  1. packagecom.tongye.anonymous;
  2. abstractclassBaseClass{abstractpublicvoidprintMessage();
  3. }
  4. publicclassAnonymousClass {publicBaseClass testClass(){ //创建一个BaseClass类型的方法testClass(),其返回值类型是BaseClass类型 returnnewBaseClass(){ //创建一个继承自BaseClass的匿名类的对象 publicvoidprintMessage(){ System.out.println("匿名内部类测试"); } }; }publicstaticvoidmain(String[] args){ AnonymousClass anonymous = newAnonymousClass(); anonymous.testClass().printMessage(); }
  5. }
  6. /*output:
  7. 匿名内部类测试
  8. */
复制代码
  这个例子也用到了匿名内部类,只是这里的实现方式与2)中的有些不一样。在本例中,先创建了一个BaseClass类型的方法testClass(),然后,方法 testClass()使用匿名内部类返回了一个实现了接口BaseClass的类的对象。匿名类的具体实现仍然是在{}中。
4)使用匿名内部类继承一个具有带参构造器的父类
  1. packagecom.tongye.anonymous;
  2. classBaseClass{privateintx;publicBaseClass(inti){ x =i; }publicvoidgetx(){ System.out.println(x); }
  3. }
  4. publicclassAnonymousClass {publicBaseClass baseClass(intx){ //创建一个BaseClass类型的方法baseClass(),其返回值类型是BaseClass类型 returnnewBaseClass(x){     //创建一个继承自BaseClass的匿名类的对象 publicvoidgetx(){ System.out.println("匿名类测试");super.getx(); } }; }publicstaticvoidmain(String[] args){ AnonymousClass anonymous = newAnonymousClass(); BaseClass baseClass = anonymous.baseClass(10); baseClass.getx(); }
  5. }
  6. /*output:
  7. 匿名内部类测试
  8. 10
  9. */
  10. <br>
复制代码
  如果一个匿名内部类继承了一个只含有带参构造函数的父类,则创建它的时候,必须带上这些参数,并且在实现的过程中使用super关键字调用相应的内容。尽管这里的BaseClass类是一个有具体实现的普通类,但是它还是被其导出类当做公共"接口”来使用。
  如果想要在匿名内部类使用一个在其外部定义的对象,则必须保证其参数是final的。
  匿名内部类与继承有些相似,但相对普通的继承而言,又有些限制。匿名内部类既可以扩展类,又可以实现接口,但是不能两者兼备;而且如果实现接口,也只能实现一个接口。
该用户未在地球留下任何的痕迹

本版积分规则

QQ|小黑屋|帮助|IT技术擎 ( 沪ICP备15054863号  

GMT+8, 2018-8-19 12:15

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表