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中任何功能都是以对象形式体现的,你想完成某项功能,就要根据这项功能抽象出各个类,然后通过各个对象之间的调用完成功能的实现。

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

期待与你一起进步!

原文发布于微信公众号 - Java大联盟(javaunion)

原文发表时间:2018-05-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏带你撸出一手好代码

使用测试用例来约束自己的代码

写测试代码这种事情 ,以前只在网上和书上看到过, 自己从来没有写过。 每当看到那些世界顶级程序员编写的技术书籍中出现“测试用例”“测试代码”的字样或者一些行业的...

3256
来自专栏Kirito的技术分享

给初中级JAVA准备的面试题

笔者作为一个今年刚毕业的初级JAVA,根据群里水友的讨论,也结合自己刚毕业时的一些面经,加上近期一点点在公司面试别人的经验,总结了如下的常见面试问题,适用于初级...

3738
来自专栏ThoughtWorks

后现代的系统编程语言-C++ | TW洞见

C++作为一门经典的编程语言,从上世纪八十年代起至今一直被广泛应用在系统开发和高性能计算领域。近几年来随着各种编程语言和范式的兴起,C++的身影渐渐淡出了人们...

3596
来自专栏admin

开发者手册

本课程向大家介绍云服务器CVM的关键技术原理,以及腾讯云服务器CVM的稳定、弹性、易用等功能特点,以及腾讯云服务器CVM与传统IDC的优劣对比,当前的部署节点、...

4454
来自专栏Kirito的技术分享

天池中间件大赛百万队列存储设计总结【复赛】

维持了 20 天的复赛终于告一段落了,国际惯例先说结果,复赛结果不太理想,一度从第 10 名掉到了最后的第 36 名,主要是写入的优化卡了 5 天,一直没有进展...

1253
来自专栏PPV课数据科学社区

编程 | 用python获取天气数据,并作定时播报

思路 1.调用和风天气的API,获取天气数据 2.用百度语音API,将天气数据合成语音 3.用树莓派每天早上定时播报天气(定时任务crontab + Pytho...

5077
来自专栏更流畅、简洁的软件开发方式

MVC和三层,我的一个不成熟的看法,大家批批

  这里说的MVC指的是设计模式里的MVC不是asp.net mvc。   既然MVC是一种设计模式,那么他就应该在任何地方都可以使用。比如三层。   有人说...

1937
来自专栏从零开始学自动化测试

新手学习selenium路线图(老司机亲手绘制)

前言: 最近群里有不少小白,想入手selenium,但是一直没找到学习路线,还没入门就迷路了,于是小编亲手绘制了一幅学习路线图。希望能帮助小白快速入门,帮助已经...

3346
来自专栏企鹅号快讯

人生苦短,我用python

基础书籍推荐 父与子的编程之旅 这本书说的都是一些基本的概念,告诉我们编程到底是怎么一回事,初步了解Python的世界。 笨方法学Python 前面很适合新手学...

1877
来自专栏机器之心

处理器高危漏洞无人幸免?树莓派:我们不受影响

2375

扫码关注云+社区