一、对象导论
面向对象程序设计(OOP)
抽象过程
1.1java的五个基本特性
**1.万物皆为对象。**它可以存储数据,还可以在自身上执行操作。例如把人当是一个类,教师,医生,工人都可看为一个对象即类的实例。
**2.程序是对象的集合,它们通过发送消息来告知彼此所要做的。**要想请求一个对象,就必须对该对象发送一条消息。可把消息想象为对某个特定的对象方法调用请求。
**3.每个对象都有自己的由其他对象所构成的存储。**通过创建包含现有对象的方式来创建新类型的对象。
**4.每个对象都拥有其类。**每个对象都是某个类的实例,类就是类型的同义词。每个类最重要的区别于其他类就是“可发送什么消息给它”。
5.某一特定类的所有对象都可以接受同样的消息。“圆形”类型对象同时也是“几何形”类型的对象,所以一圆形对象必定能接受发送给几何形对象的消息。这意味可编写几何形交互并自动处理所有与几何形性质相关事物的代码即可替代性。
对象具有状态、行为和标识。这意味每个对象都可拥有内部数据(对象的状态)和方法(它们产生行为),并且每一个对象都可唯一地与其他对象区分开来,每一个对象在内存中都有一个唯一的地址。
1.2每个对象都有一个接口
类描述了具有相同特性(数据元素)和行为(功能)的对象集合,一个类实际就是一个数据类型。
一旦类被建立,即可随心所欲的创建类的任意个对象,然后去操作他们,就想他们是存在与你的待求解问题中的元素一样。面向对象程序设计的挑战之一即为问题控件的元素和解空间的对象之间创建一对一的映射。
怎样获得有用的对象?
必须要有某种方式产生对对象的请求,使对象完成各种任务,例如完成一笔交易,打开开关等等。
每个对象只能满足某些请求,这些请求由对象的接口(interface)所定义,决定接口的便是类
例如
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hvwVqFk7-1594454519605)(C:\Users\srqnk\AppData\Roaming\Typora\typora-user-images\1591624016117.png)]
Light lt = new Light();
lt.on();
接口确定了对某一特定对象所能发出的请求。在程序中必须有满足这些请求的代码。在类中每一个可能的请求都有一个方法与之相关联,当向对象发送请求时,与之相关联的方法就会调用。通俗的理解为:向某个对象“发送消息(产生请求),这个对象便知道此消息的目的,然后执行对应的程序代码”
1.3每个对象都提供服务
将对象设为“服务提供者”。他们能够提供哪些服务?他们需要哪些对象才能履行他们的义务?
这种幻想有助于提高对象的内聚性。即是我们经常要求的一个好的软件的重要条件就是高内聚、低耦合,说的是这个软件构件组合的好。避免将过多的功能都塞在一个对象上。
举一个例子:检查打印模式的模块中,你可以设计一个对象,让它了解所有格式和打印技术,其中一个对象可以是所有可能的支票排版的目录,他可以被用来查询有关如何打印一张支票的信息;另一个对象(或对象集合)可以是一个通用的打印接口,它知道有关所有不同类型的打印机的信息(但是不包含任何内容,它更该是一个需要购买而不是自己编写的对象);第三个对象通过调用另外两个对象的服务来完成打印任务。这样每个对象都有一个它所能提供服务的内聚的集合。
1.4被隐藏的具体实现
我们大致将程序开发人员按照角色分为类创建者(创建新数据类型的程序员)和客户端程序员(在应用中使用数据类型的消费者)。类创建者只向客户端程序员暴露必须的部分,而隐藏其他部分。即客户端程序员不能访问,避免客户端程序员修改造成不必要的bug。第二个原因允许库设计者可改变类内部的工作方式而不用担心影响客户端程序员。例如:你为了减轻开发任务以某种简单方式实现某个特定类,售后你发现必须改写才能使其运行更快。若接口和实现可清晰分离并得以保护,那么你就可轻而易举完成。
这里就提到了三个关键字访问控制符:public、private、protected。
- public:表示任何人都可用
- private:除类型创建者和类型的内部方法之外的任何人都不能访问。
- protected:与private作用相当,区别在于继承的类可访问protected成员,但不能访问private成员
1.5复用具体实现
代码复用是面向对象程序设计了不起的优点之一。
最简单的复用某个类方式就是直接使用该类的一个对象,此外也可将那个类的一个对象置于某个新的勒种(创建一个成员对象)。新类可由任意数量、任意类型的其他对象以任意可以实现新的类中想要的功能的方式所组成。因使用现有的类合成新类,将其称为组合,若组合是动态发生的(即为聚合)。组合常被看做拥有关系,例如“汽车有引擎”一样。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D04KaFZS-1594454519610)(C:\Users\srqnk\AppData\Roaming\Typora\typora-user-images\1591689993059.png)]
组合带来了极大的灵活性。新类成员对象通常被声明为private。下面讨论的继承并不具备这样的灵活性,因此编译器必须对通过继承而创建的类实施加编译时的限制。
1.6继承
在创建一个类后,即使另一个新类与其具有相似功能,还是得重新创建一个新类。要是能以现有类为基础,复制他,然后通过添加和修改这个副本来创建新类就好多了。继承就实现了这个概念。
不过也有例外,当源类(基类,超类或父类)发生变动时,被修改的“副本”(导出类、继承或子类)也会反映出这些变动,如图(通常会存在一个以上的导出类)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GVc1cW51-1594454519612)(C:\Users\srqnk\AppData\Roaming\Typora\typora-user-images\1591711960431.png)]
一个基类型包含其所有导出类型所共享的特性和行为。可创建一个基类型来表示系统某些对象的核心概念,从基类型中导出其他类型,来表示此核心可被实现各种不同方式。
有两种方法可使基类与导出类产生差异。
- 直接在子类中添加新方法。这些新方法并不是基类接口的一部分。
- 改变现有基类的方法的行为。重写,使用相同接口方法,但在子类中做不同的事情
1.6.1 “是一个”与像是一个“关系
is-a简单来说就是单纯的继承;is-like-a在继承的基础上它需要添加新的元素。
1.7伴随多态的可互换对象
在“几何形”例子中,方法操作都是泛华的形状,而不关心他们是圆形,正方形还是其它形状。所有的几何形状都可被绘制,擦除和移动,所以这些方法都是直接对一个几何形对象发送消息;他们不用担心对象将如何处理消息。
//此方法可与任何Shape对话,因此它独立于任何它要绘制和擦除的对象的具体类型的。
void doSomething(Shape shape){
shape.erase();
shape.draw();
}
//doSomething()调用会自动正确处理,而不管对象的确切类型
Circle circle = new Circle();
Line line = new Line();
doSomething(line);
//当Circle被传入到预期接受Shape方法中,由于Circle可被doSomething()看做为Shape,也就是说,doSomething()可发送给Shape任何消息,Circle都可接收。
doSomething(circle);
1.8单根继承结构
终极基类的名字为Object。
单根继承结构中所有对象都具有一个共用接口,所以它们都是相同的基本类型。
保证了所有对象都具备某些功能,也使得垃圾回收器的实现变得容易很多
1.9 容器
容器也称为集合。例如List(有序可重复集合),Map(键值对),Set(唯一无需),以及诸如队列、树、堆栈等更多的构件。
不同容器提供了不同的类型的接口和行为
不同容器对于某些操作具有不同效率
1.9.1 参数化类型
向下转型不知道确切的对象类型,是不安全的。所以就出现了一种参数化类型,称为泛型来替代。
ArrayList<Shape> shapes = new ArrayList<Shape>();
1.10 对象的创建和生命期
java完全采用了动态内存分配方式。每当想要创建新对象时,就要使用new关键字来构建此对象的实例。
java提供了被称为“垃圾回收器”机制,可自动发现对象何时不再被使用,并继而销毁。
1.11 异常处理:处理错误
与程序正常执行路径并行的、在错误发生时执行另一条路径,它不会干扰正常的执行代码
1.12 并发编程
同一时刻处理多个任务的思想。中断对于处理时间性强的任务是必需的,但是对于大量的其他问题,我们只是想把问题切分成多个独立运行的任务,从而提高程序的相应能力。这些彼此独立运行的部分称为线程,上述概念被称为“并发”。
对于并发访问共享资源,当两个进程不能同时访问,先访问的加锁,任务结束再由第二个线程访问。
1.13 java与internet
1.13.1 Web是什么
1.客户/服务器计算技术(C/S)
系统具有一个服务器,存储着其中业务数据。通过用户机器上的软件与服务器进行通信,将这些信息显示在用户机器上。(可通过客户端机器处理任务减轻负载,或者通过中间件将负载分散给服务器端的其他机器。
2.Web是一台巨型服务器(B/S)
提供交互性内容,但是其交互性完全由服务器提供。
1.13.2 客户端编程
引入客户端浏览器中运行程序的能力。
1.插件
下载一段代码,并将其插入到浏览器中适当位置,以此来为浏览器添加新功能
2.脚本语言
将客户端程序的源码嵌入到HTML页面中,缺点暴露给任何人去浏览。用来解决特定类型的问题,主要用来创建更丰富、更具有交互性的图形化用户界面(GUI)。
3.java
java不仅是一种功能强大的、安全的、跨平台的、国际化的编程语言,而且它在不断的被扩展,以提供更多的语言功能和类库,能优雅的处理在传统编程语言中很难解决的问题,例如并发、数据库访问、网络编程和分布式计算。java通过applet以及使用java web start来进行客户端编程。
applet是web浏览器中的小程序,被激活时便开始执行一个程序,提供分发软件的方法,java解释器内置在浏览器中,不必等服务器计算。
4.备选方案
Flex允许你创建基于Flash与applet相当的应用,在编程时无需担心浏览器的相关性。
5.NET和C#
6.Internet与Intranet
Intranet(企业内部网),通过特定的ip限制访问
1.13.3 服务器端编程
数据库的请求操作与servlet后端的编程有关
置在浏览器中,不必等服务器计算。
4.备选方案
Flex允许你创建基于Flash与applet相当的应用,在编程时无需担心浏览器的相关性。
5.NET和C#
6.Internet与Intranet
Intranet(企业内部网),通过特定的ip限制访问
1.13.3 服务器端编程
数据库的请求操作与servlet后端的编程有关