匿名内部类学习
晚上看Spring-Data-Redis,别人的demo里通过对匿名内部类的回调实现set、get方法,仔细想以下,发现自己对匿名内部类掌握不是很好,就又翻了下Thinking in Java。
匿名内部类的格式:1
2
3new Contents(){
...
}
我对匿名内部类主要有以下几个疑问:
一、匿名内部类实现的时什么类型的对象,可以实现接口吗?
Contents()可以是调用的一个类的构造器,此时括号中可以根据构造器传入参数,将创建一个继承自Contents的匿名类对象;
Contents也可以是一个接口,将创建一个实现Contents接口的匿名类对象,此时匿名类中只有一个隐式的无参构造器,所以括号中不能传入参数;
二、如何引用匿名内部类?
回答了问题一其实就能解决这个问题了,new表达式返回的引用会被自动向上转型为对Contents的引用
三、如何实现类似构造器的效果?
通过实例初始化,就像这样:1
2
3
4new Contents(){
{print("instance init");}
.....
}
使用匿名内部类还需要注意以下问题:
匿名内部类中可以直接调用外部定义的对象,但编译器会要求该对象的引用必须是final的,例如:1
2
3
4
5
6public Contents getContents(final String param){
return new Contents(){
String label = param;
.....
}
}