概念
- 面向对象程序设计OOP:Object-oriented Programming
- CGI:common gateway interface
- Java中所有的类最终都继承自单一的基类Object=》有助于垃圾回收机制的管理
- Java采用动态内存分配方式,通过new在堆上创建对象
- internet:互联网 intranet:企业内部网
抽象
- 所有编程语言都提供抽象机制
- 问题的复杂性=抽象的类型(指抽象的是什么?)+抽象的质量(指抽象的效果如何?)
- 解空间:对问题建模的地方,如:计算机
- 问题空间:问题存在的地方,如:一项业务
基本特性(面向对象语言)
- 万物皆为对象:存储数据+行为操作
- 程序是对象的集合,它们通过发送消息来告知彼此所要做的
- 每个对象都有自己的由其他对象所构成的存储
- 每个对象都拥有其类型
- 某一特定类型的所有对象都是可以接收同样的消息
- 对象=状态(数据)+行为(方法)+标识(唯一地址)
类
- 类即抽象数据类型
- 采用class来表示数据类型
- 类描述了具有相同特性(数据元素)和行为(功能)的对象集合
对象
- 在良好的面向对象设计中,每个对象都可以很好地完成一项任务,而不是试图做更多的事=》职责单一原则
封装
- 理由
- 访问限定
- protected:对类创建者和类的内部方法可见,同时继承的类也可见
复用
- 组合 优于 继承
- 组合是has-a关系
- 继承表示具备相似性,可以构建类型层次结构;具备is-a 或 is-like-a 关系
- 继承的两种形态
多态
- 统一当作基类的对象对待,不依赖于特定类型
- 两种绑定方式:
- 静态绑定(或前期绑定):
在程序执行前方法已经被绑定(即在编译过程中就已经知道这个方法到底是哪个类中的方法)例如:java当中具有final,static,private的方法和构造方法
- 动态绑定(或后期绑定 java默认):
在运行时根据具体对象的类型进行绑定。若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。即编译器不知道对象的类型,但方法调用机制能自己去查找,找到正确的方法主体。常用措施:在对象中安插某些特殊类型的信息。
- 两种转型
-
向上转型:将继承类看作基类的过程
-
向下转型:将基类看作继承类的过程
注意:只能转化为本类对象
疑问:为何要做向下转型呢?常用于除了共性还是特性的情况
public void eat(Animal a){
if(a instanceof Dog){
Dog d = (Dog)a;
d.eat();
d.run();//狗有一个跑的方法
}
if(a instanceof Cat){
Cat c = (Cat)a;
c.eat();
System.out.println("我也想跑,但是不会"); //猫会抱怨
}
a.eat();//其他动物只会吃
}
范型
- 范型即参数化类型,用于解决集合记住内部元素的类型问题
ArrayList<Shape> shapes = new ArrayList<Shape>();
异常处理
- 异常是一种对象,从出错地方被抛出,并被专门设计用来处理特定类型错误的相应的异常处理器捕获
- 异常提供了一种从错误状况进行可靠恢复的途径
- 异常处理不是面向对象的特性
面向过程 与 面向对象
- 思想层面
- 面向过程是具体化的,流程化的
解决一个问题,需要一步一步分析需要怎样,然后需要怎样,一步一步实现的
- 面向对象是模型化的
抽象出一个类,这是一个封闭的环境,在这个环境中有数据有解决问题的方法,你如果需要什么功能直接使用就可以了,至于是怎么实现的,你不用知道
- 代码层面
面向对象和面向过程的主要区别就是数据是单独存储还是与操作存储在一起
- 示例
比如:开车、加速、减速、刹车
- 面向过程:先有一个车,然后这四个分别是4件事,也就是说你要写4个函数,分别是开车、加速、减速、刹车,这分别是四个事件,如果使用的话要调用4个函数
- 面向对象:我们关心的是车这个类,而不是开车、加速、减速和刹车这四个过程。这4个过程是车这个类的一部分,只是其中的一种行为,而且对于行为的顺序没有强制要求
网友评论