首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础之面向对象

Java基础之面向对象

作者头像
南风
发布2018-07-02 15:05:25
3390
发布2018-07-02 15:05:25
举报
文章被收录于专栏:Java大联盟Java大联盟

在Java中,有句俗语:万物皆对象。我们常常讲Java是一门面向对象的编程语言,那到底什么是“面向对象”、除了“面向对象”还有哪种编程思想、为什么要采用“面向对象”这种编程思想呢?下面笔者简单谈一谈自己的理解。

笔者打算先引用《Head First Java》中的一个例子来引出主题。

注:下面的例子转载自《Head First Java》一书。

说从前有一间软件小铺,里面有两个程序员被派去设计一个程序进行比赛。程序规格如下:

一名程序员叫阿珠,她看到程序规格后想:“这个程序要执行什么动作?我会需要什么样的程序?有了,我需要rotate与playSound”,然后她就开始进行设计的工作。

另一名程序员叫阿花,心想:“这个程序有什么样的事物?有什么关键的角色?”。她首先想到形状体(Shape)。当然啦,她还会想到用户、声响、等对象与点击等事件,然而这些对象早已经建立好了,所以她只要专注于创建形状体就行了。

于是,她们设计出了如下程序。

目前来看,阿珠用的时间更少,代码量更少,而且重复代码少,所以目前阿珠胜利。

但是,这时候突然传来消息,要求程序新加入一些规格:

阿珠:原来的roteta程序还可以用;该程序使用一个对应表来找寻特定编号的图形。但是palySound就得要修改。

PlaySound(shapeNum){

//如果不是阿米巴原虫

//查询使用哪个AIF文件

//播放

//不然

//播放amoeba.hif

}

虽然修改幅度不大,但是她实在不想去碰已经测试过的程序代码。

阿花:她苦笑一下,坐下来写出一个新的类。面向对象让她最喜欢的其中一点就是有时不需要动到已经测试好的程序就可以达到新目标。面向对象的适应性与可扩展性让她面对修改时不会觉得太过于痛苦。

这时候阿珠依旧领先阿花。

但是项目经理说:你们错了,阿米巴原虫不是这样旋转的。

原来,两个人都把旋转部分写成这样了:

(1)找出指定形状的外接四边形。

(2)计算出四边形的中心点,以此点为轴作旋转。

项目经理认为阿米巴原虫应该是要绕着一端旋转,类似秒针那样。

阿珠:她想到以后可能还要修改,最好还是帮roteta程序加上轴心点的参数。这样一来就有一堆程序要改。本来已经测试好的东西全部又得重来一遍。

roteta(shapeNum,xPt,yPt){

//如果不是阿米巴

//计算中心点

//然后旋转

//否则

//以xPt和yPt作为旋转中心

//然后旋转

}

阿花:她修改了rateta这个方法,但不是每个都要改,只修改Amoeba这个类而已。其他已经测试编译过的部分完全没必要改。该类要做的修改就是加上旋转轴心点的属性(attribute)。

这时候再来看,阿花的程序在扩展性和修改性上更加灵活,而阿珠的程序在这方面则不够灵活。

但是阿珠的程序还有一个问题:代码的重复性。她设计的前三个类里面的rotate方法代码是一样的,其实这点好解决,只要在这些类的基础上再抽象出一个父类,这四个类继承父类,Amoeba类里面重写roteta方法就好了,这样减少了代码的重复,也更加易于维护。

列举上面的例子只是简单对比一下面向对象和面向过程编程语言遇到同一个问题时考虑问题的方式。面向过程简单来说就是根据业务逻辑从上到下写过程,而面向对象在遇到问题时首先考虑的是业务中存在的事物,根据这些事物来抽象出类,再根据类创建一个个实例(对象),然后利用对象调用方法来完成业务。

面向对象编程的核心思想是:应对变化,提高复用。

面向对象编程思想主要是复用性和灵活性(弹性)。复用性是面向对象编程的一个主要机制。灵活性主要是应对变化的特性,因为客户的需求是不断改变的,怎样适应客户需求的变化,这是软件设计灵活性或者说是弹性的问题。

所以回到最初的问题:

(1)什么是面向对象编程思想呢?

其实就是在设计程序时,从对象的角度出发,抽象出不同的类,然后利用对象之间的相互调用完成功能与需求。

(2)那除了面向对象编程思想,还有哪种编程思想呢?

其实最开始出现的是面向过程编程思想(例如:C语言),它的核心思想是将功能细化,自顶向下,逐层细化。即结构化编程:将一个大问题分解成几个小问题,再将小问题分解成更小的问题,最后将任务划分成一个一个步骤,然后按照步骤分别去执行。

然后发展出面向对象编程思想。

现在还有面向组件以及面向服务编程思想。

面向组件:

我们知道面向对象支持重用,但是重用的单元很小,一般是类;而面向组件则不同,它可以重用多个类甚至一个程序。也就是说面向组件支持更大范围内的重用,开发效率更高。如果把面向对象比作重用零件,那么面向组件则是重用部件。

面向服务:

将系统进行功能化,每个功能提供一种服务。现在非常流行WebService技术以及SOA(面向服务架构)技术。

(3)为什么要采用“面向对象”这种编程思想呢?

其实上面已经讲到了,面向对象的核心思想就是重用性以及灵活性(灵活性=可扩展性+变化性)。重用性简单来讲就是你写过的一个实现了某种功能的代码,在其他地方用到时可以直接调用。而灵活性更不用讲了,现在的软件更新非常快,新增加功能啊或者修改原来的功能啊,我们写好了一个软件,更新时不可能去重构即重新写所有的代码,而是在原有的代码的基础上去修改来实现功能的更新,这就要求我们的代码要有良好的灵活性,即修改某块功能时尽量修改的更少并对其他模块影响更少。而且增加功能时可在原有基础上直接扩展而不影响原有功能。

因此面向对象这种编程思想适合完成此类业务。

再回到Java,我们说Java中万物皆对象,其实是在说Java是一门面向对象编程语言,即在java中任何功能都是以对象形式体现的,你想完成某项功能,就要根据这项功能抽象出各个类,然后通过各个对象之间的调用完成功能的实现。

其实对程序思想的理解会因为你做的业务和代码的累积发生改变,以上部分只是笔者目前的理解,可能随着知识的累积以及视野的开阔,再过一段时间回头看这些东西会发现某些地方理解的不够透彻甚至有误,但这就是学习的过程。

期待与你一起进步!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java大联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档