面向对象和面向过程的区别
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。
而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为 1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的i变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
功能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。
再比如我要把这个五子棋游戏改为围棋游戏,如果你是面向过程设计,那么五子棋的规则就分布在了你的程序的每一个角落,要改动还不如重写。但是如果你当初就是面向对象的设计,那么你只用改动规则对象就可以了,五子棋和围棋的区别不就是规则吗?(当然棋盘大小好像也不一样,但是你会觉得这是一个难题吗?直接在棋盘对象中进行一番小改动就可以了。)而下棋的大致步骤从面向对象的角度来看没有任何变化。
当然,要达到改动只是局部的需要设计的人有足够的经验,使用对象不能保证你的程序就是面向对象,初学者或者很蹩脚的程序员很可能以面向对象之虚而行面向过程之实,这样设计出来的所谓面向对象的程序很难有良好的可移植性和可扩展性。
就是C和C++的区别.
面向过程就是用代码详细写出问题解决的每一步骤.
我们经常所说的“对象”,一般指的是解决信息领域内所遇到问题的方法。特别是应用软件技术来解决问题的方法。如我们经常碰到的面向对象的编程(Object-Oriented Programming)、面向对象的分析(Object-Oriented Analysis)、面向对象的设计(Object-Oriented Design)等。应用前面所介绍的关于对象的概念,可以对这些问题做进一步的分析。在面对较复杂的系统,我们可以将它作为一个对象来进行分析。一个系统(解决某个问题的全套解决方案)作为一个对象,可以由多个部分组成。同样,这个对象也可以由多个对象组成。对于同类的事物,可以由一个对象来表示。这样做的益处是显而易见的,它灵活而高效,可以大大减轻设计人员的工作量,简化实际的模型。举一个例子。在关系型数据库的设计当中,我们可以把一个元组当作对象,给它定义一组操作方法。这些方法将适用于所有元组,从而我们不必在更大的范围内去细致的考虑不同的元组(如判断一个元素是否合法):因为它们有一组公共的面向本身的方法,它们“自己”可以“解决”自己的问题。更上一层的对象可以是一个表、视图等。表对象在元组对象的基础上又有它们自己的方法,如增加、删除等。从这个层面上讲,它也只需要做“自己”的事情,因为有元组对象的支持,它无须去考虑像元素是否合法这类的事情。甚至,有时为了满足我们还可以将元素或表群当作时对象并定义它们自己的方法。这样,更能显示面向对象的优势
java基本编程要点之对象和类
编程Java面试OOPJDKA:要使用oop,需要了解对象的三个主要特性,分别是:
1:对象的行为(behavior)--对象能做什么.或者说,能对对象施加什么方法?
2:对象的状态(State) -- 对对象施加方法时,对象如何反应?即对象数据成员的值维护。
3:对象的身份(identity) -- 对象如何与具有相同行为、状态的其他对象相互区别?
首先,类的所有对象实例都支持相同的行为,从而具备家族相似性。对象的行为可以通过调用的方法来定义。
其次,类的所有对象都保存着表明其当前特征的信息。这就是对象的状态。
然而,对象的状态并不能完全描述一个对象,每个对象还应有一个惟一 的身份。
B:封装,继承,多态。
1:封装 --通过对对象数据的封装,就可以使可复用性最大化,减少数据依赖,并且使用调试时间最大化。
封装是一个与对象有关的概念,从形式上讲,封装就是把数据和行为结合在一个包中,并对对象的使用者
隐藏数据的实现过程。应该紧记一点是,实现封装的关键在于绝不让方法直接访问其类的实例字段(成员数据).
即所有类之间的通信都应该通过方法调用完成。
2:继承 -- 类可以建造在其类之上。我们把在一个类上建造新类称为对原有类的"扩展"(extend).
3:多态 -- 可通过实现接口与类继承实现方法的多态。为何说方法的多态?在JAVA中,实例字段是不参与类
多态原则的。
C:类之间的关系
类与类之间的关系最常见的关系有:
1:依赖(“use-a”)-- 如果一个类的方法操作了别一个类中的对象,哪么这个类就依赖于另一个类。
2:聚合(“has-a”) --一个对象包含了另一些对象。即一个类的以另一些类作为数据成员(全局变量)。
3:继承("is-a") --如果类A扩展了类B,哪么类A不仅继承类B中的方法,而且还可以具有更多的功能。
is-a 的解释为类A是类B的一个扩展类,即子类.
D:Overload(重载) & Overrride(覆盖)
1:overload -- 当多个方法具有相同的名字而含有不同的的参数时,返回类型可相同可不相同,
便产生了生重载。JAVA中允许对任何方法进行重载。
2:override -- 方法的覆盖产生在继承,当子类对父类的方法进行重写时,便产生了覆盖。方法名相同,参数
个数与参类类型相同,返回类型相同。
E:数据字段的三种初始化方式
1:在构造器中设置值。
2:在声明中赋值。则在声明变量类型的同时赋初值。
3:在初始化块中设置值。这种机制并不是必须的,而且也不常见。把初始化代码放在某个构造器内显得更为
直接了当。不管用哪个构造器构造对象,初始化块都首先被运行,然后才是构造器的主体部分被执行。
F:类Object中有5个与线程有关的方法:
这个要点本来是要等到写到线程的时候再写出来的,但居然在这一章中说对象就顺便提出来给大家讨论一下。
也曾经有同事跟我说他去面试外企的时候考了这个题目,所以我就在这里写一下。
在这个超类中,有5个与线程有关的方法,大家可能猜到了,但还是注明一下,如下:
wait()
wait(long timeout)
wait(long timeout,int nanos)
notify()
notifyAll()
这5个方法的意思我就不在这表达了,大家写过线都知道的,或者大家可以查一下JDK的API。
G:静态块的加载时机。
这个要点,因为要写程序跟运行信息要帖出来给大家看,才能让大家看明白,先将两个要点说明一下,明天再
一一述说。
一:静态初始化区域是在类别第一次载入的时候才会被调用哪仅仅一次。
二:严格来讲,静态初始化区域是在类别第一次实例化的时候才会被调用哪仅仅一次。
为什么 ?等我将程序打好,将运行信息贴上来再与大家一起讨论。
面向对象编程:类和对象的概念
类(Class)
面向对象思想来源于对现实世界的认知。现实世界缤纷复杂、种类繁多,难于认识和理解。但是聪明的人们学会了把这些错综复杂的事物进行分类,从而使世界变得井井有条。比如我们由各式各样的汽车抽象出汽车的概念,由形形色色的猫抽象出猫的概念,由五彩斑斓的鲜花抽象出花的概念等。汽车、猫、鲜花都代表着一类事物。每一类事物都有特定的状态,比如汽车的品牌、时速、马力、耗油量、座椅数,小猫的年龄、体重、毛色,鲜花的颜色、花瓣形状、花瓣数目,都是在描述事物的状态。每类事物也都有一定的行为,比如汽车启动、行驶、加速、减速、刹车、停车,猫捉老鼠,鲜花盛开。这些不同的状态和行为将各类事物区分开来。
面向对象编程也采用了类的概念,把事物编写成一个个“类”。在类中,用数据表示事物的状态,用函数实现事物的行为,这样就使编程方式和人的思维方式保持一致,极大的降低了思维难度。
封装(Encapsulation)
制造汽车的过程中什么人最牛?当然不是焊钢板的,也不是装轮胎的,更不是拧螺丝的,而是设计汽车的工程师,因为他知道汽车的运行原理。但是我们开车时,需要知道汽车的运行原理吗?答案显然不需要。汽车的运行原理已经被伟大的工程师封装在汽车内部,提供给司机的只是一个简单的使用接口,司机操纵方向盘和各种按钮就可以灵活自如的开动汽车了。
与制造汽车相似,面向对象技术把事物的状态和行为的实现细节封装在类中,形成一个可以重复使用的“零件”。类一旦被设计好,就可以像工业零件一样,被成千上万的对其内部原理毫不知情的程序员使用。类的设计者相当于汽车工程师,类的使用者相当于司机。这样程序员就可以充份利用他人已经编写好的“零件”,而将主要精力集中在自己的专署领域。
接口(Interface)
今天你买了一台等离子电视机,你拿出遥控器,操纵按钮,开始欣赏精彩的电视节目。人们通过遥控器这个接口使用电视机,同样,人们通过类的接口使用类。程序员在编写类时精心地为它设计接口,而设计良好的接口不但方便其他程序员使用,还有利于类的升级改造。
假设你是一个环保人士,最近你用节能的荧光灯代替了普通的白炽灯。白炽灯通过加热电阻丝照亮整个屋子;荧光灯则是激活空气中的某些分子的电子能而发光。虽然它们的原理不同,但是它们的功能却是一样的——照明。因为两种灯具有相同的接口,所以你只需拧下白炽灯,然后再拧上荧光灯即可,轻易的实现“零件”的更新换代。同样,在面向对象编程中,只要保持接口不变,你可以任意更改类的实现细节,用一个设计更好的类替换原来的类,实现类的升级换代。
现在软件维护和修改的成本已经占到了整个软件开发的80%,类的这一编成思想极大的方便了程序的维护和修改,降低了软件成本。
对象(Object)
作为初学者,比较容易混淆类和对象的概念。类是一个抽象的概念,对象则是类的具体实例。比如人是一个类,司马迁、李白、杜甫都是对象;首都是一个类,则北京、伦敦、华盛顿、莫斯科都是对象;动画猫是一个类,则Kitty、Grafield和Doraemon都是对象
类是抽象的概念,对象是真实的个体。我们可以说Kitty猫的体重是1.5kg,而不能说猫类的体重是1.5kg;可以说刘翔在跨栏比赛中夺冠,而不说人类在跨栏比赛中夺冠。一般情况下我们认为状态是描述具体对象而非描述类的,行为是由具体对象发出的而非类发出的。
现实生活中到处充实着对象,一栋房子、一辆汽车,一头大象,一只蚂蚁,乃至一种语言、一种方法都可以称为对象。