胡扯1
*** 接口:接口可以用来标志对象的类别,一个对象可同时属于多个类别。
接口方法必须被具体子类实现。之后,可以通过接口的名义来调用具体方法。如List list=new ArrayList(); list.add("abc"); …… 接口有利于我们在尚未具体实现的时候先设计出工程的结构。当以接口的名义来组织代码的时候,很多实现类都可以被平稳地替换掉,从而有利于算法的升级、重构。
*** 抽象类,继承:在类的继承结构中,将某些实际类中所共用的代码上移到抽象类中。这提高了代码的复用性。并且从类的层次上及时地反映出某些具体类所具有的“共同点”。
类层次上复用的应当是类对象的“共性特征”,即调用代码所在的对象集所共同具备的某些能力。
当多个对象都调用了异类的a对象的某方法时,是代码的层次上的代码复用,这一类的复用通常适用于耦合性低的、算法性的、可能跨越多个类,被普遍使用的功能复用。
*** 重载: 重载适合于解决这样一小类问题:它们适用于一个共同的名称,但在解决具体问题时可能会需要用到不同类型的资源。比如说加法的重载形式有 add(int a, int b), add(double a, double b).
*** 覆盖: 如果子类覆盖了父类的某个方法,则表明子类具有不同于父类的行为特征。当子类覆盖了很多的父类的行为特征时,就应当考虑是否应当解除父子关系。
*** 代理: 当你必需去做一件事情,但又缺乏相关资源(行为特征)的时候,你可以请一个代理。……在程序中,代理可以屏蔽指定对象的某些行为,或者在某些行为实施前后增加一些操作。……代理有一个被人忽视的用处:用来及时检测程序的异常状态。——如果某对象抛出了异常,为找到导致这个异常的bug,我们可能得一步步地跟踪代码,如果这样太耗费时间,则可以尝试使用这个对象的代理,代理会截获对象的每一个方法调用,并在调用后自动检测对象的状态,如果非法,则抛异常,这有助于我们使用非代码跟踪的方法在运行时快速定位导致异常的代码位置。这样做的难点在于如何判断非法状态。
*** 递归: 递归是一个很强很强的思想。当一个复杂的问题可以被分解成一个树结构时,我们接下来的主要工作是去描述这颗树的父子之间所具有的简单的任务分派逻辑。然后把这个问题交给树的根结点来解决。根结点说:我把拆解后的题目分派给我的儿子(我是他们的老板),等他们把答案都交上来以后,我把这些答案算一算,然后把结果交给那个给我出题的老板。我儿子是怎样做的呢,学我的。……如果儿子还是个小崽崽(叶结点)怎么办?没关系,他得到的问题已经足够简单,可以直接告诉他爸。
*** 堆栈: 递归是思想,堆栈是工具。显然,用stack来遍历一颗树(深度优先)的时候,结点的出栈次序就对应着树的一个深度优先遍历序列。更进一步,你是否清楚:当弹出一个结点后,栈中还剩下什么结点? 在树中,它跟这些剩下的结点是什么关系?
*** List: list是一个简单有效的工具。
*** Set: Set是一个集合(其元素不可能重复出现),它可能是无序的,如HashSet, 也可能是有序的,如TreeSet.
*** Map: Map中所有的key其实是一个集合,可以通过map.keySet()方法得到这个集合。Map所有的key都可以分别关联到一个指定的值。
——2009-4-0