示例一:

  1. package com;  
  2.   
  3. interface Operation {  
  4.     double operateTwoIntNum(int a, int b);  
  5. }  
  6.   
  7. public class InnerClassTest {  
  8.   
  9.     /** 
  10.      * 加法 
  11.      */  
  12.     public static double add(int a, int b) {  
  13.         /** 
  14.          * 匿名内部类实现加法 
  15.          */  
  16.         double c = new Operation() {  
  17.   
  18.             @Override  
  19.             public double operateTwoIntNum(int a, int b) {  
  20.   
  21.                 return a + b;  
  22.             }  
  23.         }.operateTwoIntNum(a, b);  
  24.         return c;  
  25.     }  
  26.   
  27.     /** 
  28.      * 减法 
  29.      * @param a 
  30.      * @param b 
  31.      * @return 
  32.      */  
  33.     public static double subtract(int a, int b) {  
  34.         /** 
  35.          * 匿名内部类实现加法 
  36.          */  
  37.         double c = new Operation() {  
  38.   
  39.             @Override  
  40.             public double operateTwoIntNum(int a, int b) {  
  41.                 // TODO Auto-generated method stub  
  42.                 return a - b;  
  43.             }  
  44.         }.operateTwoIntNum(a, b);  
  45.         return c;  
  46.     }  
  47.   
  48.     public static void main(String[] args) {  
  49.        System.out.println(add(, ));  
  50.        System.out.println(subtract(, ));  
  51.     }  
  52. }  
package com;

interface Operation {
double operateTwoIntNum(int a, int b);
} public class InnerClassTest { /**
* 加法
*/
public static double add(int a, int b) {
/**
* 匿名内部类实现加法
*/
double c = new Operation() { @Override
public double operateTwoIntNum(int a, int b) { return a + b;
}
}.operateTwoIntNum(a, b);
return c;
} /**
* 减法
* @param a
* @param b
* @return
*/
public static double subtract(int a, int b) {
/**
* 匿名内部类实现加法
*/
double c = new Operation() { @Override
public double operateTwoIntNum(int a, int b) {
// TODO Auto-generated method stub
return a - b;
}
}.operateTwoIntNum(a, b);
return c;
} public static void main(String[] args) {
System.out.println(add(10, 3));
System.out.println(subtract(10, 3));
}
}

示例二:
这是我们工程中匿名内部类在分页方法中的运用,动态拼接分页链接地址:

  1. public interface LinkBuilder {  
  2.     public StringBuffer getPagerUrl();  
  3.     //public void setPage(int page);  
  4.       
  5.     public StringBuffer getPageUrl(int page);  
  6. }  
  7.   
  8.   
  9. public abstract class AbstractLinkBuilder implements LinkBuilder {  
  10.   
  11.     @Override  
  12.     public final StringBuffer getPageUrl(int page) {  
  13.         StringBuffer url = new StringBuffer(XssFilterService.dhtmlSpecialchars(  
  14.                 this.getPagerUrl(), true));  
  15.         if (url.toString().indexOf("?") > ) {  
  16.             url.append("&");  
  17.         } else {  
  18.             url.append("?");  
  19.         }  
  20.         url.append("page=").append(page);  
  21.         return url;  
  22.     }  
  23.   
  24. }  
  25.   
  26.   
  27.     Pager pager = Pager.register("newPagerWidget",new AbstractLinkBuilder() {@Override  
  28.                         public StringBuffer getPagerUrl() {  
  29.                             StringBuffer url = null;  
  30.                             if (queryAgentStore != null) {  
  31.   
  32.                                 url = new StringBuffer("agentstorelist.html?");  
  33.                                 if (StringUtils.isNotBlank(queryAgentStore  
  34.                                         .getStoreName()))// 店铺关键字  
  35.                                 {  
  36.                                     url.append("&queryAgentStore.storeName="+ XssFilterService.dhtmlSpecialchars(queryAgentStore.getStoreName()));  
  37.                                 }  
  38.                                 if (queryAgentStore.getCity()!=null)// 城市编码  
  39.                                 {  
  40.                                     url.append("&queryAgentStore.city="+ queryAgentStore.getCity());  
  41.                                 }  
  42.                                 if(orderByClause!=null&&!"".equals(orderByClause))  
  43.                                 {  
  44.                                     url.append("&orderByClause="+orderByClause);  
  45.                                 }  
  46.                             } else {  
  47.                                 url = new StringBuffer("agentstorelist.html");  
  48.                             }  
  49.                             return url;  
  50.                         }  
  51.   
  52.                     }, request);  
  53.   
  54. public class Pager  
  55. {  
  56. public Pager(LinkBuilder builder) {  
  57.         this.linkBuilder = builder;  
  58.     }  
  59. public String getUrl(int page) {  
  60.         return staticTool.process(this.linkBuilder.getPageUrl(page).toString());  
  61.     }  
  62.   
  63. }  
