我们之所以将自然界分解,组织成各种概念,并按其含义分类,主要是因为我们是整个口语交流社会共同遵守的协定的参与者,这个协定以语言的形式固定下来。除非赞成这个协定中规定的有关语言信息的组织和分类,否则我们根本无法交谈。
-Benjamin Lee Whorf(1897~1941)
抽象过程
所有编程语言都提供抽象机制。
所谓“类型”是指“所抽象的是什么?”。
汇编语言是对底层机器的轻微抽象。
FORTEAN、BASIC、C 是对汇编语言的抽象。
OOP允许根据问题来描述问题,而不是根据运行解决方案的计算机来描述问题。
OOP的五个基本特征:
1、万物皆对象。
2、程序是对象的集合,他们通过发送消息来告知彼此所要做的。
3、每个对象都有自己的由其他对象所构成的存储。
4、每个对象都拥有其类型。
5、某一特定类型的所有对象都可以接收同样的消息。
每个对象都有一个接口
因为类描述了具有相同特性(数据元素)和行为(功能)的对象集合,所以一个类实际上就是一个数据类型。
面向对象程序设计的挑战之一,就是在问题空间的“元素”和解空间的“对象”之间创建一对一的映射。
向某个对象发送消息,这个对象便知道此消息的目的,然后执行对应的程序代码。
每个对象都提供服务
当你试图开发或理解一个程序设计时,最好的方法之一是将对象视为“服务提供者”。
将对象看作服务提供者有助于提高对象的内聚性。
良好的面相对象设计,每个对象都可以很好地完成一项任务,但是它并不试图做更多的事。
被隐藏的具体实现
程序开发人员按角色可分为“类创建者”和“客户端程序员”。
访问控制存在的两个原因:
1、让客户端程序员无法触及他们不应该触及的部分。
2、允许类设计者改变类内部的工作方式且不会担心影响到客户端程序员。
复用
代码复用是面向对象程序设计语言所提供的最了不起的优点之一。
使用现有的类合成新的类,被称为“组合”,如果组合是动态发生的,被称为“聚合”。
继承
一个基类型包含其所有导出类所共享的特性和行为。
可以创建一个基类来表示系统中某些对象的核心概念,从基类型中导出其他类型,来表示此核心可以被实现的各种不同方式。
所有可以发送给基类型对象的消息同时也可以发送给导出类对象。
多态
通过导出新的子类而轻松扩展设计的能力是对改动进行封装的基本方式之一。
后期绑定:面向对象程序设计中,编译器产生一个对具体函数名字的调用,在运行时将这个调用解析到被执行代码的绝对地址。
C++中使用关键字virtual关键字来声明某个方法为后期绑定属性。
JAVA中动态绑定是默认行为,不需要添加额外的关键字。
将导出类看作是它的基类的过程称为向上转型。
单根继承
JAVA中,所有的类都继承自单一的基类,这个终极基类就是Object。
垃圾回收器是JAVA相对C++的重要改进之一。
参数化类型
JAVA SE5之前,容器存储的对象都只具有JAVA中的通用类型:Object。
JAVA SE5重大变化之一是增加了“参数化类型”,在JAVA中称为范型。
一对尖括号,中间包含类型信息,通过这些特征就可以识别对范型的使用。
对象创建和生命周期
JAVA完全采用动态内存分配方式,基本类型只是一种特例。
每当想要创建新对象时,就要使用new关键字来构建此对象的动态实例。
JAVA的垃圾回收器被用来设计处理内存释放问题,垃圾回收器“知道”对象何时不再被使用,并自动释放对象占用的内存。
并发
JAVA的并发是内置于语言中的,JAVA SE5增加了大量额外的库支持。
客户端编程
JavaScript 在Web浏览器上不需要任何插件的情况下就可以得到支持,它之所以这样命名,只是因为想赶上JAVA的潮流。
大多数Web浏览器最初都是以彼此相异的方式对JavaScript进行支持(例如微软推出的VBScript)。
Java Applet是JAVA推出的客户端可编程方案。
Java Applet最大的问题是需要在浏览器中安装Java运行时环境,所需要的10兆带宽对于一般用户来说是恐怖的。
微软的IE(Internet Explorer)中没有包含JRE这一事实封杀了applet的命运。
微软的.NET和C#成为了JAVA的全面竞争对手。
Microsoft | Sun |
---|---|
.Net & C# | Java |
ActiveX | Java Applet |
VBScript | Java Script |