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