HIT 软件构造 OOP(面向对象)

interface

safe from bugs
easy to understand
ready for change

Enumerations

在值集比较小的时候,使用枚举比使用常量接口更加方便

封装和信息隐藏

信息隐藏和封装是软件设计的基本原则

信息隐藏的好处

解耦组成系统的类
类之间可以并行的发展
维护起来很简单
启用有效的性能调优
有利于软件复用

信息隐藏的方法

使用接口类型声明变量
客户端仅使用接口中定义的方法
客户端代码无法直接访问属性

inheritance and overriding

overriding

严格继承:限制子类只能添加新的方法,而不能重写父类中的方法(这就要求必须使用final关键字)
注意重写的时候不能改变原方法的本意

abstract class

抽象方法和抽象类应该使用关键字abstract,并且一个抽象类中至少要有一个抽象方法

polymorphism, subtyping and overloading

多态的三种类型
  1. 特殊多态:函数的功能重载
    多个函数有形同的名字,但又不同的参数列表和返回值类型
    在编译阶段决定要执行哪个方法,与之相反,overridden则是在run-time进行动态检查
  2. 参数化多态:使用泛型
    类型变量是非限定标识符,我们有泛型类、泛型接口、泛型方法
    这里有一些展示

泛型编程注意事项:
通配符只在使用泛型的时候出现,不能在定义中出现
泛型在运行的时候就消失了
不能用泛型定义数组
比如,这样定义数组是不正确的:
Pair[] foo = new Pair[42];
3. 使用子类型
简单的说,一个子类型是一个父类型的子集
在使用子类型的时候,编译器是不能检查我们是否将spec进行弱化了,但是我们要保证这一点一定不会发生
也就是子类型的规约不能弱化父类型的规约
在java中,子类强转成父类没有任何问题,但是父类想强转成子类,则这个对象必须是使用子类new出来的

static and dynamic dispatch

dynamic method dispatch

在编译阶段:

  1. 决定要查看哪一个类
  2. 决定将要执行的方法名(找到所有可能的方法)
    在运行阶段:
  3. 确定具体的类(父类还是子类)
  4. 根据类查找方法
dispatch

静态分派:在编译阶段即可决定要执行哪个具体操作
动态分派:指的是在运行过程中决定要调用多态的哪个实现
重载方法使用静态分派(binding),而重写方法在运行时决定

binding

绑定:将调用的名字与实际的方法名字联系起来
分派:具体执行哪个方法
动态分派和推迟绑定是不一样的
early /static binding:
如果有static,private,final类型的方法,都是在编译阶段绑定的

HIT 软件构造 OOP(面向对象)

有关java中object的重要方法

重写hashcode

可以自己定义一个规则
可以使用一个rep的变量的hashcode代替

如何写出immutable的类

  1. 不要提供任何mutator的方法
  2. 确保没有方法能被重写
  3. 所有的额fields都是final、private
  4. 避免表示泄漏
  5. 实现tostring,hashcode,clone,equals
    欢迎关注公众号BBIT
    让我们共同学习共同进步!

    HIT 软件构造 OOP(面向对象)

来源:~泊舟~

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年5月10日
下一篇 2019年5月10日

相关推荐