当前位置:首页 > 开发 > 编程语言 > Java > 正文

java匿名内部类使用场景列举

发表于: 2011-11-18   作者:bingyingao   来源:转载   浏览次数:
摘要: java内部类是怎么一回事?匿名内部类何时会用到,之前一直很模糊,昨天看了几个例子,心里开始慢慢清晰了关于匿名内部类的用法。 补充: 以前看到,发布后的工程中,一个java类,生成了几个带标号的.class文件,形如: CouponAgentListAction.class,CouponAgentListAction$1.class,CouponAgentListAction$2.class
java内部类是怎么一回事?匿名内部类何时会用到,之前一直很模糊,昨天看了几个例子,心里开始慢慢清晰了关于匿名内部类的用法。
补充:
以前看到,发布后的工程中,一个java类,生成了几个带标号的.class文件,形如:
CouponAgentListAction.class,CouponAgentListAction$1.class,CouponAgentListAction$2.class.而更新的时候,如果只更新不带标号的.class,可能会出现问题。一直不知道什么原因。今天测试匿名内部类,发现,之所以生成带$的class文件,是因为类中使用了匿名类,使用了几个匿名类,就将生成几个带$的文件,发布工程的时候应该连同带$的文件一齐发布。

示例一:
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));
	}
}


示例二:
这是我们工程中匿名内部类在分页方法中的运用,动态拼接分页链接地址:
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 static Pager register(String name, LinkBuilder builder,
			HttpServletRequest request) {
		Pager pager = new Pager(builder);
		PagerDTO dto = PagerDTO.get(request);
		dto.add(name, pager);
		return pager;
	}

public String getUrl(int page) {
		return staticTool.process(this.linkBuilder.getPageUrl(page).toString());
	}

}


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

示例四:
Thread类的匿名内部类实现。
Runnable接口的匿名内部类实现。
public class Demo {
    public static void main(String[] args) {
        Thread t = new Thread() {
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.print(i + " ");
                }
            }
        };
        t.start();
    }
}


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();
    }
}

使用匿名内部类的特点:
1.只能使用一次
2.接口或者抽象类都可以被实现为匿名内部类。

使用匿名内部类的好处:
可以省略一个类的书写。

java匿名内部类使用场景列举

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
在查看数码相片时,通常会使用一款图片查看软件,该软件应该能遍历文件夹下的所有图片并进行显示。
.NET:C#的匿名委托 和 Java的匿名局部内部类 目录 背景实验备注 背景返回目录 这几天重温Java,发
一 内部类 什么就做内部类? 就是在一个类的内部还存在另外一个类,此类即称为内部类. 1、比如我们定
(*)内部类:定义在类中的类 1,内部类可以直接访问外部类中的成员,包括私有,内部类成员调用外部
1. java中内存的分配 java程序在运行时,内存结构分为:方法区(method),栈内存(stack),堆内存
顶层类只能处于Public跟默认访问级别. 而内部类可以处于任意访问级别. A 实例内部类: 在创建实例内
公司某位同时分享android内存泄漏的时候,谈到了垃圾回收,我突然想到某天在微信公共账号看到的某篇
Java泛型支持通配符,可以单独使用 '?' 来表示任意类型,也可以使用extends关键字表示某一个类或接口
匿名内部类真的很神秘的,不过,这种类就喜欢做一些神秘的东西。想想,匿名内部类,根本就没有名,
linqpad是一款linq语句调试工具,功能如下: 1、直接执行linq语句并查看生成的原生sql语句 2、可结合
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号