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 条评论
登录 后参与评论

相关文章

来自专栏ImportSource

程序员求生秘籍

不过即使是假新闻,也着实把人们吓得够呛。为此,我试图理了十个实用动作给大家保平安。

15540
来自专栏Java学习网

优秀程序员的 18 大法则

优秀程序员的 18 大法则 经过多年的积累,我发现,下面这些基本的指导法则,可以帮助我成为一个更加高效的程序员。 程序设计法则,与设计和工程的原理密切相关。下面...

26350
来自专栏程序人生 阅读快乐

编写高质量代码:改善Java程序的151个建议

在通往“Java技术殿堂”的路上,本书将为你指点迷津!内容全部由Java编码的最佳实践组成,从语法、程序设计和架构、工具和框架、编码风格和编程思想等五大方面对J...

9910
来自专栏牛客网

面经--微博&&今日头条

20900
来自专栏月牙寂

白话面向智能体编程(Agent Oriented Programmig, AOP)之二

Agent之前-Object世界 在说起Agent之前,俺们还有必要先敬拜一下Agent的前辈Object,因为Agent实际上是由Object“进化”而来...

32550
来自专栏数据科学与人工智能

【Python环境】为什么要选择Python语言实现机器学习算法?

基于以下三个原因,我们选择Python作为实现机器学习算法的编程语言:(1) Python的语法清晰;(2) 易于操作纯文本文件;(3) 使用广泛,存在大量的开...

21280
来自专栏月牙寂

golang设计模式的一些看法

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

35050
来自专栏C/C++基础

编程语言分类

从1946年世界第一台计算机ENIAC诞生至今,计算机从早期的军事计算领域,已经渗透到人类生产和社会发展的各个领域。从政府机构到企业部门、从军事领域到民用行业、...

1.2K30
来自专栏一个爱吃西瓜的程序员

如何通过学习C语言来入门编程

本文仅仅针对编程小白而言,大神请绕过。 大多数人学习编程的第一步应该就是学习C语言了,那到底该怎么学习C语言?我讲一下我的亲身历程。 大一的时候,我们有C语言这...

47550
来自专栏牛客网

前端面试:链家 -3月24日

一面 1. React组件通信 2. 什么是原型 3. CSS定位属性,怎么定位的 4. TCP与HTTPS的区别 5. 怎么获得对象上的属性(面试官期待的是O...

462110

扫码关注云+社区

领取腾讯云代金券