public interface LinkBuilder {
public StringBuffer getPagerUrl();
//public void setPage(int page); public StringBuffer getPageUrl(int page);
} public abstract class AbstractLinkBuilder implements LinkBuilder { @Override
public final StringBuffer getPageUrl(int page) {
StringBuffer url = new StringBuffer(XssFilterService.dhtmlSpecialchars(
this.getPagerUrl(), true));
if (url.toString().indexOf("?") > 0) {
url.append("&");
} else {
url.append("?");
}
url.append("page=").append(page);
return url;
} } Pager pager = Pager.register("newPagerWidget",new AbstractLinkBuilder() {@Override
public StringBuffer getPagerUrl() {
StringBuffer url = null;
if (queryAgentStore != null) { url = new StringBuffer("agentstorelist.html?");
if (StringUtils.isNotBlank(queryAgentStore
.getStoreName()))// 店铺关键字
{
url.append("&queryAgentStore.storeName="+ XssFilterService.dhtmlSpecialchars(queryAgentStore.getStoreName()));
}
if (queryAgentStore.getCity()!=null)// 城市编码
{
url.append("&queryAgentStore.city="+ queryAgentStore.getCity());
}
if(orderByClause!=null&&!"".equals(orderByClause))
{
url.append("&orderByClause="+orderByClause);
}
} else {
url = new StringBuffer("agentstorelist.html");
}
return url;
} }, request); public class Pager
{
public Pager(LinkBuilder builder) {
this.linkBuilder = builder;
}
public String getUrl(int page) {
return staticTool.process(this.linkBuilder.getPageUrl(page).toString());
} }

示例三:
上篇博客中用策略模式改善dao层代码中有使用。

声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
 
返回顶楼
 
  • feiyu86
  • 等级: 初级会员
  • 性别:
  • 文章: 58
  • 积分: 0
  • 来自: 上海
   发表时间:2011-11-19  
 
刚好也不是太了解什么场景下应该使用匿名内部类,正好可以学习下,加深一下了解!
返回顶楼
0 0 请登录后投票
 
  • kidneyball
  • 等级:
  • 性别:
  • 文章: 354
  • 积分: 150
  • 来自: 南太平洋
   发表时间:2011-11-21   最后修改:2011-11-21
 
在java8出来之前,内部类最本质的作用是可以访问外部对象的状态和外部方法的final变量。换言之,模拟闭包。
其它特性都是单纯节省代码量,只有这个作用是暂时无法替代的。
返回顶楼
1 0 请登录后投票
 
  • sxpyrgz
  • 等级: 初级会员
  • 性别:
  • 文章: 59
  • 积分: 70
  • 来自: 北京
   发表时间:2011-11-21  
 
如果看一下,SWING的各中事件管理,你就OK了
返回顶楼
0 0 请登录后投票
 
  • 黑白两相望
  • 等级: 初级会员
  • 性别:
  • 文章: 372
  • 积分: 70
  • 来自: 上海
   发表时间:2011-11-21  
 
kidneyball 写道
在java8出来之前,内部类最本质的作用是可以访问外部对象的状态和外部方法的final变量。换言之,模拟闭包。
其它特性都是单纯节省代码量,只有这个作用是暂时无法替代的。

  犀利

返回顶楼
0 0 请登录后投票
 
  • endisonlai
  • 等级: 初级会员
  • 性别:
  • 文章: 19
  • 积分: 30
  • 来自: 昆明
   发表时间:2011-11-21  
 
lz给出的第一个实例,是回调的使用
第二个实例,是事件监听机制的使用。
可多看看基于事件监听的框架就明白怎么使用了。
另外,可考虑在只会使用到一次,并且逻辑不复杂的地方使用。
返回顶楼
0 0 请登录后投票
 
  • mfkvfn
  • 等级: 初级会员
  • 性别:
  • 文章: 292
  • 积分: 40
  • 来自: 深圳
   发表时间:2011-11-21   最后修改:2011-11-21
 
kidneyball 写道
在java8出来之前,内部类最本质的作用是可以访问外部对象的状态和外部方法的final变量。换言之,模拟闭包。
其它特性都是单纯节省代码量,只有这个作用是暂时无法替代的。

+1    说得很简洁,一语中的。偶像啊。

返回顶楼
0 0 请登录后投票
 
  • Ulysses
  • 等级: 初级会员
  • 性别:
  • 文章: 53
  • 积分: 30
  • 来自: 杭州
   发表时间:2011-11-21  
 
java的集合使用了private的Iterator类.这样可以保证你只能获取iterator()方法返回的iterator接口,而无法得到具体实现类
返回顶楼
0 0 请登录后投票
 
  • kidneyball
  • 等级:
  • 性别:
  • 文章: 354
  • 积分: 150
  • 来自: 南太平洋
   发表时间:2011-11-21  
 
kidneyball 写道
在java8出来之前,内部类最本质的作用是可以访问外部对象的状态和外部方法的final变量。换言之,模拟闭包。
其它特性都是单纯节省代码量,只有这个作用是暂时无法替代的。

嗯,还有一种作用,private的static内部类提供了一种“类私有”的可见性,而private的非static内部类提供了“对象私有”的可见性,这也是暂时在java里没有替代方案的(scala里就有)。

