OOP思想与Java实现

大纲:

  • Java编程思想》第一章对象导论摘录
  • OOP的基本思想
  • OOP与面向过程的区别
  • OOP解决了什么问题
  • Java中的OOP表现

《Java编程思想》第一章对象导论摘录

抽象过程:

万物皆对象;程序是对象的集合,他们通过发送消息来告诉彼此所要的;每个对象都有自己的有其他对象所构成的存储;每个对象都拥有其类型;某一特定类型的所有对象都可以接受同样的消息;对象具有状态,行为和标识。

每个对象都有接口:

具有相同的特性(数据元素)和行为(功能)的对象集合,所以一个类实际上就是一个数据类型。

每个对象都提供服务:

对象是提供服务的集合,可以根据不同的服务去创建对象,是程序高内聚。

被隐藏的具体实现:

使用访问标识符来隐藏相关内容,防止内部程序被更改

OOP的基本思想

OPP为面向对象编程,其重点是“对象”上面,什么是对象?自然界中的一切物体,例如猫,狗,花,草等等都是对象,而面向对象编程就是一人看世界的角度来进行编程。一只猫是怎么样的?毛色是黑色的还是黄色的?体重多少?体长多少?这些在人类社会中的“名词”,用来描述一个对象状态的词语,在程序的是世界里叫属性。而一只猫可以和狗打架,可以抓老鼠,可以叫主人起床铲屎喂猫粮,这些在人类社会中的动词,用来描述对象能够做什么的词语,在程序的世界里称之为方法(也叫函数)。面对对象编程正是把这一个个属性,一个个方法封装在一个类(对象的一种抽象化描述)中,把一个类当作一个整体看待,而不是分成一个个属性,一个个方法去看待,这样的一种思想就是面对对象编程的思想。例如在猫这一个对象当中,我们关心的只是猫这一个生物,我能和它玩,能喂它,但我并不关心它是怎么和我玩的,怎么吃我的猫粮的,这些是猫的事,是猫自己内部的属性和方法,我们从外部并不关心它这种属性和方法是怎么实现的。

OOP和面向过程的区别

面对对象和面对过程的区别就在于关注点的范围的不同。在面对过程编程中,我们要关注一个程序有开头到结尾的每一个细节,所有的方法和属性都要自己掌握,而面向对象却不是。例如,我喂猫吃猫粮的这一个动作上,在面向对象的思想中的过程是:我喂猫——猫吃粮;而在面向过程中则为:我什么时间,什么地点,拿什么猫粮,怎么拿猫粮去喂猫,猫怎么吃猫粮,吃多少,吃的时候什么表情,吃完之后会不会说很好处,这当中每一个细节我们都需要关注,这就是面向对象和面向过程的一个鲜明的例子。在面向对象当中,所有的东西都是已经封装好的,就只有我和猫的概念,而面向过程则是关心所有的细节。

OOP解决了什么问题

OPP解决了代码复用的问题,什么是代码复用?代码复用就是不重复书写代码,通过直接调用类代替复制,黏贴的过程。还有的是,对于我们不了解,不清楚的程序段中,我们也可以通过调用别人写的类来实现我们自己想要的结果,这是一件十分方便高效的事情,而且在面向对象将代码复用做到了丧心病狂的程度。

在Java中,OOP的实现主要表现在继承和接口上面。

首先讲继承,在人类社会中,儿女继承父母的手艺,继承了父母的财产,父母中有什么,儿女中也有什么,那就是继承。但是儿女不可能就只吃父母的老本,他们还在父母的基础上增加了自己的事情,例如使用互联网,学会开汽车,这些都是父母不会做的事情。对于父母会做的事情,儿女也可以改变他,例如儿女不甘于使用人工去打磨一件产品,他们学会了产品的自动化生产,这些都是可行的。在程序中也是如此,子类继承了父类,那么子类就拥有了父类所有的属性与方法,而且子类能够增加自己属性与方法,或者重写父类的方法,这就是继承。

由于Java中只支持单继承,如果子类要解决想继承多个父类的方法时,那应该怎么办呢?接口的出现就是为了解决这个问题。要了解接口,那么就得先了解抽象类,因为他们是相似的东西,能够跟好地帮助了解接口。抽象类中有抽象方法,抽象方法只有类名,没有具体的实现。例如在类people中有方法public abstract String name();在这个方法中,返回的是某个人的名字,以这个方法所属的类作为父类,那么在这个父类中并没有这个方法的实现,而如果有一个子类继承了该类,那么在子类中一定要实现父类的抽象方法。抽象方法的好处是,统一了继承链下实现某个方法的需求,防止程序员忘记书写某些方法而造成程序错误,在另一个方面,父类的抽象方法不需要知道子类的具体实现,提高程序的可读性,例如学生,教师,工人继承了people这个类,每一个学生,教师,工人都有自己的名字,而且这个名字必须写出来,而抽象类则强制程序员实现这个方法,并且在子类中才实现各具特色的名字。接下来讲接口,要注意的是,接口内的方法都是抽象方法,可能大家有疑问了,抽象方法要在子类中实现,在子类中书写代码,并没有解决代码的复用,那么接口的出现又是为了什么呢?答案还是代码复用。我们假设有一个灯座和一批灯泡,灯泡和灯座有不同形状的接口,有三角形的,有正方形的,有圆形的,假设有一个方法,他的动作是将灯泡安装在灯座上。我们使用传统的方法,来一个三角形接口灯泡我们就给它一个三角形接口的灯座,来一个正方形接口的灯泡,我们就给他一个正方形接口的灯座,这就照成了这个方法还要去寻找不同灯座的动作。那么有没有一种方法,可以实现我只用一个灯座就能够接很多总类型的灯泡呢?答案是肯定的,我们可以使用一个转换头,将不同类型的灯泡转换成圆形的接口,那么我无论使用什么样的灯泡,我都能够使用那一个圆形的灯座了。而且这个转换的动作相对于换灯座的动作要简单得多,这个转换就是接口,而接口的作用也是如此。

=====2015/12/21 23:13======

更正:Java是不支持多继承,但支持声明多继承,接口的作用是起声明作用的,一旦有一个类声明了某接口,那么他也继承了一些服务,广义上讲其实声明也是继承。

而由于存在接口和继承,那么使得多态有了用武之地,什么是多态,多态就是父类应用指向子类对象。

=====2015/2/26 11:33======


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值