【软件构造】面向对象的编程

本文主要介绍一些OOP的特殊知识,是完全的讲述。

说到OOP就不得不提一下ADT(抽象数据类型),他的强调作用于数据之上的操作,并不关心数据具体是怎么存储的。通过使用ADT,还能更好的隐藏我们的rep,对我们的代码有更好的保护功能。

类与接口:接口相当于规定了ADT所需的未实现的操作(方法),这是用户所关注的。类真正地在代码层面实现了接口规定的ADT操作,并且实现了ADT内部的数据存储。通过使用这个方法,可以将我们的操作进行隐藏。接口实际上可以通过default或者static直接编写方法实现

方法规约(spec):规约是客户端与实现者之间签订的“契约”,客户端的输入应当满足前置条件,实现者编写的程序应当给出满足后置条件的结果。规约描述了方法的功能以及接口(“能做什么”),不需要依赖(也不应该透露)方法的具体实现。更强的规约:前置条件更弱,后置条件更强。规约图:更强的规约表示为更小的区域(因为满足它的方法更少)

AF/RI/rep:对于ADT,客户端是无法看到其内部表示属性(rep)的,客户端只会看到ADT在表面上展现出来的东西,即,ADT做了一个由表示空间(R)到抽象空间(A)的映射AF。 不是所有表示属性rep都能映射到相应的抽象值的(即有一些rep是非法的),那么任何时刻ADT的rep都必须满足一定规则(合法),即表示不变量RI。有时应该引入一个方法checkRep检查rep是否满足RI。给客户端展现出的是一个字母集合(抽象值),然而实际上的数据是一个字符串(表示值),ADT正是使用操作们对这个字符串做了特殊的“解读”,实现了AF

表示独立性与表示泄露:表示独立性是指,客户端使用ADT时无需考虑(也不应该知道,更不应该直接访问到)其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。 如果ADT不幸地让客户端得到了自己内部表示(可变对象)的引用,那么客户端就可以不通过ADT的操作,而可以通过非法后门修改ADT的内部表示,产生表示泄露。对于表示泄露,我们常用的方法是防御型拷贝,在可能会泄露的地方,使用拷贝的文件代替他,这样就能有效的防止泄露。

继承与重写:一个类child可以继承另一个类father的全部方法与属性,在运行时存在继承关系的类型对象可以互相转换。子类型也可以重写(override)父类的方法,替换为自己的实现代码。在运行是,父类不要向下转换到子类,可能会引发异常,但是子类向上转换到父类是没有问题的。

接口与继承: 容器类可以有不同的底层实现,但它们的操作都较为统一,表示为接口实现的形式。所有引用类型的最终祖先类都是Object,都具有等价性判断equals()、哈希函数hashCode()和字符串转换toString()方法,可以重写它们。 Integer、Double等表示数值的引用类型(跟int、double这些非引用的内置类型并非一回事!)都继承自Number类,都具有转换为其它数值类型的方法(例如intValue())。所有异常类都继承自Exception,对于父异常的catch能够捕获子异常。

关于equals:所有对象都继承了Object.equals(),我们可以在类中重写它,从而定义自己的等价规则。注意equals()与==不是一回事,后者仅仅判断两个引用是否指向同一对象。如果不重写
Object.equals(),那么默认效果和==是一样的。

重载: 重载(overload)机制使得同一个类中的多个方法可以有相同的名字,前提是它们
有长度不同的参数列表,或者对应不同的参数类型,起码,得让编译器在进行静态
检查的时候通过你调用时传入的参数判断实际上应该选择哪个方法。重载也可以发
生在父类与子类之间(子类重载父类的方法)。

泛型:泛型是参数化多态的实现机制,它能够将类型作为类/方法的参数,使得操作与类型无关。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值