返回顶楼
0 0 请登录后投票
 
  • Ben.Sin
  • 等级: 初级会员
  • 性别:
  • 文章: 31
  • 积分: 30
  • 来自: 广州
   发表时间:2011-11-22  
 
kidneyball 写道
kidneyball 写道
在java8出来之前,内部类最本质的作用是可以访问外部对象的状态和外部方法的final变量。换言之,模拟闭包。
其它特性都是单纯节省代码量,只有这个作用是暂时无法替代的。

嗯,还有一种作用,private的static内部类提供了一种“类私有”的可见性,而private的非static内部类提供了“对象私有”的可见性,这也是暂时在java里没有替代方案的(scala里就有)。

弱弱的问一句,final变量的访问跟匿名内部类有什么关系?

java匿名内部类使用场景列举的更多相关文章

  1. #随笔之java匿名内部类

    随笔之java匿名内部类 从今天起开始每日一篇技术博客,当然这只是我当天所学的一些随笔,里面或多或少会有理解不当的地方,希望大家多多指教,一起进步! 在讲匿名内部类之前,先讲讲内部类的一些概念. 1. ...

  2. 【50】java 匿名内部类剖析

    匿名内部类介绍: 匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 匿名内部类的声明 ...

  3. 为什么Java匿名内部类访问的外部局部变量或参数需要被final修饰

    大部分时候,类被定义成一个独立的程序单元.在某些情况下,也会把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类,包含内部类的类也被称为外部类. class Outer { priv ...

  4. Java内部类使用场景和作用

    一.Java内部类的分类 Java内部类一般包括四种:成员内部类.局部内部类.匿名内部类和静态内部类 大多数业务需求,不使用内部类都可以解决,那为什么Java还要设计内部类呢. 二.内部类的使用场景 ...

  5. 细谈 Java 匿名内部类 【分别 使用 接口 和 抽象类实现】

    1.前言 匿名内部类是什么东西? 没有名字的内部类就是匿名内部类. 什么场景使用? 匿名内部类适合创建那种只需要一次使用的类. 这是个很有用的东西,可想而知,如果不使用匿名内部类,哪些只需要使用一次的 ...

  6. Java——匿名内部类

     /* * 匿名内部类,  就是内部类的简写形式. * *  必须有前提: *  内部类必须继承或者实现一个外部类或者接口. * 匿名内部类其实就是一个子类对象. * * 格式:new 父类or接 ...

  7. 从一开始,说出事java匿名内部类

    java内部类.匿名类原本以为它们的使用已经很滑, 成绩, 就在昨天晚上12指向时钟发生重大事故.事故的严重程度再说吧,那是因为我没有睡一晚睡眠. 那以下先用一段模拟代码来描写叙述下我出现的问题的: ...

  8. (转)java匿名内部类详解

    原文:http://android.blog.51cto.com/268543/384844/   内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态static的 ...

  9. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

随机推荐

  1. BNU 34974 MATLAB大法好

    题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=34974 MATLAB大法好  Time Limit: 8000ms Memory Limi ...

  2. localStorage 以及UserData[IE6 IE7]使用

    说在前头: UserData:属于IE6 IE7的老东西.麻烦且体验差,暂且不表 localStorage 属于HTML5的东西,兼容IE8以及其它W3C标准的主流浏览器.所以尽可能的具体解说 注意: ...

  3. bzoj 2120 数颜色 题解

    转载请注明:http://blog.csdn.net/jiangshibiao/article/details/23990489 [原题] 2120: 数颜色 Time Limit: 6 Sec  M ...

  4. 使用ssh过程中对数据库进行update时报错

    报错信息:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in ...

  5. 烦人的Facebook分享授权

    开发端授权app权限 facebook要求提交应用到他们平台, 并且还限制100mb, 坑爹死了, 果断使用google drive分享给他们, 最開始不确定分享给他们什么样的程序包, 结果审核没通过 ...

  6. how to backup and restore database of SQL Server

    Back up 1,右键选中需要备份的数据库,Tasks-->Backup 2.General中,Destination,先remove掉之前的,然后再Add 需要注意的是,add的文件,必须要 ...

  7. js插件---图片裁剪photoClip

    js插件---图片裁剪photoClip 一.总结 一句话总结:页面裁剪图片得到base64格式的图片数据,然后把这个数据通过ajax上传给服务器,服务器将base64图片数据解析成图片并且保存到服务 ...

  8. 【Uva 1625】Color Length

    [Link]: [Description] 给你两个序列,都由大写字母组成; 每次,把两个序列中的一个的开头字母加在字符串的尾端,然后在那个序列中删掉那个开头字母; 最后得到一个字符串; 这个字符串显 ...

  9. C# async/await异步编程深入理解

    异步函数简介 一般指 async 修饰符声明得.可包含await表达式得方法或匿名函数. 声明方式 异步方法的声明语法与其他方法完全一样, 只是需要包含 async 关键字.async可以出现在返回值 ...

  10. Junit4.x高级使用方法具体解释(一)

    近期整理代码的时候,总习惯把一些经常使用的工具类和方法等都写在junit中,这样能够方便于在想用的时候直接copy,在用junit的时候学到了一些比較实用的东西.记录例如以下: 1.使用junit进行 ...