“备孕期”的Java程序员一定要学会抽象 | 《Java编程思想拆书》
我相信,看到标题后的你一定很好奇,究竟什么样的Java程序员算是在“备孕期”呢?在我看来,“备孕期”主要指那些初入Java编程的新人,他们正下足功夫准备,以求在10个月后以高薪的姿态进入一家软件公司——此时正是职业履历的开端——比如说,简历上的自我介绍是:我从2018年10月24日(程序员节)进入一家“青苗科技工作室”(我组织的一个接私活的小团队;有Web全栈、安卓等方面的项目可以私聊我哦),正式开始编写为自己带来第一桶金的Java代码…距今,我已经有8年的Java编程经验了…
一、什么是OOP?
学习Java的程序员第一个要了解的基础知识就是:什么是OOP?让我来举一个生动的例子,知道齐天大圣孙悟空吧?这只孙猴子就是一个对象,关键看你要把他看成是一只猴子,还是一个神仙。你知道Dota吗?在这款推塔杀人的游戏当中,就有齐天大圣孙悟空这个角色,貌似欧洲战队玩的很溜,反倒国内战队在比赛中使用的频率很低。
来看一段代码吧:
public class SunWukong { private Integer healthPoint;// 生命值 private Integer magicPoint;// 魔法值 /** * 棒击大地 */ private void rodHittingTheEarth() { } /** * 丛林之舞 */ private void jungleDance() { } }
当我们把孙悟空看成一个对象的时候,编程就变得简单了起来;我们给他两个属性(生命值和魔法值),给他两个技能(棒击大地和丛林之舞)。假如我是LGD战队的357,一名聪明绝顶的好教练,主要负责赛前的BP工作和战术的研发。现在,是TI9的小组赛,LGD对阵OB的第一局。我,357在BP阶段先BAN掉了比较克制孙悟空的兽王和发条技师,然后在选人阶段(PICK)挑选了水晶室女这个冰美人来和孙悟空这个一身毛的家伙搭配。那么,在我选孙悟空的这个阶段,就等于说创建了一个孙悟空的对象,也就相当于Java中的new SunWukong()。选好了孙悟空,让谁来玩呢?自然是我们队中号称世界第一中单的maybe啊。
OOP其实并不难懂,不过就是英文单词Object-Oriented(导向的、面向的意思) Programming的首字母缩写嘛。OOP给我们一种观念,就是“万物皆对象”——我们可以尽可能的发挥想象,把现实中的物(包括动物、人物、甚至无生命的事物)抽象为一种计算机语言(比如Java)能懂的模型,那么,接下来我们让计算机来解决现实中的问题就变得简单了起来。
OOP的强大之处就在于,它使我们不必依照计算机的限制来模拟现实中的物;我们可以基于现实中要解决的问题来构建对象,使这个对象具有现实中物所具有的特征(对应Java中的属性)和行为(对应Java中的方法)。物不同,对象所具有的属性和方法就会不同。
还拿Dota中的英雄来说吧。所有的英雄都可以抽象为一个类(对象是类的实例化),这个类包含了英雄对应的成长属性(生命值、魔法值、伤害值、护甲值等等),以及对应的技能行为。那么,怎么区分每个英雄的不同呢?比如说冰美人水晶室女是一个魔法辅助类的英雄,因此,她的初始化生命值自然比敏捷类的齐天大圣低一些,但魔法值高一些;另外,他们的技能也完全不同——孙悟空拿着一根金箍棒,所以他的技能就有棒击大地;水晶室女拿着一根法杖,所以她的技能就有冰霜新星、冰封禁制等。
在我看来,OOP概念的提出,是编程界的一个重要的里程碑。它给我们以下重要的启示:
- 万物皆对象。
- 程序是对象相互协作的一个过程,他们通过发送消息来告知彼此要做的事情。
- 每个对象都有自己的类型,也就是“每个对象都是某个类(class,抽象数据类型)的一个实例”。尽管每个对象都是唯一的(在内存中拥有一个唯一的地址),但具有相同状态(属性、变量)和类似行为(方法)的对象可以归属为一个类。
- 每个对象都提供了某种服务。比如说孙悟空可以跳上树上(丛林之舞),然后再跳下来对区域内的敌人造成减速和伤害(乾坤跳跃)。
二、什么是继承?
通俗来说,可以这么来理解继承(extends)——小明他爸是个七品芝麻官,那么小明就是个管二代;小明他爸当年走过草地,越过大山,一下子步行了两万五千里(换成现在的微信运动排名,绝对天天第一),那么小明就是个哄二代;小明他爸有三亩地,拆迁后分了10套房,那么小明就是差二代。
再继续说下去:小华和小华他爸都是手艺人,都特别喜欢画画,小华他爸是自学成才,小华应该算是继承了他爸的好基因,属于天才型;等小华长到20岁的时候,他觉得不能就这么一直和他爸一样只画风景画,那样他取得的成就也不会高过他爸;于是,他改画人像画,经过十年的努力,小华在艺术界的地位甚至超过了他爸,人称“华·芬奇”。按程序员的逻辑思维来看,小华这个举动可以称作为“覆盖(overriding)”,使子类和父类产生差异的一种方法。
小华画呀画呀,就这么一直画到了40岁;小华终于感到画画再也满足不了他了,他突然爱上Java编程,并立志成为一名“黑客”;于是就有了“黑客与画家”的故事。按程序员的逻辑思维来看,小华成为“黑客”这个行为可谓特立独行,这使得小华和他爸不再只是纯粹的替代关系(is-a的关系),变成了一种相似的替代关系(他们都还是画家,但小华同时又是一名黑客,is-like-a的关系)。
在Java中,所有的类最终的父类都是Object类,这被称为“单根继承”——保证了多有对象都具备了某些功能。比如说最常见的toString()方法:
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
三、one more thing?
nothing。
没有了,我认为一篇文章的最佳字数在2000到3000,这篇文章写到这里已经2600多字了。所以,是时候收尾了:Java是一门面向对象的编程语言,因此,“备孕期”的Java程序员一定要学会“抽象”,把现实问题抽象为一个个立体化的对象,这样所有的问题就会按照人的逻辑来处理,而不是计算机的逻辑。
推荐阅读
-
小小扎马-Java生成指定范围和跳过指定数字的代码
-
mysql insert的几点操作(DELAYED,IGNORE,ON DUPLICATE KEY UPDAT_MySQL
-
噢三个数字之间纠缠不清的故事.
-
“备孕期”的Java程序员一定要学会抽象 | 《Java编程思想拆书》
-
MongoDB 索引技巧 #1: 查找好友最新的动态
-
PHP扩展模块Pecl、Pear以及Perl的区别
-
php中的curl使用入门教程和常见用法实例_PHP教程
-
MySQL中文汉字转拼音的自定义函数和使用实例(首字的首字母)_MySQL
-
php取input数组的值
-
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数_PHP