《Java编程思想》(第二版)第08章:接口与内隐类

类别:Java 点击:0 评论:0 推荐:

我的笔记

Interfaces&inner classes为你的系统中的对象提供更为精巧的组织与控制方式.

interface更胜于abstract class,因为我们能够藉以撰写出"可以upcasting为多个base class"的class,从而达到C++多重继承的目的.

你可以在关键字interface之前加上关键字public(但只有当这个interface被定义与同名文件中才行),否则就成为"friendly",仅可被使用于同一个package之内.interface之内的所有methods都会被默认为public.由于interface不带任何实现细目,也就是说interface不与任何存储空间有关联,因此合并多个interface是一件轻而易举的工作,编译器不需如临大敌.所以在合并多个接口时,C++所面临的问题不会出现于Java之中.显然我们应该尽量考虑使用interface而不是abstract class.

产生常量群(grouping constants)
由于interface中的所有数据成员都会自动成为static和final,所以对于常量群的产生(就如C或C++中的enum一样),interface是个十分便利的工具.interface中的数据成员会自动成为public,所以无需明白标出.

接口合并时的名称冲突(name collision)问题:当你实现多重接口是,可能会掉进一个小小的陷阱.overriding ,implementation,overloading统统令人不愉快的混砸在一起.而且重载method无法仅靠return type作为区别.所以此时你要特别小心。

嵌套的(nesting) interfaces:除了实现private interface这个东东,真的还有用吗?书上说:"或许加入这些特性的最初理由只是为了语法上的一致性,但我总认为,你知道语言的某个特性之后,往往能够找到这个特性的用处。"

Inner Classes(内隐类)
从设计上来说:inner class的主要目的不应是隐藏,因为Java已经具备了极佳的隐藏机制-friendly class。但是当你开始upcasting至base class 尤其是转型为interface时,就能突显inner class的好处:(tip:从某个"实现出interface I"的inner class对象身上产生一个reference 指向I,本质上和"向上转型至base class"是一样的),这是因为inner class(也就是I的实现者)可以在接下来的情境中完全不被看见,而且不为任何人所用。这么一来我们就可以很方便的"隐藏实现细目"。你所得到的只是"指向base class或interface"的一个reference而已。注意这里Inner Classes可以具有一般的(non-inner) class无法具有的性质:比如可以拥有private 和protected访问修饰符。当申明为private时,表示仅供outer class访问,当申明为protected时,表示可以被package内的任何class或者outer class的继承者所使用。


位于methods和scopes之内的inner classes
怕怕~,上面提到的是inner class最正常的用法,如果你需要,他还提供了一些隐晦的使用方法:你可以将inner classes至于函数之内或甚至至于任意程序范畴(scopes)之内...你真的需要嘛?晕倒。

匿名(anonymous) inner classes
time time again,i ask you :真的需要吗?多写点代码会死啊!

与外围(outer) class的连接关系
inner class还有一个显然的好处就是他可以访问外围对象的所有成员而无需添加任何修饰词。此外inner classes亦能访问enclosing class的所有元素(这点与C++大不相同)。这是因为任何inner class被产生的

时候,必须给它记录一个reference,指向enclosing class的某个特定对象(比如说outer class),如果编译器找不到这个ref,就等着报错把。

static inner classes(静态内隐类)
和上面的inner class相反,如果你不需要这个ref,那就static之吧!这意味着:
1.产生其对象时,并不需要同时存在一个enclosing class对象.
2.你无法在static inner class对象中访问enclosing class对象成员实际上,从另一个角度来看,还存在第3点不同:
3.可以拥有static data,static fields,static inner class.然而non-static inner class不行.由此我们可以发现static inner class 和static method相似了.
4.可以把static inner class 放在interface里面--static inner class只不过是被置于interface的命名空间中罢了,利用这个性质,可以把main()放到某个接口中,用以支持测试...

取用(referring) outer class 的对象
[outer class name].this.xxx
如果你想在outer class里面的static函数里面直接产生inner class对象,需要先搞定一个outer class的ref p,然后p.new [inner class name].因为我们说过inner class产生的时候必须要有一个outer class ref传过来,否则会被认为错误.当然对于static inner class 就不用了.

从多层嵌套class向外伸展触角
无论inner class被嵌套的层次有多深.其所有outer classes的成员都可被它访问(考虑NameSpace).

继承inner classes:先吐血3升,真的有必要吗?
难点在于那个神秘的ref必须被初始化.但derived class之内不存有可连接的缺省对象.所以需要专用语法支持:enclosingClassReference.super();

inner classes 可被复写吗?
总算不用研究了:作者已经说明了,记住结果就可以:"其实没有什么用处."

inner class 标志符 (identifiers) : $

总结:为什么需要inner classes?
1.由inner class实现interface能提供outer class实现interface所不具备的功能:你可以下探实现细目.inner class不受限于outer class是否已继承自某一实现类.也就是说,inner classes实习上由于你继承多个non-interface.
2.Closures(终结)和Callbacks(回调)
3.Control frameworks

我的问题

文中提到的把含有main()的static inner class 放到interface中用于测试较之以前的继承main()有何优点?

文中提到的把含有main()的static inner class 放到interface中用于测试较之以前的继承main()有何优点?

文中提到的把含有main()的static inner class 放到interface中用于测试较之以前的继承main()有何优点?

原来protected>=friendly?我土了。。

关于某些inner class的内容,实用价值真的很大么?为了20%的使用可能性而去花掉80%的学习时间,值得么?我认为很多东西都是为钻牛角尖的程序员准备的,而我显然没打算这么做,也没有那个能力.

还有问题太多了...以后慢慢提.多谢大家指教.

本文地址:http://com.8s8s.com/it/it10875.htm