黑马程序员-java与面向对象思想
------- android培训、java培训、期待与您交流! ----------
Java是什么
在20世纪90年代,Sun公司的工程师们经常要商讨如何解决面包烘烤机、恒温器等日常数控系统中的数据共享问题,比方说,如何在面包烘烤机的硬件系统内核里读取恒温器里关于温度的数据,实现定时加热的功能。
这些工程师在研究中发现,由于不同产品的制造商们采用不同的硬件和应用软件来组装他们的产品,所以要让这些产品在协同工作时实现数据共享是比较困难的,这些困难主要有:如何保证共享数据时的数据安全性,如何定义数据共享和传输的格式等。
因此,这些工程师把各种不同的产品按功能模块拆分,理解其基本功能模块(比如加热模块)的特性,以便使它们能更好地一起工作。事实上,他们的这种工作方法,除了能有效解决最初的“共享数据”的问题外,同时也可以解决因硬件标准不同而导致的其他方面的问题,比如可以让烤面包机和恒温器结合,让烤面包机在达到一定的时间停止烘烤,进行保温工作。
随着研究的深入,他们发现,通过这种工作方法,还能通过集成功能模块,快速有效地组装各种产品和模块。不过,这种集成,需要在各种不同标准的模块上构建一层统一的能屏蔽不同硬件模块差异的操作系统(这就是Java虚拟机的雏形),由于当时尚无一种语言可以实现上述的工作思路,所以工程师们就打算自己开发一种新的编程语言,于是Java语言应运而生。
Java语言之所以流行,是因为它具有跨平台性,即使用Java语言,程序员可以开发能在不同网络平台和不同操作系统上运行的应用软件。这样的好处在于,使用Java的软件开发公司就不必再考虑项目在不同操作系统中的开发和安装细节,从而可以把更多的精力和资源安排在开发项目功能和设计项目的架构上。
综上所述,Java除了具有其他编程语言所有的好处之外,还具有以下四个特点:
1. 由于Java的语法结构比较简洁,所以学习起来很容易。
2. 由于Java语言功能强大,所以使用Java语言可以开发多种类型的应用。比如使用J2ME可以开发基于手机的应用,使用J2EE可以开发基于企业级的大型应用。
3. 由于Java语言是基于面向对象的思想的,所以用Java语言开发出来的代码可以具有结构清晰、维护容易和扩展简便等优点。
4. 由于Java语言的运行环境具有很强的容错机制,能保证Java程序在诸如内存不够的情况下不崩溃,不死机,所以使用Java语言可以开发出健壮性的代码。
什么是面向对象思想
目前,面向对象的思想被软件开发界广为追捧,其实,面向对象思想不是高深的理论,而是根据前人大量编程项目总结出来的一套分析和解决编程方面问题的方法。
以面向对象思想为指导,可以优化Java代码的结构,更可以让数据库访问模块变得富有弹 性——即让代码和模块能更好地适应项目需求的频繁变化。
软件开发的方法学——面向对象思想提出的背景
计算机语言刚出现时,采用的编程语言是面向硬件的机器语言,即用一大堆计算机硬件能识别的0和1来编写代码。写这种机器代码需要很高的技巧,它们调试起来也比较困难,所以当时的程序员都是精英级别的人物。
为了提高编程语言的适用性,提升代码编写的效率,专家们开发了以汇编语言为代表的低级语言,即用一些助记符来代替晦涩的机器语言,例如用add a b,来计算a+b的值。这类语言直接与内存和其他硬件打交道,以使用最小系统资源和谋求最大硬件利用率为开发准则,在当时低配置的硬件环境下是有很大的实用意义的。
但是,用这种编程语言开发出来的代码的结构非常混乱,并且很难读懂。这样的情况可能在几百行规模的代码量下并不明显,但如果当项目规模扩大,代码量越来越多的时候,这个问题就突显出来了。更有甚者,作者自己在开发结束后,往往会忘记自己写的代码的结构和语意,这样的代码很难维护和阅读。
为了解决这类问题,提高代码的逻辑性,软件语言方面的专家提出了初步融合面向对象思想的结构化的面向过程语言。
结构化语言的重要特征是,在代码里分离了代码逻辑和程序数据,并使用了分支(IF)和循环(While和For)等关键字来优化代码的逻辑结构。由于结构化的语言使用子模块顺序调用的方式控制代码流程,所以又叫面向过程语言,以C语言为代表。
和汇编语言相比,面向过程语言能很大程度地改善代码结构,提高代码的逻辑性。具体表现为以下两点:
1. 由于在面向过程的语言里,可以把功能点以函数(过程)的形式封装,所以代码的重用性能会得到一定程度的提高,即后继项目可以通过调用具有相同功能的函数来利用现有的代码,这对项目的二次开发或者是功能升级是非常有利的。
2. 由于面向过程语言摒弃了使用goto(或者是jump)语句的跳转方式,而使用了分支和循环等结构性语句,所以代码的结构能得到大幅度的改善,从而能在一定程度上提高项目的可读性和可维护性。
然而,在面向过程语言的使用过程中,程序员们发现其依然有本质上的缺陷,具体表现为:
1. 在模块间的函数调用时,由于无法屏蔽模块里不希望被访问修改的关键变量,这将导致模块间有很高的关联度,这对代码维护是非常不利的,往往会修改一处而触动全部代码。
2. 代码的重用级别仅仅是局限于函数级别的,这导致无法大量有效地利用已开发完成的代码成果,这对代码的重复性利用非常不利。
3. 函数的定义是针对具体动作和具体对象的。比如说,我们要定义打印的方法,如果我们使用的打印机型号不同,那我们不得不根据不同的型号,定义多个不同名的方法。也就是说,面对业务逻辑(业务上要做的事情)相同但业务逻辑处理对象不同的需求,必须要写成多个不同名的函数,这导致了代码过于注重细节,而无法考虑逻辑性、重用性和维护性等大局方面的问题。
为了解决上述问题,软件语言的专家们吸取面向过程语言中“结构化”和“模块化”等优秀方法,提出了面向对象的指导思想。
面向对象思想参照了现实生活中观察问题、解决问题的思维方式,将应用程序中的一切模型以类的形式,整合成对象,并通过归纳和抽象对象,提取出一套解决问题的方法和思路。
所以,面向对象思想可以通过优化模块间的结构和加固模块间的坚固性,来指导构造软件项目行业“摩天大楼”。
面向对象的物质基础——类与封装
类是基于面向对象思想编程语言的基础,程序员可以把具有相同业务性质的代码封装到一个类里,通过接口方法向外部代码提供服务,同时向外部代码屏蔽类里服务的具体实现方式。
对象是类的实例,类一般是个抽象名词,比如“人类”,而对象则是具体的物质存在,比如“张三”这个人。
在现实生活中,我们经常会遇到“类”和“对象”这些概念,比如封装了能实现“用微波加热材料”功能的微波炉类。这里,用户可以使用面板上的按钮,使用该类里提供的加热等服务,并且,由于该类实现了封装,所以在使用的时候,用户可以不用了解其中的微波加热原理以及实现机制。
通过上面例子我们可以看出,类是对现实生活中真正存在的对象的描述,并且这些对象都具有共同的属性和行为。但是,根据不同的系统需求,同样的一种对象会被描述成具有不同属性和行为的类。比如,对于银行系统,人的这个类应该具有账号、存款余额的属性和存钱、取钱的行为,每个人都有自己不同的账号和相关金额,但是他们存钱取钱的流程是相通的;而对于电信系统,同样的人这个类应该具有手机号码、卡内余额的属性和充费、扣费的行为。因此,我们要注意类的定义和它所封装的行为是否能够正确的反映实际系统的需求。
抽象与代码复用——抽象类与概念抽象
抽象类也是类的一种,它同样拥有属性和行为,但是它与普通类最大的区别就在于抽象类里面允许有一些抽象的行为,抽象类只从概念的角度出发定义了类的行为,但是它没有描述行为的实现细节,而是把这个任务交给了它的子类来实现,它本身充当了父类的角色。因此,我们可以说子类不仅有从父类继承过来的属性和行为,而且它可以在父类原有内容的基础上做一些补充和发挥。父类只是做了一个概念的抽象。
下图1-2说明了这种抽象的必要性:
图1-2 抽象类示意图
对于汽车、自行车这两个类来说,它们都是父类车的子类,具有位置、速度属性和前进、后退行为,但是汽车有四个轮子,自行车有两个轮子,汽车的运动是靠发动机来实现的,而自行车的运动是靠人力来实现的。因此,我们在车这个父类里面只定义了关于运动的两个方法,具体的实现细节交给了它的两个子类来完成。这样我们不仅避免了在两个相近的类之间定义重复的属性和行为,而且还解决了允许不同的类具体的实现细节有所变化的问题。
抽象类可以帮助我们更加有效地解决代码重复问题,并且,它又不失灵活性,又同时达到了概念抽象的目的。这里我们又通过抽象类的概念引出了类之间,一个重要关系,就是子类与父类的继承,当然不仅抽象类可以作为父类,其他的一般类同样可以充当为某一子类的父类。只要它有这种继承的需求我们就可以这样来定义。
模块的开关——接口与功能抽象
接口的功能与抽象类相似,但是接口只能定义行为,这些行为的具体细节在实现了接口的类中描述,而抽象类还可以为这些类定义一些相同的属性,因此我们可以说,接口比抽象类要更加抽象。接口中只定义公共的行为,这些行为也就是实现它的那些类的功能,不同的类可以有不同实现细节,这里的原理与抽象类相同。
下图1-3说明了接口是如何做到功能抽象的:
图1-3 接口示意图
我们定义了交通工具这个接口,在这个接口里面定义了移动这个行为,但是行为的具体实现细节是在火车和飞机两个类里面完成的,并且是由不同的方式来实现的。假设某个用户有了一个从上海到北京的行程安排,并且由于时间紧,不能确定选择哪一种具体的交通工具,只知道要发生移动这个行为。那么,他可以先选择交通工具这个接口的移动行为,具体是坐火车还是坐飞机我们可以根据实际的情况来定。
接口是单单从行为的角度出发,把功能做了概念上的抽象,使得不同的类通过不同的机制实现名称相同的行为,方便使用者调用,隐藏了具体的实现细节。
同名但不同参——多态与重载
多态是面向对象编程的一个重要特征,从字面意思来看就是指具有多种形式或形态的情形。在面向对象的编程中,多态主要是指针对于类的行为有多种不同的变化,用相同的语言结构,来表示不同类型的实体或对不同类型的实体进行操作。即“相同的界面,不同的内部实现形式”。通常通过重载和覆写来实现多态。
重载是让类以统一的方式处理不同类型数据的一种手段。就是在类中可以创建多种行为,这些行为有一个特征是它们具有相同的名字,但具有不同的参数和不同的表现形式。调用行为时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,这就是多态性的一种表现,虽然行为的名字相同,但得到的是不同的表现形式。
重载在我们的现实生活中也很常见。如:保姆类有洗的这个行为,但是我们可以给她衣服或餐具等不同的对象,她会根据不同的输入实现不同的洗的细节,如果是衣服的话就放在盆里洗,如果是洗碗就在水池里洗。这带来最大的好处就是对于命令的发起者主人来说不需要记住太多的洗衣服还是洗碗的方法,只要把这些脏东西交给保姆并且发出一个洗的指令,保姆就会自动地进行处理,屏蔽了细节实现,不仅方便了主人,同时也提高了自己的价值。
让我们谈谈另外一种多态的实现——覆写。还记得我们上面提到过的子类和父类吗?是的,子类不仅可以实现父类里面的只给出具体定义而没有实现细节的行为,子类同时也可以改变父类中的行为,这个我们可以称之为“有所继承,有所发挥”。当你发现老爸那一套做法已经落伍了的时候,你是否会去改变它呢。我们把这种在子类中改变父类行为的具体实现细节,但是名字和接受的输入对象不变的动作就称之为覆写。
覆写在我们的现实生活中同样有着重要的意义。还拿上面的那个例子来说,原先的那个保姆带了一个徒弟,因为徒弟从师傅那里学会了如何做个好保姆,特别是如何洗东西,做保姆对于她来说可能更有优势。
但是时代进步了,我们的主人家里添置了洗衣机、洗碗机等家用电器。徒弟发现用这些东西会更加方便,既省时又省力,于是她快速地学会了如何操作这些家用电器来为主人提供更加优质的服务。对于她来说同样可以洗衣服和洗碗,只不过用的是洗衣机和洗碗机,而不是像她的师傅放在盆里或水池里洗了,并且现在洗得更快更好了。
对于任何一个保姆来说,主人只要给她脏东西并且发出洗的命令,她就会根据实际情况进行相应的操作,这时在这个洗的行为上发生了重载。主人把同样的碗这个对象交给保姆师傅和保姆徒弟来洗,她们也会进行相应的操作,师傅放在水池里洗,而徒弟用洗碗机洗,此时在这个洗的行为上却发生了覆写。
总结一下,类的行为可以有多种不同的表现形式,这叫做多态。对于那些具有相同的名字但是不同操作对象的行为来说,我们称之为重载;对于那些不仅拥有相同的名字而且操作的对象也相同,但是在子类与父类里面具有不同实现细节的行为来说,我们称之为覆写。
在编程语言中,那些名字相同参数类型不同的方法就叫做重载,那些分别处在子类父类里面名字相同参数类型也相同的方法叫做覆写。
具有面向对象思想语言的优势
传统的程序设计方法称为面向过程的程序设计方法,它是以具体的业务逻辑为基础,以实现方法为主要目的。它的缺点是:程序往往缺乏对代码重用性的支持,并且缺乏统一的接口,使得当代码的规模达到一定程度时,程序变得难以控制和管理,它的复杂性大大增加了开发人员的工作量。
面向对象的程序设计方法以一种更接近人类一般思维的方式去看待世界,按照现实世界的特点来管理复杂的事物,它根据实际的情况把生活中的对象抽象成相应的属性和行为组成的实体,对象之间通过互相调用来协调工作。
面向对象编程的基本单元是类,一个类描述了对象的特性,并把数据和操作数据的行为(称为方法)封装在一起。类可看成是对象的模板,基于这些模板我们可以派生出具体的对象,我们的工作就是把它们有条不紊地组织在一起。而且这样的组织方式更加符合人类认知世界的过程。我们把现实世界中的事物,根据它们的特征和关系定义到了我们的系统中,方便了操作和管理。
面向对象的语言大大提高了程序的重用性,降低了程序的复杂度,使得计算机可以处理更复杂的应用需求。Java不仅具备面向对象语言的所有特征,而且相对于别的面向对象的语言,它还屏蔽了许多繁琐的操作,简化了难度,降低了开发人员的学习曲线,在面向对象的编程领域中占有举足轻重的地位。
------------------------------------ android培训、 java培训、期待与您交流!------------------------- ----------详细请查看: http://edu.csdn.net/heima/