Java ADT总结

面向对象基本知识

抽象方法和抽象类

Java中使用了一种抽象的技术,可以使用abstract关键字声明方法和类,抽象的含义是"声明而不实现",但在抽象类的子孙类中必须至少有一个抽象方法的重写,否则则会发生编译时的错误.

抽象类是不能被实例化的,也就是说,在一行使用new新建对象的代码中,抽象类只能出现在左边而不能出现在右边.抽象类可以包含抽象方法和实例方法或静态方法,并且可以定义和重载构造方法,虽然抽象类不能被实例化,但是此处的构造方法可以被子类调用.

抽象方法只能在抽象类中出现,并且不能用private和static声明,这是因为抽象方法必须被子类实现,所以至少需要在子类中可见,不能使用static的原因是static是不会被重写的.一个正确的抽象类声明如下

public abstract class abClass{
    public abstract void abMethod(.../*参数列表*/);
} 

接口是一种特殊的抽象类,接口中不能声明成员变量,并且所有方法都为抽象方法,不能在接口中实现.

继承和实现

Java有两种继承类的方式,extends和implements.extends是普通的继承,子类继承父类的所有成员变量和实例方法,如果父类是一个抽象类,含有抽象方法,那么子类必须在自己或自己的子类中实现这些抽象方法.一个子类只可以继承一个父类,这是为了避免一些复杂而隐晦的的重名问题例如菱形问题.

如果需要多继承,就可以使用implements,implements的对象只能是接口类,并且必须实现父类中的每个抽象方法,除此之外也可以定义更多的成员变量和方法.


ADT

ADT是抽象数据类型(Abstract Data Type)的简称.对客户端来说,ADT是一系列变量和算法的集合,它实现了一定的功能,满足客户使用的需要;对开发者来说,ADT还是表示和方法的优秀封装,它适当地隐藏一些表示,并且适当地展示出便于客户使用的模块,主要包括构造器,生产器,变值器,观察器.在客户的视角,一个设计优秀的ADT应当是"公理化定义"的,在使用时不需关注"它是什么",而是关注"它是怎样的/它能做什么".

ADT的表示描述了这个数据结构"是什么",是实现各种计算求值的基础,因此它是完全由开发者设计和管理的,并且对客户不可见.下面介绍有关表示的几个概念.

  • 表示独立性(Rep Independence)
  • 表示不变量(Rep Invariant, RI)
  • 抽象函数(Abstract Function, AF)

表示独立性

我们说一个ADT有良好的表示独立性,就是说客户在使用ADT时不必关心内部表示是怎样的,所有操作的使用方法和效果都在开发者和客户约定的spec中描述清楚,明确规定输入量的约束条件和输出量的形式,并且开发者需要保证在输入正确的情况下输出的正确性和安全性.这就引出了另一个概念:表示泄露,指的是客户通过某些操作(例如调用观察器等)直接得到了ADT的内部表示,这就可能带来一些安全问题.

举例来说,假设一个ADT myArray实现了一个可变数组,它有一个观察器方法subArray()返回数组的指定的一个子数组,如果这个方法只返回一个对子数组首位的引用,那么客户在得到这个引用后,就可以直接操控myArray的内部表示,然而客户这样的操作是合理的,因为他有可能需要对得到的数据进行一些过滤或增加,但又不希望改变原数组的内容.防止表示泄露的一种有效方法就是防御性拷贝,在上面的例子中也就是让subArray返回一个新的myArray对象,其内容为拷贝自原对象的客户所需的内容.

表示不变量

表示不变量是在任何操作序列执行后表示需要满足的一些条件.最基本的一个表示不变量就是可变/不可变性,它是指该类能否在不创建新对象的情况下改变对象内容的性质.除此之外,ADT还应该定义一些其他的RI,并适时地检查是否符合RI,RI的定义依赖于ADT的性质,例如对集合来说,RI还应该有包含的元素两两不同,对于三角形来说,应该保证边长为正,两边之和大于第三遍,两边之差小于第三边.通常在构造器,生产器,变值器完成其工作并返回之前都应检测是否符合RI.

抽象函数

抽象函数描述了对表示的抽象,表示只能说是对一种实际事物的代码层面的抽象,距离数学上的抽象还有一定距离.抽象函数就描述了这段距离是如何行进的.

形式化地描述,AF:R→A,其中R为表示的集合,A为表示的抽象描述的集合.开发者更关注集合R,而客户更关注集合A(事实上他们只能从spec描述的操作得知A).AF一定是一个满射,因为抽象集合中的每个元素都应至少由一种表示实现;AF不一定是单射,可能存在多种表示实际上能被一种抽象所描述,例如,在一个三角形类中,用一个数组sides保存三个边,那么

sides = [3,4,5]

sides = [4,5,3]

两种表示实际上是同一个边长分别为3,4,5的三角形.

总结

一个好的ADT应当像一个精密的机器一样工作,它应当充分地告知使用者操作的方法和结果,以及如何得到产品的信息;同时它应当保护好内部的结构,不给使用者破坏和篡改它的机会;最重要的,它应当保证结果的正确性,并在此基础上具有优秀的性能.

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值