Java编程思想 - 第一章、对象导论

| 分类 Java  | 标签 Java编程思想 

本章主题

这一章是介绍OOP的各种基本概念。

我们要知道OOP的全称是 Object-oriented Programming,面向对象编程,跟这个模型对立的就是面向过程编程。首先,我们来谈谈OOP的几个特性,这样在对比中我们就能发现使用OOP的好处和缺点,在选择时就多了一份衡量的标准。

###1. 抽象

所有编程语言都提供了抽象,一定程度上,解决问题的复杂性直接取决于抽象的类型和质量。就好比一个优秀的建筑师,能巧妙的兼顾外观和工程质量。在互联网方面,一个好的架构师,能让项目快速完成,并有良好的拓展性。

  • 在早期,汇编语言的出现第一次抽象了机器语言的01代码,后来出现了FORTRAN/BASIC/C等高级语言抽象了汇编语言,但这样抽象的不够彻底。因为这些高级语言和计算机硬件还有千丝万缕的关联。计算机是一个解空间,项目需求是问题空间,而联系这两者的就是抽象。如果我们使用C语言,我们就要兼顾项目需求和计算机硬件的限制,这样就增加了编程的难度。
  • 而后期出现的面向对象编程语言,比如Java,它的抽象程度更高,完全将解空间包括了。这样,只需要根据项目需求就可以完成所有的编程任务,使效率有了进一步的提升——我们只用考虑如何关注项目需求,其他的Java会帮我们搞定。

上面说的理论可能不好理解,我们举例子说明抽象是什么东西:

小狗、猫、乌龟、仓鼠、金鱼,都是常见的宠物。那么,我们就可以将具体的个体抽象成“宠物”这个概念。

###2. 接口

完成了抽象,所有东西都是一个独立的对象。对象之间的通信是用消息完成的。而消息是对象的方法发送的,每个对象都提供一系列的服务。在良好的面向对象设计中,每个对象都可以很好地完成一项任务,但是它并不试图做更多的事。这里面牵涉到高内聚的问题就不多说了。

###3. 访问权限

这个在代码的设计中是非常常见的,访问权限存在的两个原因:

  1. 让客户端程序员无法触及他们不应该触及的部分
  2. 允许库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序员

客户端程序员的目标是收集各种用来实现快速应用开发的类。类创建者的目标是构建类,这种类只向客户端程序员暴露必需的部分,而隐藏其他部分。为什么要这样呢?因为如果加以隐藏,那么客户端程序员将不能够访问它,这意味着如果想优化程序,完全不用担心对其他任何人造成影响。

###4. 复用

代码复用是一个值得研究的问题,比如抽象出来的A类和B类,区别只是B类添加了一个功能,剩下的东西一模一样。那么,我们就必须抽象2个几乎相同的类,但有了复用之后,我们就可以省略这个步骤——那就是运用继承。

继承的概念很简单,但是在实际使用中,究竟是使用继承还是使用组合就是一个值得斟酌的问题。这里不多做解释,留待具体章节中再详细讨论。

###5. 多态

这个算是OOP的一个核心,具体来说就是:

  • 非面向对象编程的编译器产生的函数调用会引起所谓的前期绑定,意味着编译器将产生对一个具体函数名字的调用,而运行时讲这个调用解析到将要被执行的代码的绝对地址
  • 然后在OOP中,程序直到运行时才能够确定代码的地址,所以当消息发送到一个泛化对象时,必须采用其他的机制。而Java采用的就是后期绑定技术。当向对象发送消息时,被调用的代码直到运行时才能确定

在某些语言中,必须明确声明某个方法具备后期绑定所带来的灵活性(C++是用过vitrual关键字实现的)。这这些语言中,方法在默认情况下不是动态绑定的,而在Java中,动态绑定是默认行为,不需要添加额外的关键字来实现多态

###6. 单根继承

Java权衡C++的利弊后,采用了单根继承。终极基类的名字就是Object。使用单根继承保证了所有类都具有Ojbect提供的方法。这在很多方法都是有用的,比如在输出的时候,会调用Ojbect的toString()方法,在垃圾回收的时候,因为是单根继承,垃圾回收机制能很容易的判别对象的类型。

###7. 容器

容器就是装一堆对象的地方,很多语言都提供了容器。比如C++的STL,Java则是提供了丰富的类库。当我们需要时,可以根据需求来使用不同的容器,比如ArrayList或者LinkdList就可以分别用在查找多和插入删除多的地方。

在Java SE5之前,容器只能装Object,这就带来很多不便。后来Java SE5提出了参数化类型,这样在使用容器时,可以提供容器的类型。比如ArrayList myClassList,这里使用了Java的泛型,后面再详细学习。

另外,在Java SE5之前,容器不能装那8种基本类型,但Java SE5之后,即使装入基本类型,容器也会自动给你包装,比如int包装成Integer,以此类推。

###8. 对象的创建和生命期

这个主要涉及的是对象创建需要的工作和垃圾回收机制

###9. 异常处理

很多语言的异常处理就是程序员自己掌握,但是Java把异常处理做成了内置,必须使用。这就保证了异常肯定会得到处理,它作为正常代码的后备,为整个程序的鲁棒性提供了强大的支撑。

###10. 并发编程

因为对多线程技术用的太少了,这里不多说了,主要就是2个问题:

  • 多线程的使用
  • 临界资源的加锁机制

###11. Java与Internet

这个稍微说一下。目前来说,越来越流行的是B/S架构,C/S架构因为太重,很多情况下都被B/S取代了。

我学到的一点是——客户端编程:

以前知道插件是增强浏览器的功能,但具体是啥玩意一直没想过。今天看了这个,算是有点头绪了。原来浏览器就相当于一个有很多约束的操作系统,以前浏览器给服务器发送一个请求,服务器返回一个文件,浏览器会渲染这个文件,展示给用户。比如验证码功能,我在浏览器输入,提交到服务器,服务器检查发现验证码输错了,于是返回一个错误文件,浏览器解析这个错误文件,告诉用户输入验证码错了,用户只好返回再输入一次。但自从有了客户端编程,我可以把一些工作放在客户端完成,比如验证码操作,完全可以让客户端自己检查,出错的话客户端就会提醒用户,而不是傻傻的发给服务器。这样,既加快了整个流程,又减少了服务器的工作。

JS也是浏览器脚本,也是客户端编程。本来应该由服务器完成的功能,现在通过JS直接在客户端就可以搞定。

然后就是C#和Java类型,JVM和.NET都是软件平台。


上一篇     下一篇