interface
safe from bugs
easy to understand
ready for change
Enumerations
在值集比较小的时候,使用枚举比使用常量接口更加方便
封装和信息隐藏
信息隐藏和封装是软件设计的基本原则
信息隐藏的好处
解耦组成系统的类
类之间可以并行的发展
维护起来很简单
启用有效的性能调优
有利于软件复用
信息隐藏的方法
使用接口类型声明变量
客户端仅使用接口中定义的方法
客户端代码无法直接访问属性
inheritance and overriding
overriding
严格继承:限制子类只能添加新的方法,而不能重写父类中的方法(这就要求必须使用final关键字)
注意重写的时候不能改变原方法的本意
abstract class
抽象方法和抽象类应该使用关键字abstract,并且一个抽象类中至少要有一个抽象方法
polymorphism, subtyping and overloading
多态的三种类型
- 特殊多态:函数的功能重载
多个函数有形同的名字,但又不同的参数列表和返回值类型
在编译阶段决定要执行哪个方法,与之相反,overridden则是在run-time进行动态检查 - 参数化多态:使用泛型
类型变量是非限定标识符,我们有泛型类、泛型接口、泛型方法
这里有一些展示
泛型编程注意事项:
通配符只在使用泛型的时候出现,不能在定义中出现
泛型在运行的时候就消失了
不能用泛型定义数组
比如,这样定义数组是不正确的:
Pair[] foo = new Pair[42];
3. 使用子类型
简单的说,一个子类型是一个父类型的子集
在使用子类型的时候,编译器是不能检查我们是否将spec进行弱化了,但是我们要保证这一点一定不会发生
也就是子类型的规约不能弱化父类型的规约
在java中,子类强转成父类没有任何问题,但是父类想强转成子类,则这个对象必须是使用子类new出来的
static and dynamic dispatch
dynamic method dispatch
在编译阶段:
- 决定要查看哪一个类
- 决定将要执行的方法名(找到所有可能的方法)
在运行阶段: - 确定具体的类(父类还是子类)
- 根据类查找方法
dispatch
静态分派:在编译阶段即可决定要执行哪个具体操作
动态分派:指的是在运行过程中决定要调用多态的哪个实现
重载方法使用静态分派(binding),而重写方法在运行时决定
binding
绑定:将调用的名字与实际的方法名字联系起来
分派:具体执行哪个方法
动态分派和推迟绑定是不一样的
early /static binding:
如果有static,private,final类型的方法,都是在编译阶段绑定的
有关java中object的重要方法
重写hashcode
可以自己定义一个规则
可以使用一个rep的变量的hashcode代替
如何写出immutable的类
- 不要提供任何mutator的方法
- 确保没有方法能被重写
- 所有的额fields都是final、private
- 避免表示泄漏

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!