内部类

来源:互联网 发布:天下第一签软件下载 编辑:程序博客网 时间:2024/05/22 13:36

在书上看到关于内部类的东西,发现自己以前有一些理解错误了

上代码:

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)

闭包是一个可调用的对象,记录了一下信息。这些信息来源于创建它的作用域。通过这个定义,可以看出内部类是面向对象的闭包。因为他不仅包含外围对象的信息,还自动拥有一个指向外围对象的引用。在此作用域类,内部类可以操作所有的权限成员。
通过内部类提供闭包的功能是比较优良的解决方案。回调的价值在于你可以动态的决定要调用什么方法。