计算机工程
COMPUTER ENGINEERING
1999年 第25卷 第10期 Vol.25 No.10 1999



Java动态数据结构与软构件重用技术的实现
钟诚　宋玲　赵明
摘要：Java是一种支持并行和颁式处理的纯面向对象的计算环境。探讨其动态对象技术和继承机制，并通过实例说明动态数据结构和软构件重用的实现方法。
关键词：Java；面向对象；动态数据结构；软件重用
Implementation on Dynamic Data Structure and Software Reuse Technologuy in Java
Zhong Cheng Song Ling Zhao Ming
(School of Computer and Information Engineering,Guangxi University,Nanning 530004)
【Abstract】Java is an Object-oriented distributcd computing environment.In this paper,dynamic data structure and software reuse technology is researched and implemented in Java programming.
【Key words】Java ;Object-oriented;Dynamic data structures;Sofware reuse
1  通过动态对象和构造方法实现动态数据结构
　　Java的对象是通过对类进行实例化动态产生的，而构造方法则实现对象的初始化[1,2] 。因此，可以巧妙地应用动态对象和构造方法创建大小可伸缩的动态数据结构－诸如动态数组、动态栈和动态队列等，从而使得面向对象程序设计更加灵活和有效，以满足随时间变化的应用的需要。
　　为什么要研究动态数据结构呢？我们知道，大规模科学与工程计算、计算机图象处理等领域经常需要对N×N矩阵进行计算和处理。当问题规模N较大时，此矩阵占据了大量的内存空间，使得许多问题的求解难以在内存容量有限的系统上实现。事实上，许多情况下应用系统并不是每时每刻都要使用N×N个数据。例如，在某些时间里可能只需使用到下三角(或上三角)矩阵中的元素。如果应用诸如Fortran、Pascal或C等传统的面向过程的语言编程实现时，只能且必须静态地申请分配一个存储单元数为N2的方阵，这显然浪费了(N2-N)/2个存储单元。因此，探讨产生各维大小可动态变化的数组具有重要意义。
　　下面以Windows95和CAFE平台为例，通过动态产生三角矩阵来说明动态数据结构产生方法。由于Java系统将数组抽象成类，某个具体数组则是数组类的一个实例对象，因此可以将某个具体的Java多维数组看成是数组类对象的一个实例对象，而且其各维的大小通过构造方法动态地逐步产生：
　　class multiarray　//　矩阵类
　　　{　double　x[][];
　　　　　multiarray( int n)　//　构造方法
　　　　　　{　x=new　double[n][];
　　　　　　　for (int　i=1;i<=n;i++)　//　动态构造三角矩阵
　　　　　　　　　x[i-1]=new　double[i];
　　　　　　 }
　　　　　　void　assign(int n)
　　　　　　　{　for (int i=0;i<n;i++)　//　给三角矩阵赋值
　　　　　　　　　for (int j=0;j<=i;j++)
　　　　　　　　　　x[i][j]=i+j;
　　　　　　　 }
　　　　　　　void output(int n)
　　　　　　　　{　for(int　i=0;i<n;i++)　//　输出三角矩阵
　　　　　　　　　　{　for(int j=0;j<=i;j++)
　　　　　　　　　　　　　System.out.print("　"+x[i][j]);
　　　　　　　　　　　　System.out.println();
　　　　　　　　　　 }
　　　　　　　　}
2　通过继承机制实现软构件重用
　　所谓软件重用是指利用现有的可靠的软件成分(称为软构件)来构造新的应用软件系统[3,4] 。这些软构件可以是软构件库里的标准件也可以是用户自己新开发的构件。实现软构件重用的一种技术是继承机制。当开发应用系统时，首先将要处理的客观世界的事物定义成通用的抽象的软件成分Y，然后在此基础上再定义各种较为具体的软件成分X，并通过继承，使得X(又称为子类X) 可以自动地共享Y(又称为父类Y)的数据和方法，从而实现软构件重用，如图1所示。

图1  子类X通过继承重用父类Y
　　其中继承映射可以是直接的"继承"，即子类的继承部分完全等同于父类(数据与方法)；也可以是其他更丰富、更广阔的"继承"，比如重新定义成员数据、重新实现方法等。当类X继承Y时，我们说类X重用了类Y的数据/方法。
　　开发可重用构件的应用系统时，如果软构件的抽象程度不高，那么软构件库就会变得庞大和繁杂，降低了应用系统的有效性和可靠性，从而失去通过集成软构件构造应用软件系统的意义。因此，应用软构件重用技术开发应用系统的关键问题是如何识别和分类出软构件、以及如何组织和实现软构件。基本原则是仅将客观事物最基本的内容抽象成可重用的软构件，即将最基本的内容抽象成父类。 
　　Java支持直接重用系统提供的各种各样的标准的软构件(类)，也可以由开发人员通过extends指定类X直接继承类Y来实现软构件(程序)的重用；并通过引用super.成员变量重载父类的数据、通过 super.方法([参数])重载父类的方法，以及通过super([参数])重载父类的构造方法来实现软件(程序)的多态性。
　　下面以计算机科学与技术中应用十分广泛的栈数据对象为例来讨论在Java应用程序中实现软构件重用的方法。栈属于线性有序结构，具有线性数据结构的共同属性-----诸如建立线性表、判断线性表空或满、查找线性表中有否满足要求的元素、将新元素插入线性表指定的位置、将线性表中满足条件的元素删除等等。但是，栈有其自己的特点，即栈的插入和删除操作按照先进后出原则在同一端进行[5]。
　　因此，首先定义一个线性数据结构类，它封装了线性表数据，建立线性表方法、判断线性表空或满方法、查找线性表中有否满足要求的元素的方法等，然后利用继承机制和重载技术实现栈类：
　　class　lineartable　//　线性表类
　　　{ int s[];　//　定义线性表　s
　　　　int top=-1;　//　top 指向当前线性表最后一个元素
　　　　lineartable(int n)　//　 动态建立大小为n的线性表方法
　　　　　{
　　　　　　s=new int[n];
　　　　　 }
　　　 boolean over ( )　//　判断当前线性表是否满方法
　　　　　　{ if (top>=s.length -1)
　　　　　　　　return true;
　　　　　　　else
　　　　　　　　return false;
　　　　　　}
　　　　　boolean empty ( )　//　判断当前线性表是否空方法
　　　　　　{ if (top<0)
　　　　　　　　return true;
　　　　　　　else
　　　　　　　　return false;
　　　　　　}
　　　　　int search(int x)　//　查找线性表中有否数据返回其标ind的方法
　　　　　　{ 
　　　　　　　int i=0,flag=0,ind=-1;
　　　　　　　while (flag==0 && i<=top)
　　　　　　　　if (s[i]==x)
　　　　　　　　　{ ind=i;
　　　　　　　　　　flag=1;
　　　　　　　　　}
　　　　　　　　else
　　　　　　　　　++i;
　　　　　　　　　　return　ind;
　　　　　　　　　}
　　　　　　}
　　　　　class stack extends lineart able　//　 栈子类
　　　　　　{ stack(int n)
　　　　　　　　{
　　　　　　　　　super(n);　//　继承并重用线性表父类建立线性表方法来建立大小为n、栈顶指针为top的栈s
　　　　　　}
　　　　　void insert( int x)　//　栈子类特有的压栈方法
　　　　　　{ if (super.over())　//　//　继承并重用线性表父类的判断栈是否溢出方法
　　　　　　　　System.out.println("The stack is over !");
　　　　　　　　　else
　　　　　　　　{ ++top;
　　　　　　　　　s[top]=x;
　　　　　　　　}
　　　　　　}
　　　　　int delete()　//　栈子类特有的出栈方法
　　　　　　{ int y;
　　　　　　　y=-1;
　　　　　　　if (super.empty())　//　继承并重用线性表父类的判断栈是否为空方法　　　　　　　　　　System.out.println("The stack is empty !");
　　　　　　　else
　　　　　　　　{ y=s[top];
　　　　　　　　　--top;
　　　　　　　　}
　　　　　　　return y;
　　　　　　}
　　　　}
　　此外，队列也是另一种有序线性结构。因此，利用继承机制和重载技术并参考栈类的实现，很容易实现队列类重用线性表类的数据和有关方法。
　　由此可见，利用继承机制和重用技术将标准、可靠的软构件组装应用软件系统，一方面可以减少大量重复性劳动，有助于快速开发软件系统的原型、提高软件生产率；另一方面可以大大降低应用系统的出错率，提高新开发的软件系统的可靠性、可维护性和可扩充性；从而大大促进、增强软件的可用性和适应性。
3  结语
　　Java是一种纯面向对象、跨平台、可重用、健壮、安全、支持语言级多线程并发技术的分布式计算环境，它与Web技术的有机结合尤其适宜进行网络计算和动态多媒体信息的并发处理。相信Java计算技术在21世纪将在网络计算、并行和分布处理、多媒体和虚拟现实技术以及科学与工程计算等领域得到广泛的应用。
基金项目：广西自然科学基金（9712010）和广西教委科研基金（S96308）
作者简介：钟诚（1965～），男，副教授，主要研究并行计算、基于Java的分布式系统应用和数据安全等
作者单位：广西大学计算机与信息工程学院，南宁　530004
参考文献
1 Sun Microsystems Inc.Java Computing.http://www.sun.com,1996
2 王克宏主编，郁欣 ,王曦东,姜河编著.Java语言编程技术,北京：清华大学出版社,1997
3 毛新军,齐治昌.软件重用研究与应用.计算机科学,1994,21(4)： 65--67
4 蒋学锋,钟诚,许鸿川.软件工程.重庆：重庆大学出版社,1997
5 苏德富,钟诚,薛弘哗.数据结构.重庆：重庆大学出版社,1997
收稿日期：1999-01-20
