`

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

    博客分类:
  • J2EE
阅读更多
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.接口或者抽象类都可以被实现为匿名内部类。

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

分享到:
评论

相关推荐

    第11章 枚举_注解_内部类.pdf

    在Java编程语言中,枚举、注解和内部类是三种重要的语言特性,它们分别用于不同的场景和目的。本章将详细介绍这些概念,并说明它们的使用场景和方法。 首先,枚举(enum)是Java 5引入的一个特殊的数据类型,它用于...

    Java知识表格,java ee,java web

    - **内部类**:介绍内部类的定义、使用方法以及外部如何访问内部类。 - **对象数组**:演示如何使用对象数组存储多个对象实例。 ##### 12. 面向对象基础(07) - **static关键字**:详解static关键字的用途及其注意...

    SUN Java 考试大纲

    - **使用内部类与匿名类的事件处理**:比较这两种方式处理事件的优缺点。 #### 十三、基于GUI的应用编程 - **AWT包部件**:详细介绍AWT组件集中的各种组件,如`Button`、`TextField`等。 - **菜单构建**:展示如何...

    java常见的面试题

    一个匿名内部类如果需要继承一个类,可以在定义时直接使用extends关键字。 3. **implements**:用于实现接口。匿名内部类可以通过implements关键字来实现一个或多个接口。 #### 三、Static Nested Class(静态...

    最全Java面试题汇总(一)

    - **匿名内部类**:没有名字的内部类,通常用于简化代码,特别是在需要实现接口的情况下。 - 可以**实现接口**,也可以**继承类**(前提是该类为抽象类或者有无参构造函数)。 - 在Swing编程中经常用到匿名内部类来...

    Java面试宝典2012版

    匿名内部类是在创建类的同时实例化该类的特殊语法。它可以实现接口或继承类,但在实际应用中,通常用于实现接口。由于它是匿名的,因此不能继承自特定的类,但可以作为接口的实现者。 #### 3. Static Nested Class ...

    java面试题.pdf

    - 内部类主要有四种:成员内部类、局部内部类、匿名内部类和静态内部类。 7. **用JAVA实现一种排序,JAVA类实现序列化的方法?** - 排序方法如上提及。 - Java类实现序列化通常需要实现`Serializable`接口,通过...

    Java实用程序设计100例(第5章).rar

    内部类(嵌套类)允许在一个类内部定义另一个类,有成员内部类、局部内部类、匿名内部类等形式,可以用于实现复杂的设计模式。 9. **设计模式**:设计模式是解决常见问题的经验总结,如单例模式、工厂模式、装饰器...

    Java面试题以及答案

    每种类型的内部类都有不同的使用场景和特点。 #### 13. 用JAVA实现一种排序,JAVA类实现序列化的方法(二种)? - 实现排序的方法已经在第8点中给出。 - 序列化可以通过实现`Serializable`接口或使用`Externalizable...

    IO 目录列表器 回调函数 Thinking in java 4

    回调函数通常通过匿名内部类或者Lambda表达式实现。在Java 8及以后的版本中,Lambda表达式使得编写回调函数变得更加简洁。例如,你可以定义一个`FileFilter`接口的实现,然后将其作为参数传递给`listFiles()`,这样...

    学习Java基础必备的jdk8.0 API中文文档

    Java API文档详细列举了Java平台标准版(Java SE)的所有类和接口,以及它们的方法、属性和常量,提供了开发者需要的完整参考信息。 JDK 8是Java历史上的一个里程碑版本,引入了许多新特性,比如: 1. **Lambda...

    Java面试题整理精华

    内部类可以是匿名的,也可以有自己的构造函数。 #### 13. 用JAVA实现一种排序,JAVA类实现序列化的方法(二种)? 除了实现`Serializable`接口外,还可以使用`Externalizable`接口,它提供了更精细的控制,允许自定义...

    java-sdk-6.5.0.zip

    在本文中,我们将深入探讨这个SDK,了解其核心功能、使用场景以及如何在实际项目中进行集成。 1. **天翼云OOS服务** - OOS(Object Storage Service)是天翼云提供的分布式存储服务,支持海量、安全、低成本、高...

    java面试题及答案

    - **Anonymous Inner Class(匿名内部类)**:是在定义的同时创建的内部类实例,没有名称,通常用于实现接口或扩展类并立即使用的情况。它可以简化代码,尤其是在事件监听器等场景中。 - **extends**:用于表示类的...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.27.docx

    问题 11:解释一下 Java 中的反射机制及其使用场景。 Java 反射机制允许程序在运行时动态获取类的信息(如类名、属性、方法等)并操作对象。常见的使用场景包括:动态加载类、运行时检查对象类型、调用私有方法、...

    jdk api 1.8.rar

    Java API 1.8文档详细列举了所有内置的类、接口、枚举和注解,是Java程序员的必备参考资源。 1. **Lambda表达式**:Java 8引入了一项重大改进,即支持函数式编程的Lambda表达式。它允许将匿名函数作为方法参数或...

    jdk api文档

    2. 泛型改进:类型推断(Type Inference)进一步加强,比如钻石操作符(),简化了匿名内部类的泛型实例化。 3. 并发库增强:java.util.concurrent包中新增了ForkJoinPool和Fork/Join框架,用于高效地执行大量任务...

    简单的文件管理

    - 可以自定义`FilenameFilter`接口或使用`FileFilter`的匿名内部类,实现对文件或目录的筛选,如按扩展名筛选。 7. **文件观察者** - Java 7引入了`java.nio.file`包中的`WatchService`,可以监听文件系统事件,...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.78.docx

    答案:Lambda 表达式是 Java 8 引入的新特性,它是一种匿名函数,可以作为参数传递,简化了函数式编程。Lambda 表达式简化了代码,提高了可读性,尤其在处理集合和回调函数时非常方便。解析:Lambda 表达式使得 Java...

Global site tag (gtag.js) - Google Analytics