最近看了一下java.util包的一些源代码,感觉里面的东西的确很规范,起码比我的代码要规范N倍,感想挺多的,有空再一一贴出来。
学过Java的朋友都知道,Java中有接口,抽象类,类。抽象类能实施接口,类也能实施接口。抽象类与普通的类的最大的区别,在于抽象类本身不能被实例化,换句话说,抽象类必须要有子类才能实现它的功能,但是,接口也是需要被实施的,初学的朋友们可能会觉得抽象类是不是有点“多余”了?事实上不然,没有抽象类,util包也就不能写得这么完美,下面看一个例子(参看附件 示例.bmp)
AbstractList实施了List,也就是把一些公共的操作集中起来,比如,indexOf(Object o),clear(),addAll(int index, Collection<? extends E> c)等等,但是,AbstractList是一个抽象类,它本身并不能被实例化,而是由其一个子类:比如Vector来负责更具体的内部逻辑,同时,Vector类还实施了List接口。换句话说,把公共的操作,一律往上放,这样,底下的子类只要一继承抽象类,马上就有了基本的功能,子类可以专注与自己本身需要做的活,而不需要再一遍又一遍重复地去写那些公共操作。由于在java.util包中继承AbsctractList的类非常多,包括ArrayList等等,而AbsctractList的子类本身的逻辑又很复杂,如果把AbstractList当做一个普通的类来处理(即AbsctractList不再是一个抽象类),那么,AbsctractList根本就没办法去实施List接口,因为List接口定义的方法必须在每一个具体的子类去实施,仅用一个超级父类来解决所有的问题是不可能的,根本就不现实,这就是抽象类的作用,它本身不能被实例化,但是,它能处理一些具体的公共逻辑,有些逻辑要到具体的类去实施,那么,它就只抽象方法而不去实施,而不是像接口那样,只管定义方法或属性,其他的什么都不管。这样,只要一个子类继承了一个Abstract类,它就拥有了某一些能力,而不是像实施一个接口一样,里面的方法必须重写,才能有具体的业务能力
注意:Collection.rar是我对util包的代码分析绘的一个类结构图,欢迎朋友们指正。开发工具为MyEclipse6.0