}
public class Outter{
public static final mm=5;//这里声明了个变量,当然我们的关注点是final,这是因为匿名内部类想使用在其外部定义的对象(Java中万物皆对象),就必须要求参数的引用是final
public huhu info() {//创建一个继承自huhu这个接口的匿名类的对象,通过new表达式返回的引用被自动向上转型为对huhu接口的引用
return new huhu(){
//匿名内部类肯定没有构造器咯,因为它名字是啥你都不知道
public int here;//包含字段和方法
public void saySomething() {
System.out.println(“hello”);//插桩,让我们知道程序运行到了此处
}
};//标记表达式的结束,而这个表达式包含了匿名内部类
}
public static void main(String[] args) {
}
}
为了具体说明其关系,这里详细解释:你新建了一个类并实现了huhu这个接口,最后将其向上转型,得到这个接口的引用。
总结:匿名类可以扩展类,也可以实现其接口(只能一个接口),不能兼而有之
用处:对于一些特殊的类,添加些小功能,而这又不适合以接口和继承方式来实现(杀鸡焉用牛刀对吧) 这样简单优雅
这里附上匿名内部类与工程模式的结合实现:(From Think In Java)
public interface BaseService {
void method1();
void method2();
}
public interface ServiceFactory {
BaseService getService();
}
package com.upcsogo.www;
class Implementation1 implements BaseService {
private Implementation1() {
}
@Override
public void method1() {
// TODO Auto-generated method stub
System.out.println("Implementation1 method1");
}
@Override
public void method2() {
// TODO Auto-generated method stub
System.out.println("Implementation2 method2");
}
public static ServiceFactory factory = new ServiceFactory() {
@Override
public BaseService getService() {
// TODO Auto-generated method stub
return new Implementation1();
}
};
}
class Implementation2 implements BaseService {
private Implementation2 () {
}
@Override
public void method1() {
// TODO Auto-generated method stub
System.out.println("Implementation2 method1");
}
@Override
public void method2() {
// TODO Auto-generated method stub
System.out.println("Implemtation2 method2");
}
public static ServiceFactory factory2 = new ServiceFactory() {
@Override
public BaseService getService() {
// TODO Auto-generated method stub
return new Implementation2();
}
};
}
public class FactoriesHere {
/**
* @param args
*/
public static void serviceConsumer(ServiceFactory fac) {
BaseService bs = fac.getService();
bs.method1();
bs.method2();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
serviceConsumer(Implementation1.factory);
serviceConsumer(Implementation2.factory2);
}
}