JAVA中ADT的知识点

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

      抽象数据类型与表示独立性:如何设计良好的抽象数据结构?

       通过封 装来避免客户端获取数据的内部表示(即“表示泄露”),避免潜在 的bug
       
        ADT的特性:表示泄漏、抽象函数AF、表示不变量RI
       基于数学的形式对ADT的这些核心特征进行描述并应用于设计中。
       除了编程语言所提供的基本数据类型和对象数据类型,程序员可定义自己的数据类型
       对于抽象数据类型与传统数据类型, 传统的类型定义:关注数据的具体表示。 抽象类型:强调“作用于数据上的操作”,程序员和client无需关心数据如何具体存储的,只需设计/使用操作即可
        对于ADT中的可变与不可变数据类型,可变类型的对象:提供了可改变其内部数据的值的操作。而不变数据类型: 其操作不改变内部值,而是构造新的对象。
 
上面的代码定义了一个类,我们声明一个MyString对象的时候只需要如下图
 
        因为此数据类型是不可变的,所以子字符串操作实际上不必将字符复 制到新的数组中。 它可以只指向原始MyString对象的字符数组,并跟踪新子字符串对象表示的开始和结束
       
表示不变性RI:某个具体的“表示”是否是“合法的” ,也可将RI看作:所有表示值的一个子集,包含了所有合法的表示值 ,也可将RI看作:一个条件,描述了什么是“合法”的表示值
选择某种特定的表示方式R,进而指定某个子集是“合法”的(RI),并为该子集中的每个值做出“解释”(AF)——即如何映射到抽象空间中的值。即使是同样的R、同样的RI,也 可能有不同的AF,即“解释不同”。
        同时 抽象方法只能在抽象类中出现,并且不能用private和static声明,这是因为抽象方法必须被子类实现,所以至少需要在子类中可见,不能使用static的原因是static是不会被重写的.
        举例来说,假设一个ADT myArray实现了一个可变数组,它有一个观察器方法subArray()返回数组的指定的一个子数组,如果这个方法只返回一个对子数组首位的引用,那么客户在得到这个引用后,就可以直接操控myArray的内部表示,然而客户这样的操作是合理的,因为他有可能需要对得到的数据进行一些过滤或增加,但又不希望改变原数组的内容.防止表示泄露的一种有效方法就是防御性拷贝,在上面的例子中也就是让subArray返回一个新的myArray对象,其内容为拷贝自原对象的客户所需的内容.

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值