首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

蚂蚁、小鸟、大象 引发的面向对象问题

当你看到了这样一幅图片,有蚂蚁、小鸟、大象,你能够想出它们的相同之处吗?

它们都会吃eat、喝drink,这些是行为上的共性;都有体重weight、状态status(比如睡觉、活动等),这些是状态上的共性。这样我们就可以抽象出来一个类:Animal,称为动物。

这个提取共性的过程就是抽象。那么面向对象有哪些特征呢?

面向对象的特征有:抽象、继承、封装、多态

(1)抽象:抽象是将一类对象的共同特征总结出来,然后构造类的过程,包括数据抽象和行为抽象两方面 。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一类。这个类只考虑这些事物的相似和共性之处,其他方便会进行忽略。有点像我们初中学习的数学中的提取公因式

比如,我们定义一个类:Person,如下: class Person{ String name; int age; } 人本来是很复杂的,包含有很多方面,如果当前系统只需要了解人的姓名和年龄,那么这个类中只需包含姓名和年龄这两个属性,这就是一种抽像。

抽象时要避免考虑一些与目标无关的细节。就是不要用显微镜去看一个事物的所有方面,这样涉及的内容就太多了,而是要善于划分问题的边界,当前系统需要什么,就只考虑什么。

(2)继承:继承是从已有类得到继承信息创建新类的过程。提供继承的类叫父类(超类、基类)、得到继承的类叫子类(派生类)。

在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。

继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性,同时为实现多态性作准备

(3)封装: 封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。

在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性。

通常情况下,让变量和访问这个变量的方法放在一起,将一个类中的成员变量全部定义成私有的,只有这个类自己的方法才可以访问到这些成员变量,这就基本上实现了对象的封装。

把握一个原则:把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在同一个类中

通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。

可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情。

(4)多态: 指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。

例如,下面代码

UserDao userDao = daofactory.getDao();

userDao.insertUser(user);

UserDao是一个接口,它定义引用变量userDao指向的实例对象由daofactory.getDao()在执行的时候返回,有时候指向的是UserJdbcDao这个实现,有时候指向的是UserHibernateDao这个实现,这样,不用修改源代码,就可以改变userDao指向的具体类实现,从而导致userDao.insertUser()方法调用的具体代码也随之改变,即有时候调用的是UserJdbcDao的insertUser方法,有时候调用的是UserHibernateDao的insertUser方法。

多态性语言具有灵活/抽象/行为共享/代码共享的优势,很好的解决了应用程序函数同名问题。总的来说,方法的重写,重载与动态链接构成多态性。java引入多态的概念原因之一就是弥补类的单继承带来的功能不足

动态链接 -->对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将调用子类中的这个方法,这就是动态链接。

面向对象程序设计有以下优点

1、开发时间短,效率高,可靠性高,所开发的程序更强壮。由于面向对象编程的可重用性,可以在应用程序中大量采用成熟的类库,从而缩短了开发时间。

2、应用程序更易于维护、更新和升级。继承和封装使得应用程序的修改带来的影响更加局部化。

3、还是那句口号:更高更快更强。对程序员更友好,他好我也好O(∩_∩)O哈哈~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200715A0RQMG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券