集合与继承器

针对一个特定问题的解决,如果事先不知道需要多少个对象,或者它们的持续时间有多长,那么也不知道如 何保存那些对象。既然如此,怎样才能知道那些对象要求多少空间呢?事先上根本无法提前知道,除非进入 运行期。 在面向对象的设计中,大多数问题的解决办法似乎都有些轻率——只是简单地创建另一种类型的对象。用于 解决特定问题的新型对象容纳了指向其他对象的句柄。当然,也可以用数组来做同样的事情,那是大多数语 言都具有的一种功能。但不能只看到这一点。这种新对象通常叫作“集合”(亦叫作一个“容器”,但 AWT 在不同的场合应用了这个术语,所以本书将一直沿用“集合”的称呼。在需要的时候,集合会自动扩充自 己,以便适应我们在其中置入的任何东西。所以我们事先不必知道要在一个集合里容下多少东西。只需创建 一个集合,以后的工作让它自己负责好了。 幸运的是,设计优良的 OOP语言都配套提供了一系列集合。在 C++中,它们是以“标准模板库”(STL)的形 式提供的。Object Pascal 用自己的“可视组件库”(VCL)提供集合。Smalltalk 提供了一套非常完整的集 合。而 Java 也用自己的标准库提供了集合。在某些库中,一个常规集合便可满足人们的大多数要求;而在另
34
一些库中(特别是 C++的库),则面向不同的需求提供了不同类型的集合。例如,可以用一个矢量统一对所 有元素的访问方式;一个链接列表则用于保证所有元素的插入统一。所以我们能根据自己的需要选择适当的 类型。其中包括集、队列、散列表、树、堆栈等等。 所有集合都提供了相应的读写功能。将某样东西置入集合时,采用的方式是十分明显的。有一个叫作“推” (Push)、“添加”(Add)或其他类似名字的函数用于做这件事情。但将数据从集合中取出的时候,方式却 并不总是那么明显。如果是一个数组形式的实体,比如一个矢量(Vector),那么也许能用索引运算符或函 数。但在许多情况下,这样做往往会无功而返。此外,单选定函数的功能是非常有限的。如果想对集合中的 一系列元素进行操纵或比较,而不是仅仅面向一个,这时又该怎么办呢? 办法就是使用一个“继续器”(Iterator),它属于一种对象,负责选择集合内的元素,并把它们提供给继 承器的用户。作为一个类,它也提供了一级抽象。利用这一级抽象,可将集合细节与用于访问那个集合的代 码隔离开。通过继承器的作用,集合被抽象成一个简单的序列。继承器允许我们遍历那个序列,同时毋需关 心基础结构是什么——换言之,不管它是一个矢量、一个链接列表、一个堆栈,还是其他什么东西。这样一 来,我们就可以灵活地改变基础数据,不会对程序里的代码造成干扰。Java 最开始(在 1.0和 1.1版中)提 供的是一个标准继承器,名为 Enumeration(枚举),为它的所有集合类提供服务。Java 1.2 新增一个更复 杂的集合库,其中包含了一个名为 Iterator 的继承器,可以做比老式的Enumeration更多的事情。 从设计角度出发,我们需要的是一个全功能的序列。通过对它的操纵,应该能解决自己的问题。如果一种类 型的序列即可满足我们的所有要求,那么完全没有必要再换用不同的类型。有两方面的原因促使我们需要对 集合作出选择。首先,集合提供了不同的接口类型以及外部行为。堆栈的接口与行为与队列的不同,而队列 的接口与行为又与一个集(Set)或列表的不同。利用这个特征,我们解决问题时便有更大的灵活性。 其次,不同的集合在进行特定操作时往往有不同的效率。最好的例子便是矢量(Vector)和列表(List)的 区别。它们都属于简单的序列,拥有完全一致的接口和外部行为。但在执行一些特定的任务时,需要的开销 却是完全不同的。对矢量内的元素进行的随机访问(存取)是一种常时操作;无论我们选择的选择是什么, 需要的时间量都是相同的。但在一个链接列表中,若想到处移动,并随机挑选一个元素,就需付出“惨重” 的代价。而且假设某个元素位于列表较远的地方,找到它所需的时间也会长许多。但在另一方面,如果想在 序列中部插入一个元素,用列表就比用矢量划算得多。这些以及其他操作都有不同的执行效率,具体取决于 序列的基础结构是什么。在设计阶段,我们可以先从一个列表开始。最后调整性能的时候,再根据情况把它 换成矢量。由于抽象是通过继承器进行的,所以能在两者方便地切换,对代码的影响则显得微不足道。 最后,记住集合只是一个用来放置对象的储藏所。如果那个储藏所能满足我们的所有需要,就完全没必要关 心它具体是如何实现的(这是大多数类型对象的一个基本概念)。如果在一个编程环境中工作,它由于其他 因素(比如在Windows 下运行,或者由垃圾收集器带来了开销)产生了内在的开销,那么矢量和链接列表之 间在系统开销上的差异就或许不是一个大问题。我们可能只需要一种类型的序列。甚至可以想象有一个“完 美”的集合抽象,它能根据自己的使用方式自动改变基层的实现方式。

 1 package Com.TomTest;
 2
 3
 4 class A {
 5       final double PI=3.1415926;
 6       public double getArea(final double r) {
 7          return PI*r*r;
 8       }
 9     }
10     public class TomTest_27 {
11       public static void main(String args[]) {
12         A a=new A();
13           System.out.println("面积:"+a.getArea(100));
14        }
15     }

原文地址:https://www.cnblogs.com/borter/p/9438493.html

时间: 2024-10-18 10:01:36

集合与继承器的相关文章

Atitit利用反射获取子类 集合 以及继承树

Atitit利用反射获取子类 集合 以及继承树 想从父类往下找子类的确是不可能的,要知道只要类不是final的话谁都有继承它的自由不需要事前通知父类. Eclipse实现不是重父类开始找而是重子类往回找,然后在逐个匹配. 很简单,遍历源代码目录下的所有类文件,根据类定义行通过字符串匹配找出继承该类的所有子类. 找某个包的子类,JDK中没有直接提供相应的接口,应该是加载classpath下的所有类,放到类似Map<Package, Collection<Class>>容器中 如果一定

Java 集合的继承关系(简化)

最近在看<Java编程思想>的第17章时,发现集合的继承关系中缺了Queue的类图,因此准备把图补上.另外,在绘制的过程中只保留了常用的集合对象,使整个继承看起来比较简洁.如果有错误,请大家指出.

对象初始化器与集合初初始化器

对象初始化器的结果: 对象初始化器的优点: 1.只需要一条语句就可以完成对象初始化工作. 2.无需为简单对象提供构造函数. 3.无需为初始化不同属性而为类提供多个构造函数. 集合初始化的优点: 1.集合初始化已声明的方式初始化集合,具有更好的代码可读性.

Java面试题:Java中的集合及其继承关系

关于集合的体系是每个人都应该烂熟于心的,尤其是对我们经常使用的List,Map的原理更该如此.这里我们看这张图即可: 1.List.Set.Map是否继承自Collection接口? List.Set 是,Map 不是.Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形. 2.阐述ArrayList.Vector.LinkedList的存储性能和特性. ArrayLi

集合框架(集合的继承体系图解)

 

java中集合的继承结构图collection部分

java张集合的继承结构图Map部分

ArrayList、HashMap 与 员工类(程序员、经理的结合使用) 相当于集合与继承的总结

1 package Day28ketangzuoye; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.Map; 6 7 public class EmployeeTest { 8 9 public static void main(String[] args) { 10 Emp se1=new SE(0001,"蔡正",true,6000,80); 11 Emp se2=ne

1.JAVA 编程思想——对象入门

对象入门 欢迎转载,转载请标明出处:    http://blog.csdn.net/notbaron/article/details/51040219 如果学JAVA,没有读透<JAVA 编程思想>这本书,实在不好意思和别人说自己学过JAVA.鉴于此,蛤蟆忙里偷闲,偷偷翻看这本传说中的牛书. 面向对象编程OOP具有多方面吸引力.实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.已于维护的设计方案. 这些描述看上去非常吸引人的,不过蛤蟆还是没啥印象(至少到