java编程思想-第一章对象导论精简

1.1抽象过程

人们所能够解决的问题的复杂性直接取决于抽象的类型和质量。将现实世界中的问题转化为抽象世界中的元素。
在汇编语言时代,抽象过程是:将所要解决的问题的结构映射为计算机的结构。因为汇编语言是对底层机器的轻微抽象。
这种映射非常费力,且维护代价高昂。
面向对象(OOP)根据问题来描述问题,将问题空间中的元素及其在解空间中的表示均称为“对象”。
面向对象程序的特点:
1)万物皆为对象
2)程序时对象的集合,它们通过发送消息来告知彼此所要做的
3)每个对象都有自己的由其他对象所构成的存储
4)每个对象都有其类型

5)某一特定类型的所有对象都可以接收同样的消息。

对象具有状态、行为和标识

1.2每个对象都有一个接口 

每个对象都只能满足某些请求,这些请求由对象的接口所定义,决定接口的便是类型。
接口确定了对某一特定对象所能发出的请求。

在程序中必须有满足这些请求的代码,这些代码与隐藏的数据一起构成了实现。

在类型中,每一个可能的请求都有一个方法与之相关联,当向对象发送请求时,与之相关联的方法就会被调用。

1.3每个对象都提供服务

当正在试图开发或理解一个程序设计时,最好的方法之一就是将对象想象为“服务提供者”。
将对象看作是服务提供者还有一个附带的好处:它有助于提高对象的内聚性。
高内聚是软件设计的基本质量要求之一:这意味着一个软件构件的各个方面“组合”的很好。

人们在设计对象时所面临的一个问题是,将过多的功能都塞在一个对象中。

而在良好的面向对象设计中,每个对象都可以很好地完成一项任务。

1.4被隐藏的具体实现

 将程序开发人员按照角色分为 类创建者 (那些创建新数据类型的程序员)
客户端程序员 (那些在其应用中使用数据类型的类消费者)。
 对于类内容的具体实现,对客户端程序员施加访问控制有两个原因:
1)客户端程序员无法触及他们不应该触及的部分
2)允许库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序员

Java用三个关键字在类的内部设定边界:public、private、protected

Java有一种默认的访问权限:包访问权限,即类可以访问在同一个包中的其他类的成员,但是在包外,这些成员如同指定了private。

1.5复用具体实现

 产生一个可复用的对象设计需要丰富的经验和敏锐的洞察力。
代码复用是面向对象程序设计语言所提供的的最了不起的优点之一。
 复用类的方式:1.直接使用类对象,2在新类中创建成员对象。
组合的概念:使用现有的类合成新的类。即“has-a”(拥有)关系,如“汽车拥有引擎”
聚合:组合是动态发生的。
在创建新类时,应该首先考虑组合,因为它相比于继承更加简单灵活。

1.6继承

 两种方法使基类与导出类产生差异:1.直接在导出类中添加新方法,2.改变现有基类的方法的实现(称之为覆盖overriding)

这样基类与导出类的关系分别对应着:"是一个"(is-a)和像是一个(is-like-a)。

是一个”也可被视为纯粹替代,通常称为替代原则

1.7伴随多态的可互换对象

前期绑定:非面向对象编程的编译器会产生对具体函数名字的调用,运行时将这个调用解析到将要被执行的代码的绝对地址。

后期绑定:在OOP中,背带敖勇的代码直到运行时才能确定。

为了执行后期绑定,Java使用一小段特殊的代码来替代绝对地址调用。这段代码使用在对象中存储的信息来计算方法体的地址。

在某些语言中,必须明确地声明希望某个方法具备后期绑定属性所带来的灵活性(C++是使用virtual关键字来实现),

在这些语言中,方法在默认情况下不是动态绑定的。

在Java中,动态绑定是默认的。

1.8单根继承结构

在OOP中,所有的类最终都继承自单一的基类

单根继承结构使垃圾回收器的实现变得容易的多,而垃圾回收器正是Java相对C++的重要改进之一。

由于所有对象都保证具有其类型信息,因此不会因无法确定对象的类型而陷入僵局。

这对于系统级操作(如异常处理)显得尤为重要,并且给编程带来了更大的灵活性。

1.9容器

在解决特定问题时,不能事先知道需要多少个对象,或者对象存活多久,这样就不知道如何存储这些对象以及需要的空间,因为只有在运行时才能知道。

于是创建另一种对象类型(Java中称为容器)应运而生,这种新的对象类型持有对其他对象的引用。

1.9.1参数化类型

Java SE5的重大变化之一就是增加了参数化类型,即泛型。一对尖括号,中间包含类型信息,通过这些特征就可以识别对泛型的应用。

ArrayList shapes = new ArrayList();

在Java SE5出现之前,容器存储的对象都只具有Java中的通用类型:Object。单根继承结构意味着所有对象类型都是Object类型,
所以可以存储Object的容器可以存储任何对象。当将对象A引用置入容器时,对象必须被向上转型为Object,此时会丢失其身份(A类型)。
当取出对象A时,就只能获取到Object对象的引用,而不是置入时的那个类型A。这时就需要用到向下转型,我们知道,向上转型是安全的。
例如:Circle是一种Shape类型,但是不知道某个Object是Circle还是Shape,所以除非确切知道所要处理的对象的类型,否则向下转型几乎是不安全的。
然而向下转型并非彻底是危险的,因为如果向下转型为错误的类型,就会得到被称为异常的运行时错误。

所以,当从容器中取出对象引用时,有必要知道这些这些对象的类型,这样才能执行正确的向下转型。

参数化类型就可以解决不需要向下转型且能消除犯错误的可能,就显得非常有意义。

1.10对象的创建和生命期

为了保证较高的灵活性,Java采用了动态内存分配方式,即在堆中动态的创建对象。这种方式下,直到运行时才知道对象类型、对象数量、生命周期等。

为了及时回收对象占用的空间,Java采用了垃圾回收机制。垃圾回收器“知道”对象何时不再被使用,并自动释放对象占用的内存。

这一点同所有对象都是继承自单根基类Object以及只能在堆上创建对象这两个特性结合起来。

1.11异常处理:处理错误

Java语言中内置了异常处理,并且强制你必须使用它。它是唯一可接受的错误报告方式,如果没有编写正确的处理异常的代码,就会得到一条编译时的出错消息。

异常处理不是面向对象的特征,因为异常处理在面向对象语言出现之前就已经出现了。

1.12并发编程

Java语言中内置了并发,Java SE5增添了大量额外的库支持。

1.13Java与Internet

1.13.1 Web是什么

1)客户/服务器计算技术

2)Web就是一台巨型服务器

1.13.2客户端编程

1)插件

2)脚本语言

3)java,java中的applet是只在Web浏览器中运行的小程序。但是运行applet需要安装java运行时环境(JRE),这使得Java applet始终没有得到大规模应用

4).NET和C#

 .NET平台大致相当于Java虚拟机(JVM,即执行Java程序的软件平台)和Java类库。

1.13.3服务器端编程

基于Java的Web服务器,使用Java编写servlet的程序来实现服务器端编程。

1.14总结

编写良好的Java 程序比过程型程序要简单的多,而且也易于理解的多。

Java中涉及两部分内容的定义:

 用来表示问题空间概念的对象

 发送给这些对象的用来表示在此空间内的行为的消息





你可能感兴趣的:(java)