在书上看到关于内部类的东西,发现自己以前有一些理解错误了
上代码:
public class Parce17{
public Contents contents(){
//这里的new Contents()并非是创建一个Contents对象,而是创建一个继承Contents的匿名类(只是这个匿名类没有名字而已),最终返回的是Contents的引用(向上转型)
return new Contents(){
private int i = 1;
publi int intVaue(){return i;}
}
}
public static void main(String[] args){
Parce17 a = new Parce17();
Contents c = a.contents();
}
}
在这里说一下关于概念的误区
Parce17的contents()方法将返回值的生成与表示的这个返回值的类的定义结合在一起,另外这个类似匿名的。看起来是要新建一个Contents对象,但是实际是(在到达语句结束的分号之前),这种奇怪的语法值得是:“创建一个继承Content的匿名类的对象”,通过new表达式返回的引用被自动向上转型为Contents的引用。在匿名类中要传入参数的话,传的参数应该是是带有final类型的,因为这个参数是要匿名类要内部使用的
优先使用类而不是接口,如果你的设计需要某个接口,你必须要去了解他。否则不到万不得已,不要将其放到你的设计中。
为什么需要内部类
如果要实现一个接口的引用,直接让其实现该接口就行了。为什么需要内部类这种语法呢?用内部类实现一个接口和外围类实现一个接口到底有什么区别呢?答案是:后者不是总能享受到接口带来的方便,又是需要用到接口的实现。
每个内部类都能独立集成一个接口的实现,所以无论外围内是否已经继承了某个接口的实现,对于内部类都没有任何影响。
闭包(Closure) 回调(callback)
闭包是一个可调用的对象,记录了一下信息。这些信息来源于创建它的作用域。通过这个定义,可以看出内部类是面向对象的闭包。因为他不仅包含外围对象的信息,还自动拥有一个指向外围对象的引用。在此作用域类,内部类可以操作所有的权限成员。
通过内部类提供闭包的功能是比较优良的解决方案。回调的价值在于你可以动态的决定要调用什么方法。