0

0

匿名内部类精讲

高洛峰

高洛峰

发布时间:2016-12-15 12:25:20

|

1422人浏览过

|

来源于php中文网

原创

匿名内部类适合创建那种只需要一次使用的类,例如命令模式时所需要的command对象。匿名内部类的语法有点奇怪,创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。
定义匿名内部类的格式如下:

new 父类构造器(参数列表)|实现接口()  
{  
 //匿名内部类的类体部分  
}

从上面定义可以看出,匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口。
 关于匿名内部类还有如下两条规则:
 1)匿名内部类不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建内部类的对象。因此不允许将匿名内部类
 定义成抽象类。
 2)匿名内部类不等定义构造器,因为匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义实例初始化块,
 通过实例初始化块来完成构造器需要完成的事情。
 最常用的创建匿名内部类的方式是需要创建某个接口类型的对象,如下程序所示:

interface Product{  
   public double getPrice();  
   public String getName();  
}  
public class TestAnonymous{  
   public void test(Product p){  
   System.out.println("购买了一个"+p.getName()+",花掉       了"+p.getPrice());  
  }  
 public static void main(String[]args){  
    TestAnonymous ta = new TestAnonymous();  
    ta.test(new Product(){  
    public double getPrice(){  
       return 567;  
    }  
   public String getName(){  
      return "AGP显卡";  
   }  
  });  
 }  
}

上面程序中的TestAnonymous类定义了一个test方法,该方法需要一个Product对象作为参数,但Product只是一个接口,
无法直接创建对象,因此此处考虑创建一个Product接口实现类的对象传入该方法---如果这个Product接口实现类需要重复
使用,则应该经该实现类定义一个独立类;如果这个Product接口实现类只需一次使用,则可采用上面程序中的方式,定义
一个匿名内部类。
    正如上面程序中看到,定义匿名类不需要class关键字,而是在定义匿名内部类时直接生成该匿名内部类的对象。上面
粗体字代码部分就是匿名类的类体部分。
 由于匿名内部类不能是抽象类,所以匿名内部类必须实现它的抽象父类或者接口里包含的所有抽象方法。
 对于上面创建Product实现类对象的代码,可以拆分成如下代码:

class AnonymousProduct implements Product{  
  public double getPrice(){  
   return 567;  
    }  
  public String getName(){  
   return "AGP显卡";  
    }  
 }  
 ta.test(new AnonymousProduct());

当通过实现接口来创建匿名内部类时,匿名内部类也不能显示创建构造器,因此匿名内部类只有一个隐式的无参数构造
器,故new接口名后的括号里不能传入参数值。
    但如果通过继承父类来创建匿名内部类是,匿名内部类将拥有和父类相似的构造器,此处的相似指的是拥有相同的形参
列表。

abstract class Device{  
  private String name;  
  public Device(){  
  }  
  public Device(String name){  
   this.name = name;  
  }  
  public abstract double getPrice();  
  //此处省略了name属性的setter和getter方法  
 }  
 public class AnonymousInner{  
  public void test(Device d){  
   System.out.println("购买了一个"+d.getName()+",花掉了"+d.getPrice());  
  }  
  public static void main(String[] args){  
   AnonymousInner ai = new AnonymousInner();  
   //调用有参数的构造器创建Device匿名实现类的对象  
   ai.test(new Device("电子示波器"){  
    public double getPrice(){  
     return 67;  
    }  
   });  
   //调用无参数的构造器创建Device匿名实现类的对象  
   Device d = new Device(){  
    //初始化块  
    {  
     System.out.println("匿名内部类的初始化块...");  
    }  
    //实现抽象方法  
    public double getPrice(){  
     return 56;  
    }  
    public Sting getName(){  
     return "键盘";  
    }  
   };  
   ai.test(d);  
  }  
 }

上面程序创建了一个抽象父类Device,这个抽象父类里包含两个构造器:一个无参数的,一个有参数的。当创建以Device
为父类的匿名内部类时,即可以传入参数(如上面程序中第一段粗体字部分),也可以不传入参数(如上面程序中第二段粗体
字部分)。
 当创建匿名内部类时,必须实现接口或抽象父类里的所有抽象方法。如果有需要,也可以重写父类中的普通方法,如上面
程序的第二段粗体字代码部分,匿名内部类重写了抽象父类Device类的getName方法,其中getName方法并不是抽象方法。
    如果匿名内部类需要访问外部类的局部变量,则必须使用final修饰符来修饰外部类的局部变量,
否则系统将报错。

网钛淘拍CMS(TaoPaiCMS) V1.60
网钛淘拍CMS(TaoPaiCMS) V1.60

2013年07月06日 V1.60 升级包更新方式:admin文件夹改成你后台目录名,然后补丁包里的所有文件覆盖进去。1.[新增]后台引导页加入非IE浏览器提示,后台部分功能在非IE浏览器下可能没法使用2.[改进]淘客商品管理 首页 列表页 内容页 的下拉项加入颜色来区别不同项3.[改进]后台新增/修改淘客商品,增加淘宝字样的图标和天猫字样图标改成天猫logo图标4.[改进]为统一名称,“分类”改

下载
interface A{  
  void test();  
 }  
 public class TestA{  
  public static void main(Strign[] args){  
   int age = 0;  
   A a = new A(){  
    public void test(){  
     //下面语句将提示错误:匿名内部类内访问局部变量必须使用final修饰  
     System.out.println(age);  
    }   
   };  
  }  
 }

上面程序中粗体子代码是匿名内部类访问了外部类的局部变量,由于age变量没有使用final修饰符修饰,所以粗体字代码将
引起编译异常。

更多匿名内部类精讲相关文章请关注PHP中文网!

相关专题

更多
Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

11

2026.01.12

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

106

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

64

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

139

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.09

python学习网站
python学习网站

本专题整合了python学习相关推荐汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.09

俄罗斯手机浏览器地址汇总
俄罗斯手机浏览器地址汇总

汇总俄罗斯Yandex手机浏览器官方网址入口,涵盖国际版与俄语版,适配移动端访问,一键直达搜索、地图、新闻等核心服务。

93

2026.01.09

漫蛙稳定版地址大全
漫蛙稳定版地址大全

漫蛙稳定版地址大全汇总最新可用入口,包含漫蛙manwa漫画防走失官网链接,确保用户随时畅读海量正版漫画资源,建议收藏备用,避免因域名变动无法访问。

480

2026.01.09

php学习网站大全
php学习网站大全

精选多个优质PHP入门学习网站,涵盖教程、实战与文档,适合零基础到进阶开发者,助你高效掌握PHP编程。

52

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
php初学者入门课程
php初学者入门课程

共10课时 | 0.6万人学习

JavaScript基础精讲视频教程
JavaScript基础精讲视频教程

共36课时 | 8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号