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.接口或者抽象类都可以被实现为匿名内部类。
使用匿名内部类的好处:
可以省略一个类的书写。