记得在学习java语言时,书本和前辈都都着重强调接口是不能实例化的。
但如果你阅读spring源码时,你会发现有如下片段:
if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() { @Override public Object getObject() throws BeansException { try { return createBean(beanName, mbd, args); } catch (BeansException ex) { // Explicitly remove instance from singleton cache: It might have been put there // eagerly by the creation process, to allow for circular reference resolution. // Also remove any beans that received a temporary reference to the bean. destroySingleton(beanName); throw ex; } } }); bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); }以上是org.springframework.beans.factory.support.AbstractBeanFactory代码片段。而new出来的对象并没有实际的类作为载体,是不是很奇怪。
这就是 匿名内部类,相当于一个匿名的类实现了这个接口,只不过把类的实例化和类的实现都写在一起了。
那为何要使用匿名内部类
Think in java上说:使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。它能够非常好的解决多重继承的问题,在我们程序设计中有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。
参考:https://www.cnblogs.com/chenssy/p/3388487.html