黑马程序员技术交流社区

标题: 面向对象 [打印本页]

作者: 汪龙    时间: 2014-4-10 20:57
标题: 面向对象
面向对象的特征有哪些方面?

作者: qiubaoyang    时间: 2014-4-10 21:06
计算机软件系统是现实生活中的业务在计算机中的映射,而现实生活中的业务其实就是一个个对象协作的过程。面向对象编程就是按现实业务一样的方式将程序代码按一个个对象进行组织和编写,让计算机系统能够识别和理解用对象方式组织和编写的程序代码,这样就可以把现实生活中的业务对象映射到计算机系统中。
面向对象的编程语言有封装、继承 、抽象、多态等4个主要的特征。
1封装:
封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性。通常情况下,只要记住让变量和访问这个变量的方法放在一起,将一个类中的成员变量全部定义成私有的,只有这个类自己的方法才可以访问到这些成员变量,这就基本上实现对象的封装,就很容易找出要分配到这个类上的方法了,就基本上算是会面向对象的编程了。把握一个原则:把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在同一个类中。
例如,人要在黑板上画圆,这一共涉及三个对象:人、黑板、圆,画圆的方法要分配给哪个对象呢?由于画圆需要使用到圆心和半径,圆心和半径显然是圆的属性,如果将它们在类中定义成了私有的成员变量,那么,画圆的方法必须分配给圆,它才能访问到圆心和半径这两个属性,人以后只是调用圆的画圆方法、表示给圆发给消息而已,画圆这个方法不应该分配在人这个对象上,这就是面向对象的封装性,即将对象封装成一个高度自治和相对封闭的个体,对象状态(属性)由这个对象自己的行为(方法)来读取和改变。一个更便于理解的例子就是,司机将火车刹住了,刹车的动作是分配给司机,还是分配给火车,显然,应该分配给火车,因为司机自身是不可能有那么大的力气将一个火车给停下来的,只有火车自己才能完成这一动作,火车需要调用内部的离合器和刹车片等多个器件协作才能完成刹车这个动作,司机刹车的过程只是给火车发了一个消息,通知火车要执行刹车动作而已。
抽象:
抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。例如,看到一只蚂蚁和大象,你能够想象出它们的相同之处,那就是抽象。抽象包括行为抽象和状态抽象两个方面。例如,定义一个Person类,如下:
classPerson
{
        String name;
        int age;
}
人本来是很复杂的事物,有很多方面,但因为当前系统只需要了解人的姓名和年龄,所以上面定义的类中只包含姓名和年龄这两个属性,这就是一种抽像,使用抽象可以避免考虑一些与目标无关的细节。我对抽象的理解就是不要用显微镜去看一个事物的所有方面,这样涉及的内容就太多了,而是要善于划分问题的边界,当前系统需要什么,就只考虑什么。
继承:
在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。
多态:
多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。例如,下面代码中的UserDao是一个接口,它定义引用变量userDao指向的实例对象由daofactory.getDao()在执行的时候返回,有时候指向的是UserJdbcDao这个实现,有时候指向的是UserHibernateDao这个实现,这样,不用修改源代码,就可以改变userDao指向的具体类实现,从而导致userDao.insertUser()方法调用的具体代码也随之改变,即有时候调用的是UserJdbcDao的insertUser方法,有时候调用的是UserHibernateDao的insertUser方法:
UserDao userDao= daofactory.getDao();  
userDao.insertUser(user);
比喻:人吃饭,你看到的是左手,还是右手?


作者: 嫉妒的耗子    时间: 2014-4-10 21:35
主要是看你怎么看对象这两个字了 java中不是有一句名言么:万事万物皆对象,对象是对现实物体的一个抽象的概念 如何将这个概念具体化就要看你如何给这个对象设置他的属性 例如 电脑 在现实生活中他是一个物件,你在java中的描述就是一个类,然后你怎么看待这个物件(多大内存 神马样的cpu 独显还是集成显卡。。。)这写东西就是你对象在java中的属性也就是这个类的成员变量,当你把这些属性描述的越具体,java中的对象就与现实中的电脑越靠近越逼真
作者: 杨殿生    时间: 2014-4-10 21:58
面向对象是一种思想,对象就是一个具体的事物,在计算机内存中每一个对象都有自己的地址,单独的存储在内存中。面向对象的思想就是当你要使用某一功能的时候,只要调用对象对外部提供的该功能就可以了,而不需要知道其内部怎么实现的。就像是用手机你手机就是一个对象,当你要使用手机的功能的时候,你只需要调用手机给你提供的功能即可,而不需要知道手机内部是如何实现的。所以面向对象具有封装性。
作者: 姜姗姗    时间: 2014-4-10 22:07
对象吧,说的太具体可能不大明白,所以通俗一点来讲的话,就是,对于冰箱我们只使用它的制冷功能、定时功能、温度调整功能……,我们不考虑它内部具体是怎么是实现的,因为功能已经被包装,里面的细节就会被隐藏,这种思想就是面向对象。这么讲的话,可能不大会晕:)
作者: 491138002    时间: 2014-4-10 22:12
四个特征:
1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
3.封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4. 多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
作者: Monkey·D·Chas    时间: 2014-4-10 22:29
问道面向对象的特征,很多人都会顺口说出:抽象,封装,继承,多态。但真正要把面向对象的思想运用在自己的编程中,可不是那么容易的。人开门,开门的动作为什么是门的而不是人……我们应该学会用另一种方式表达和解释现实生活中的一切,也许等N久以后我们回头再考虑这些问题时会有不一样的理解和收获!
作者: 王春蕾    时间: 2014-4-11 16:34
继承、多态和封装
作者: K.L.Zous    时间: 2014-4-11 16:54
抽象、继承、多态和封装 。没错 这个是精华 当你学了C语言再学java就很容易感受出他们的差别来。多态使得代码活泼起来




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2