Java少儿编程(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-27 15:34:21

点击下载

作者:(西) 纳迪娅·阿梅西亚内·加西亚

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Java少儿编程

Java少儿编程试读:

译者序

一直以来,我们都想翻译一本写给孩子的书,因为这类作品语言亲切、内容鲜活,读着读着你就会扑哧笑出声来。更重要的是,它字里行间富有感染力,能神奇地帮我们找回自己那颗渐渐被遗忘的童心。机缘巧合之下,终于等到了这部作品——一本写给孩子的编程启蒙书。

我们的小读者,或许你很想知道,这本书会讲什么,自己能从书里学到什么。让我来悄悄告诉你,当你打开这本书时,会进入一个叫编程的“魔法世界”,成为一名小小“魔法师”,移动鼠标、敲击键盘、施展名为 Java 的“魔法”。在这个世界中,你将发挥自己的想象力,用魔法操控电脑,把想法变为现实,创造属于自己的一片天地。

这本书将教你如何成为一名“魔法师”。你将学会踏入魔法世界的第一条咒语,让电脑屏幕显示你希望出现的文字;你将创造独一无二的电子存钱罐,存入自己的零花钱,还可以给它加上魔法保护罩,只有知道暗号的小伙伴才能打开;你将模拟火箭升空倒计时,电脑会听从你的命令从 5 数到 1;更棒的是,你能通过魔法,让计算机和你进行“石头剪刀布”对战,看看谁更胜一筹;最后,你还将学会如何加密你的机密文件,把它变成无人能破解的神秘文字,只有你知道真实含义。这些魔法其实一点都不难,只要耐着性子,踏实学习,认真钻研,我相信你一定能够掌握它们,有所收获!

这本书对两位译者来说也意义非凡。我们一个主修西班牙语、另一个主修计算机,跨越了两个大陆、七个时区。经过长达三个月的远程协作,我们最终完成了这部作品的翻译。虽然已经认识十多年,但从未想过有一天能以这种形式合作,借这个机会探索学习彼此的专业领域。我们非常感谢翻译时的相互鼓励和支持,希望在其他领域也能延续这份并肩作战的默契。

在这里还要特别感谢我们的编辑静文。她在本书的翻译过程中一直非常尽心尽责,耐心地帮助我们联系作者、核对细节、反复沟通,旨在为读者们呈现一部更好的作品。

最后,欢迎我们的小读者进入这个叫编程的“魔法世界”,祝愿你顺利成为一名“魔法师”!李凡妮2018 年 5 月于上海姚均霖2018 年 5 月于苏黎世

引言(写给大人们)

首先,非常感谢你拨冗阅读本书。我觉得你一定是想亲自了解一下,你的儿女、学生或身边的其他孩子会从本书中学到什么。

也许你已经对编程基础知识有所了解,甚至你已经是一位行家,只是希望从本书中寻找灵感,想要以创造性、趣味性的方法讲解这些知识,那么你会发现,有一些主题只会略微带过,因为本书更注重基础概念,而非专注于某些细节。这样能让孩子们更熟悉表达指令的方式,而不会过分关注指令背后隐藏的千万种细节和可能。

反之,如果你之前从未有过相关经历,也丝毫不用害怕。这本书不会抛弃任何人,跟着我们循序渐进,你会发现书中的概念其实清晰又简单。如果有人向你寻求编程方面的帮助,我相信你一定有能力帮他答疑解惑。此外,针对不同章节,你可能需要在计算机上做一些准备工作。为了不让你手足无措,后面有一份指南,在里面你会找到所需的所有内容。

再或者,你是一个大大方方把这本书买给自己的成年人。如果是这样,恭喜你!我相信本书也会让你很有收获。尽管我把它定位为针对 8~18 周岁青少年的 Java 入门指南,但所有内容同样也非常适用于你的情况。你可能有几个困惑

也许你想知道,编程对孩子们究竟有什么用。其实我一直在问自己,难道还有什么是编程做不到的吗?

编程是一种能帮助我们搭建新思维的绝妙技能,让我们以一种更有逻辑的方法解决遇到的问题。它教我们对可用数据进行排序,完成高效处理。我总是说,学习编程和算法能开启思维和心智的开关。程序员的思维方式会成为一种受用终生的工具,在许多时候都发挥着至关重要的作用。

编程同样也能考验我们的耐心和抗挫折能力。有时候,编写一段代码就像是在和自己对弈。突然之间某个地方就出了问题,我们怎么也弄不明白,但是也不能轻易半途而废。于是,我们在脑袋里反复琢磨,上学路上想,洗澡的时候想,散步的时候也想……直到有一天,解决难题的方法突然闪现于脑海——我终于明白啦!这种跨出一大步、每次遇到困难都有所成长的感觉,对所有人来说都是无比珍贵的礼物,对于成长中的孩子们就更不用说了。

学习编程也有社交层面的作用。赶快甩开你对编程的偏见,从脑海中抹掉那些孩子们一边喝着饮料,一边抱着计算机的画面吧。无论是在线上还是线下,编程都鼓励我们相互分享、比较意见、开展协作,也推动我们组成团队、分享项目和知识,并从别人写的代码中总结错误、学习经验。在这个过程中,还可以与其他机灵的小脑袋聚在一起,集思广益。

最后还有一点也很重要,编程是民主的体现。它不需要任何特殊技能,也不限制最低年龄,甚至有生理缺陷也没关系。你不需要昂贵的设备,也不需要付费软件许可。任何人都可以随时学习编程。

如果你的孩子看起来更适合学习文科,你也许会疑惑,他到底适不适合学习编程。尽管外行人觉得编程像是一种面向高智商分子和技术狂人的黑魔法,但我必须要告诉你,编程既不是文科,也不是理科——它其实是一门跨学科知识,超越了教育体系在不同学科间划分的一般界限。它是一种非常强大的工具,不仅能满足科学兴趣,也可以为艺术性和创造性的思维服务。此外,虽然有点不好意思承认,但最好的程序有时就源于懒惰。人们不想亲自上阵,希望那些单调乏味的任务能自动执行,或者想要节约点时间,思考、创造和加工抽象思维的时机就应运而生。对每一个学生来说,编程都是必不可少的工具。

同样,我也想告诉你本书的学习目标。写这本书的初衷并不是想让孩子们成为编程专家,本书也不能取代编程领域的正规学习过程。我只希望它能激发读者的好奇心,绘制一条尽可能简单的学习道路,抛弃大量枯燥的理论和严苛的条件,让孩子们从一开始就能自主构建小脚本或小程序。我希望编程学习者能在过程中接受挑战、培养兴趣,并收获成就感。希望他有足够的知识把想象变为现实,不要没理解原理就机械地完成任务。我相信上进心会推着他追寻更广阔的知识,我只是起了个头。如果孩子们读毕本书,想要继续深入学习下去,我就再高兴不过了。要问编程艺术中是否有放之四海而皆准的真理,那必然是学无止境。

引言(写给刚拿起这本书的你)

恭喜你!你现在已经差不多是一名程序员啦。谢谢你的信任,把这项教学使命交给我。

通过这本书,我想揭开一个其他教科书都想要掩盖的秘密:编程其实非常有趣。我非常喜欢编程,因为它是这世上为数不多能让梦想变为现实的方法。(好吧,可能只是一部分梦想。)的确,编程不是一套完美的系统。但据我所知,还没有其他方法能像编程这样,把想法变为指令,再通过执行这条指令,把仅仅存在于脑海中的想法化为现实。

此外,对于充满好奇心的人来说,编程给了他们一个机会,去了解身边那些目前看起来还毫不起眼的事物,知晓它们是如何运转的。一旦掌握了一些编程知识,你就会以另外一种视角看待这个世界了——你会开始想象,自己最喜欢的电子游戏、饮料自动贩卖机、超市的台秤是如何运转的;你还想知道,自己是不是也能写出让这些设备运转的指令;或者像我一样,你不满足于此,甚至在考虑人们是否想到了所有使用那台设备的可行方式……有一些出乎意料的操作可能导致设备崩溃,你又是否能够发现它们?

总之,我试着将这本书写得生动有趣。希望你能尽快学会编写小程序,并将学习到的每个新知识点都应用其中。写入书中的都是对你来说非常基础且必要的内容,因此建议你不要快速浏览,也不要跳过某些章节,最好按照章节顺序阅读。

啊,还有一点!有时你会看到一些灰色方框的延伸阅读,这是我留给你的一些小线索。如果你还好奇,想要深入了解相关主题,或是觉得我教给你的远远不够,就可以继续研究这些内容。你也可以先把这些小方框放在一边,甚至置之不理——反正你说了算。

最后再给你两条建议。

如果你喜欢编程,那就别着急,一步一步来。别对自己要求太高,没有人生下来就什么都会。最重要的是,要给自己足够多的机会去尝试。

如果你不喜欢,不用不安,放下这本书吧。即使你还年轻,但生命毕竟短暂,不要浪费时间赶一趟不想搭乘的火车。

祝你旅途愉快!

我们需要准备什么呢

我们需要一台计算机来完成书中的练习。你可以使用基于 Linux 的操作系统,比如 Ubuntu(这是个很棒的选择),也可以选择任何版本的 Windows 或 MacOS。

把计算机连上网,这对你也很重要。你需要的程序和组件TM

JDK,即 Java 开发工具包(Java Development Kit)。我们要保证执行程序时,计算机能够读懂 Java 代码。我们可以从 Oracle.com 免费下载 JDK。记得下载 Java SE Development Kit 8,这是本书代码的开发环境。

还要确认你下载的 JDK 版本是否与你的操作系统(Windows、Mac 等)及处理器(X86 或 X64)相匹配。如果你不确定处理器的类型,可以在计算机的信息页面查看(如系统、我的电脑、关于本 Mac,或是类似页面)。下载 JDK 后,必须配置你的环境变量。虽然每个操作系统中的配置过程都不相同,但它非常简单。我建议你按照 Oracle 的帮助页面提及的步骤进行配置。

文本编辑器。在做最开始的那些练习时,我推荐你使用尽可能简单的文本编辑器,比如一些功能强大的免费编辑器,像 Notepad++、Atom 和 Vim。本书示例使用的是 Notepad++ 编辑器。

命令行控制台。在 Windows 环境下,你将使用命令提示符;而在 Ubuntu 和 Mac 环境下,你使用的是终端(terminal)。强烈建议你熟悉一下“切换目录”“查看目录包含的文件”等方法。你可以在网上进行一次快速检索,了解可能需要的基本命令。

你并不需要集成开发环境(Integrated Development Environment,IDE)或是其他特别的开发软件。本书的练习只需要文本编辑器就可以完成。因为我认为,学习使用终端充满着乐趣,使用文本编辑器避免了在学习编程的同时还得学习 IDE。你之后有足够的时间慢慢学习这些工具。第 0 章 被称作黑魔法的编程

在开始阅读本书之前,恐怕你得先了解一下计算机和它的工作方式。编程就像是和计算机对话。如果我们不理解计算机的思考方式,就很难让它听懂我们的话。

也许你已经了解了,程序是一段由若干命令组成的脚本,而你的计算机会根据这段脚本执行一系列操作。但问题是计算机并不会说我们的语言,而是说一种被我们称为“机器码”的语言。更麻烦的是,每种处理器都对应着不同的机器码。机器码由若干数字组成,分别对应不同种类的操作、数值或是其他数据。无论行为有多不起眼,都会被一一罗列出来。由于使用机器码编程非常耗时、又很复杂,因此人们发明了其他更便于使用的编程语言,比如我们将在本书中学习的 Java。当你运行程序时,这些编程语言会被翻译成处理器能够理解的机器码。尽管 Java 语言的一小部分代码还是会令人困惑,但它其实已经是对人类来说较为“简单”的一种语言了。对了,刚才说的“翻译”是由一个叫编译器或是解释器的程序完成的。

当编译器编译我们所写的代码时,它会读取指令,检查代码语法是否正确(这些指令有时候也存在语法以外的其他错误)。如果代码的语法正确,编译器就会将指令翻译成机器能够理解的语言;如果代码语法不正确,那么我们会看到错误提示,也无法编译程序……别担心,错误每天都会发生,即使是世界上最专业的程序员也不例外。编译型还是解释型?Java 是一门解释型语言。虽然解释器和编译器有相似之处,但它们并不是同义词。你可以上网搜索,了解更多编译型语言和解释型语言的不同之处。书写魔法:算法

现在我们已经了解到,人们使用了一种方便理解的语言进行编程,然后将其传送给编译器翻译,使处理器能够读懂代码。

然而,我们该怎么组织这一系列的命令呢?

电脑只会照本宣科:它不会做任何没被要求做的事,它也会尽可能执行所有发送给它的命令。电脑总是需要我们告诉它要执行什么、怎么做、什么时候做和按什么顺序做,甚至还要告诉它,当某些事不能完成时,我们又期望它做些什么。为了有序、清晰地表达所有命令,我们需要一套工作方法、一种详细阐述指令的规范。于是就有了算法。我很赞同维基百科对算法的词条解释:算法是一套指令,或一系列明确定义、有序且有限的规则,它允许我们通过连续的步骤完成一个活动,而这些步骤不会使执行者产生歧义。我们可以把算法想象成传达给某个人的一系列指令,这个人必须完成某个任务却不知道怎么开始。

如果要为一名不知道怎么给植物浇水的见习园丁编写一个算法,可以这样写:

(1) 拿一个水壶;

(2) 将它放在水龙头下面;

(3) 打开水龙头,等待水流出;

(4) 让水龙头开着,直到水壶盛满 500 毫升的水;

(5) 关上水龙头,等待水流停止;

(6) 把水壶带到花园;

(7) 找到植物的位置;

(8) 在植物上方倾斜水壶,保持住,直到水全部浇完;

(9) 把水壶放好。

正如你看到的,在我们发给见习园丁的指令中,有几个十分重要的细节:● 完成动作的顺序;● 动作什么时候结束;● 完成浇水后该做什么。

如果不注明动作顺序,见习园丁可能会先浇水,再往水壶里装水,这样植物就会因缺水而死;如果不告诉他什么时候关上水龙头,那我们的园丁朋友可能会让房子变成游泳池;如果不告诉他最后应该收好水壶,那他可能会永远把水壶挂在植物上。我们的朋友只会按照指示做事,电脑也是如此,这就是为什么算法必须要准确、有序,并且有明确的结束。

以上就是你开始写代码前需要了解的所有预备理论。太棒啦!练习

我为你准备了一些非常简单的练习,看看你是不是正确理解了上面的内容。我们可不想让植物因缺水而枯萎。(练习的答案在第 5 页,可别提早偷看答案哦!)

小测试

(1) 处理器可以执行你用 Java 编写的代码吗?

  a) 当然可以

  b) 根本不行

(2) 算法指的是……

  a) 处理器能够理解的一段代码

  b) 一系列具体、确切、有限的命令

(3) 为了理解你编写的语言,你的计算机需要( )的翻译

  a) 处理器

  b) 解释器

避免灾难的发生

下面这个算法的一些错误会给我们招来祸患,你能指出并纠正这些错误吗?

炸薯条的做法:

(1) 准备足够的土豆;

(2) 拿一把削皮刀;

(3) 开始削土豆皮;

(4) 把平底锅放在炉子上;

(5) 开火并调至中火;

(6) 将油倒入锅中;

(7) 将土豆倒入平底锅中;

(8) 炸土豆;

(9) 将土豆从平底锅盛出并放在盘子上。

编写你自己的算法

这是给勤奋学生的附加练习。根据下述任务创建指令序列,即算法:● 熨一件衬衫;● 寄一封信;● 刷牙;● 在头的一侧编辫子;● 系鞋带;● 给气球打气。答案

小测试

(1) - b)

(2) - b)

(3) - b)

避免灾难的发生

炸薯条的做法:

(1) 准备足够的土豆;

(2) 拿一把削皮刀;

(3) 开始削土豆皮,直到皮都被削干净了;

(4) 把土豆切成 1 厘米厚的薄片(你不会想把它整个扔下去炸了的);

(5) 把平底锅放在炉子上;

(6) 开火并调至中火;

(7) 向平底锅内倒入 100 毫升油(我们可不想一直把瓶子拿在手上);

(8) 当油够热了,将土豆倒入平底锅中;

(9) 炸土豆,将它们炸至金黄 / 炸分钟;

(10) 将土豆从平底锅盛出并放在盘子上;

(11) 关火。

很明显,这只是一次模拟,并不是真正的程序(虽然我们也可以编写一个厨师机器人的软件)。但你可以看到,确定动作执行的顺序和什么时候停止非常重要,否则有些动作将永远持续下去(之后还会提及这点)。第 1 章 咒语之书

我们现在要使用一门特别的、专为人类设计的语言编程,通过编程语言写下算法,也就是希望处理器执行的一系列步骤。

但真正的编程到底是怎样的呢?我们终于要学习这部分内容了。读完本章,你将有机会编写属于自己的程序。

在本书中,我们基于 Java 语言开展学习。为了在你的电脑上运行 Java 程序,也就是让程序跑起来,你需要下面三件东西。● 一款用来写代码的文本编辑器。它不需要有多特别,免费的文本

编辑器就可以,比如本书前面第Ⅹ页向你推荐的那些;● 一个 Java 编译器,它能生成所谓的字节码;● 一个解释器,能让特定的处理器明白我们编写的代码。

我们可以先把 Java 程序看成是用文本编辑器编写的一系列代码。将它保存为扩展名为 . java 的文件,这样电脑就会把这部分内容当作 Java 代码来处理。驼峰编程世界中有一些规则,规定了如何给程序文件命名。在 Java 中,这种命名标准被称作大驼峰式命名法(UpperCamelCase)。这个称呼生动形象、易于记忆,同时也提醒了我们,.java 文件的名字必须是连续完整,没有重音音符、句点或者其他字符的;同时,文件名中的单词之间不能有空格,要首尾相连并大写单词的首字母。这种命名方式方便了编译器的工作,也能帮助我们避免错误。请仔细看,依照这个规则起的名字是不是的确和驼峰的形状很相似。下面是两个正确的程序命名示范:MyFirstProgram.javaRuleTheWorld.java下面是两个不规范的名字:rebelProgram.java(这不会引起报错,但它没有完全遵循命名规范)mariascode.java(这会给我们带来不便)

让我们来谈几个关键问题。怎样才能编写出有效的命令呢?我可以随便写点什么,然后祈祷电脑理解我吗?是不是用英语就足够了?

这当然不行。跟其他魔法一样,编程也依赖于前人所著的、写满古老咒语的魔法书和魔法书店,要被正确施加在某个物体上,才能产生特定的魔法。

下载了第Ⅹ页提到的 JDK 后,你不知不觉就拥有了一间 Java 的魔法书店,编写代码其实就是根据规则调用书中的咒语。要记住,其中有一条规则是:我们把咒语叫作方法,把魔法书叫作类。

开始编程时(我保证,再讲几页就真的开始编程了),我们将调用希望使用的类,让它们听从我们的命令。接着就可以进一步调用它们的方法,影响我们想要操作的一切。你好,世界

按照惯例,“你好,世界”(“Hello, World”)是入门编程时最先写下的几个字,我们当然也不例外。

接下来你会看到一个程序示例,这将是我们分析理解的第一段代码。

注意:在本书中,每当我想要提示你这段内容是 Java 代码时,就会使用这种字体。

首先读到的部分是 public class。我们把它写在文件的开头,这样编译器在读取时就知道,从这里开始的所有内容都是类(class)。此外,我们还给类起了名字,在这里它就叫“HelloWorld”。

接下来读到的是 public static void main…,我们总是把它写在主类的开头部分(像个密码一样,可以开启咒语)。public static void…咒语这句啰里啰唆、不明所以的话总是出现在程序的主类中。尽管你目前还不需要太在意它,但或许你想知道它的含义。类由以下几部分组成。public(公共的)。我们有时候会在程序中写一些秘密方法,不允许程序的其他部分读取。但我们又想把这个开启咒语的密码设置成 public,让编译器能够畅通无阻地访问程序。static(静态的)。虽然将来我们会学习如何创建对象(object),但现在我们创建的是类。为了区分类和对象,我们加上了 static 这个关键字。如果什么都不做,我们很可能会把编译器弄糊涂……总之,这是一个非常高级的魔法。void(空的)。在施加魔法时,有一些方法会有反馈,而另一些方法不返回任何内容。为了避免无谓的苦苦等待,我们必须标记不返回内容的方法,提示这些方法是空的(void)。main(主要的)。因为 main 的意思是主要的,所以我们用它来宣布程序的主要部分。就像田径比赛中的起跑线一样,告诉其他人程序的主体部分从这里开始。String args(字符串参数)是咒语的一部分,它让程序能够用特殊的顺序运行……你不用太纠结,因为本书暂时还用不到它。但比起不知所以然地盲目重复,我们更需要知道代码运行的深层次原因。

接下来,我们有一句双斜杠(//)开头的标注,我们叫它注释。这个双斜杠就像是隐形魔法!它非常有用,因为如果你把双斜杠加到一句代码前面,程序运行时就不会读取它了。你可以通过注释写下需要记住的事情,解释下一段代码的作用,而这些都不会影响编译器工作。

如果你只写一行注释,可以用双斜杠;但如果你想要写一整段注释,可以为它穿上隐形铠甲,/* 就像这样 */,程序就会跳过这部分了。// 这是一条单行注释/* 这一整段藏在神奇铠甲下的注释都将被程序忽略 */

最后,我们写下魔法的主体。我们使用一个名为 System.out.println 的咒语,它可以让你的计算机在屏幕上显示内容。具体来说,就是显示你写在括号里的内容(我们称之为参数)。

我们以这个结构来写方法:. 方法名(" 参数文本");

也就是说,要这么写:● 先写一个点(就像用我们的魔杖指明方向一样);● 然后写方法名;● 紧接着在一片迷雾中(好吧,我是指在一对括号和引号中)写我

们想要用魔法显现的文字。● 最后用一个分号来封印以上所有内容。

再来看看这段程序,是不是没那么难懂了?你可以这么理解:打开魔法书(也就是类),宣布我要开始施魔法了(main() 方法),然后就可以开始念咒语了(System.out.println() 方法)。public class HelloWorld { public static void main(String[] args) { // 在屏幕上显示文本:Hello,World System.out.println("Hello, World"); }}

为了明确那些包含在其他代码中的代码片段,我们用这样的花括号 {} 括住它们。千万别忘了使用花括号,否则编译器就会抱怨不知道哪部分到底归谁,也不知道读到哪儿就该停下了。我们的第一次实践

现在要编写我们的第一个程序了。请非常仔细地阅读以下步骤。

(1) 打开一个文本编辑器,复制我们刚刚分析过的程序。也许你愿意试试先靠记忆默写出代码,之后再查漏补缺。

(2) 保存文件。和给类命名一样,别忘了用大驼峰式的方法给它命名,并且添加扩展名 .java,关闭文件。

(3) 现在要编译程序。从终端(如果你不知道如何操作,请在“我们需要准备什么呢”中寻找相关内容)输入 javac 命令以及你的程序名和扩展名:javac HelloWorld.java

编译器会自动创建一个名为 HelloWorld.class 的新文件,这是我们之后要执行的文件。如果一切进展顺利,你不会看到任何信息提示。

(4) 通过输入 java 命令和程序名来运行它——这次不需要扩展名:java HelloWorld

成功啦!多亏了魔法咒语,我们的程序成功运行了,终端窗口向全世界显示了我们的第一条信息。

出了点问题?如果在编译时出现了某条错误信息,请检查以下细节:● 类的名称和文件的名称是否匹配;● 有没有准确地还原代码;● 是否加了编译所需的扩展名。

如果第一次没有成功,你也不用太担心。只要仔细一点、耐心一些,重新按照指示走一遍,一定会成功的。练习

从我们刚刚创建的程序出发,尝试进行以下修改:● 一个不说“Hello, World”(“你好,世界”)而是说“Bye,

bye, crocodile”(“再见,鳄鱼”)的程序;● 一个先说“Hello, World”(“你好,世界”),然后说“The

weather's good today”(“今天天气不错”)的程序。答案● 要修改屏幕上显示的文本,只需改变引号之间的内容即可。千万

别忘记打上双引号。● 要打印两条信息,你可以重复这个方法(即

System.out.println()):尽管这样看起来不太美观,因为它们都挤

在一块儿了。

System.out.println("Hello, World");

System.out.println("The weather's good today");你也可以把这两条信息放在一起:

System.out.println( "Hello, World", "The weather's good

today");

还有其他方法也可以实现这些内容(之后你就会学到了)。

通过这个练习,我们验证了:你可以将需要的所有方法都写在同一个类当中,写在主方法 main() 的花括号({})中,甚至可以向 System.out.println() 方法传入若干参数(即双引号中的信息)。

试着实现以下内容:● 在同一对括号中加入多条带双引号的信息;● 添加或去除花括号({});● 添加或去除分号(;);● 改变程序名称(就是主方法 main() 中提及的名字),让它和文件

名称不同。

当你做这些改动时,会发生什么?编译器会反馈给你什么信息?可以成功执行程序吗?第 2 章 变量宝藏

我们已经知道了一些程序是如何组成的,以及如何使用编程魔法的知识,是时候学习变量这个无比重要的新元素了。

在本章中,我们将学习什么是变量、变量共有几种类型,以及如何通过编程掌握它们。什么是变量

编程教材里写道:“变量是计算机内存中的一个空间,里面存储着我们赋给它的值。”根据存储信息的种类,变量也分为不同的类型。

这听上去有些不好理解,所以在本章中,我们将像魔法师一样,用神奇的方法创造一座宝藏。

我们的宝藏就藏在一个巨大的箱子里(就像电脑的内存区域一样),里面放着一大堆不同种类、不同形态的数据,它们可值钱了。

宝藏清单上列着不同种类的元素,我们根据场合来使用它们,其中出现频率最高的是下面这些元素。 char(字符):是珍贵的小宝石。背光看看它们的内部,你会发现每个宝石里面都藏着一个带单引号的字符(即符号、数字或者字母)。 int(整数):是金币,每一个都有数值,这个数可以远小于零,也可以大到无法想象。 double/float(浮点数):金币通常都是整数,但有时候我们需要用带小数点的支票付款,比如 25.75 欧元。double(双精度浮点数)和 float(单精度浮点数)便是有小数点的数字。 string(字符串):在英语中是绳子的意思。实际上,字符串不过是一串项链,用双引号把几组字符有序地串起来,让它们不至于散落到各处。如果它们在百宝箱里散得满处都是,那可就不太好了。 bool(布尔型):本身并不是宝藏,但它们能帮助我们守护这些珍宝。它们是一把把小挂锁,只有两个值:true 或 false(小挂锁的开或关)。或许你现在很疑惑它们有什么用,接下来就会慢慢明白了。

好啦,既然已经知道了这些,让我们言归正传。变量是什么呢?变量是百宝箱中的一个独一无二的空间(没错,我们还给这个空间起了名字),拥有上文提到的某个类型,并且包含特定值。例如,宝藏中的变量可以是:● 名为 initial(初始)的字符,值为 'i' ;● 名为 salary(工资)的整数,值为 1500;● 名为 price(价格)的双精度或单精度浮点数,值为 1.45;● 名为 salute(打招呼)的字符串,值为 "Hello" ;● 名为 open(打开)的布尔型,值为 true。

在编程时,你可以按需创建变量。可以在程序一开始就创建变量(更专业的说法是“声明变量”),一旦程序执行,便会生成变量;也可以在方法中动态地创建变量。即使对变量了解得还不多,你也能够对它进行很多操作。

你可以对整数(int)和浮点数(double)进行数学运算,也可以打乱、截取字符串,还可以使用布尔型让程序做决定……充分发挥你的想象力吧。

创建变量最正确的方式是:变量类型 - 变量名 - 变量值。我们按照这种方式声明并初始化上述变量:char initial = 'i';int salary = 1500;float price = 1.45;String salute = "Hello";bool open = true;

注意:我们把字符的值写在单引号之间,而把字符串的值写在双引号之间。如果没有提供任何初始值……声明但不初始化变量当我们不在定义方法的代码中时,我们可以只声明变量,而不用一开始就赋初始值,就像这样:int price;bool open;String salute;一旦这样声明了变量,就等同于在内存中创建了一个空间,或者说一块珠宝,并给了它一个名字(变量名)和一个默认值:如果它是整数,那么默认值为 0;如果是浮点数,默认值是 0.0;如果是布尔型,则是 false;最后,如果是字符或是字符串,那么默认值是“无”,即 null。如果你在方法中声明变量却不初始化,那么编译时就会报错。打印变量

让我们回到上一章编写的 Hello, World 程序。我们这一次不告诉程序需要打印的具体内容,而是告诉它变量的名字,让程序展示它的值。

复制这段代码,编译并执行它:

正如你看到的那样,先初始化变量,再调用方法并把变量的名字传递给它,方法就知道应该显示什么内容了。

但是第 14 行代码是怎么回事呢?请仔细观察程序显示的结果。程序把变量 price 的值(100)乘上标示的值,然后显示计算后的结果。为什么它会这样运行呢?运算符

恭喜你!你刚刚发现了运算符。这是一些神奇的运算符号,能作用于我们的变量。

运算符有很多种类型,比如可以操作数值型变量(int、float、double 等)的算术运算符 +、-、*、/ 等,主要负责数学运算。算术运算符不能用在非数值变量上(除了 + 符号,它可以用来拼接字符串)。

这些神奇的符号使用起来也十分简单,你只需要了解每个符号的功能。我为你准备了一份使用说明书,你可以在需要的时候进行查阅。请记住,你不需要背下这个表格,我们不用像鹦鹉一样机械重复。通过时间的积累和不断的练习,你就能记住这些运算符了。运算符说明赋值运算符=赋值算术运算符+加-减乘*/除%返回除法运算的余数,例如 7 % 5 = 2一元运算符+正数-负数++原值递增 1--原值递减 1将布尔变量的值取反(true 变成 false,反之亦!然)相等性与关系运算符==“与……相等”,如 5 == 5!=“与……不同”,如 3 != 4>大于>=大于等于相等性与关系运算符<小于<=小于等于条件运算符&&与,例如“周一 && 周二”,表示周一和周二||或,例如“周一 || 周二”,表示周一或周二三元运算符。虽然列在这张表中,但本书并不会?:用到它类型比较运算符“类型是……”,例如“5.6 instanceof Double”的instanceof结果是 true

现在让我们来看几个使用这些运算符的例子。你有信心猜中这些程序会在屏幕上显示什么吗?

如果编译并执行程序,你会看到我们可以通过运算符 + 和 - 进行加法、减法或是句子的拼接。

此外,正如上面那个初始化变量 ageAddition 的例子,我们也能用运算符改变变量的值。在这个例子中,我们用另两个变量值之和来初始化该变量,当然也可以进行其他运算。例如,我们要初始化一个新变量,该变量的值是另两个变量相除后的商:int agesResult = momAge / dadAge;

甚至可以用等号:int momAge = dadAge;

这意味着初始化变量 momAge,使它的值等于 dadAge 在赋值时刻的值。(你可能会有疑问,所以我要解释一下,即使之后改变 dadAge 的值, momAge 的值也不会发生变化。因为在初始化的时候,momAge 已经完成了复制 dadAge 变量值的动作,复制后的值和 dadAge 的值存在于不同的内存空间。就像我今天拍了一张自拍照,明天换了发型,这张照片也不会因为我的变化而改变。)

因为这些变量属于相同的类型,所以我们可以对它们进行等于、相加、相减等运算。如果你试着这样写:String a = dadAge;

就会碰到编译错误,这是因为 Java 不允许将存储在整数里的值赋值给字符串。它们不是同一种宝石,因此并不兼容。进击的骆驼你还记得大驼峰式命名法吗?这条规则告诉我们,程序名必须是首尾相连的英语单词,并且每个单词的首字母要大写。现在来学习另一种规则,它是前一种命名法的变体:小驼峰式命名法(lowerCamelCase)。当我们命名变量时,该规则要求使用完整的英语单词,而非缩写。至于字母的大小写问题:如果只使用一个单词,则全部用小写字母表示;如果用两个或两个以上单词,那么除第一个单词外的所有单词首字母大写,例如:int age;float minimumHeight;double averageWomenWeight;即使我们不遵从这个规则,编译器也能理解我们的意思,但我们仍应该遵守 Java 语言的这个标准,因为它能让其他程序员更好地理解我们的代码。关于变量和运算符的一些挑战

我们将要挑战一些高难度的题目,为此要用上迄今为止还未见过的新方法。

我们要学习 Scanner 类(请记住,类就像是一本主题统一的魔法书),它包含了获取用户输入的方法。使用这个强大的方法,我们就可以在运行时通过键盘和程序对话。

要使用这个类,首先要把它添加到程序中,告诉程序我们要使用这本魔法书(这个类)了。为此,需要在程序起始处添加以下指示:import java.util.Scanner;小包裹虽然我们看不见它,但类实际上是属于包(package)的。我们有时候不只导入单个类,还会导入整个包,因为里面包含了我们需要的所有类。

导入了类之后,就可以调用它的方法了。就好像先把书从书架上拿下来,之后就能慢慢阅读需要的咒语了。

要想使用 Scanner 类,我们得遵循以下步骤。● 打开一个新的 Scanner,给它起一个名字。注意:这是一个

叫作 janeDoe 的新 Scanner,从 System.in 中(即键盘)获取用

户的输入。用户的键盘(输入来源)作为参数,放在了一对括号

中。

Scanner janeDoe = new Scanner(System.in);● 创建所需类型的变量。在初始化变量时,我们告诉它,它的

值等于我们用键盘输入的内容,就像这样:

int i = janeDoe.nextInt();

因为我们创建了一个 int 变量,所以程序会等待你输入一个整数(不带小数点的数)。请注意,此处调用方法的形式与之前学习的 println() 方法相同:点-方法名- ( 参数 ),在本题中就是:.nextInt()1。

1nextInt不需要参数,所以括号里空的。——译者注

一切都准备就绪,我们可以开始输入了。程序会捕获我们用键盘输入的内容,并将其存储在内存中,作为一个宝石变量的值。调用 Scanner 类的其他方法我们已经学过了如何调用 Scanner 类来读取 int 类型的数据。如果要读取其他类型的数据,只需要在声明变量的时候更改数据类型就可以了。假设我们继续使用名为 janeDoe 的 Scanner 类,让它读取输入的字符串:String myString = janeDoe.nextLine();或者读取布尔型:bool myBoolean = janeDoe.nextBoolean();或者以此类推,读取浮点数(float)、读取一个字符(char)……但如果我不知道用户会输入什么类型的数据,或者我想让它能够接受任何一种数据呢?好吧,遇到这种情况,你就需要使用条件决策方案了。你将在下节课学习它。电子存钱罐

我们要设计一个模拟存钱罐的程序。这个程序具有以下功能:● 接收钱款● 计算数额● 显示余额

(1) 编写算法,叙述使用存钱罐的流程。这里并没有标准答案,许多方法都可以实现这个要求。

(2) 把以下动作和可以用来完成这些动作的方法、工具连起来:

(3) 一旦完成上述练习,我们就会得到有关程序代码的线索了。

试着写一下代码吧,不能通过编译也没关系。这是一个锻炼构建能力的练习!做完之后再查看参考答案(请记住,答案并不唯一),然后对代码做些必要的改动,直到程序通过编译。

(4) 试验你的新程序。尝试让它出错。试一下输入小于零的数额,会发生什么呢?参考方案

(1) 叙述流程

这道题的正确答案并不唯一,以下只作参考:● 程序开始运行;● 在屏幕上显示存款总额;● 询问用户想在存钱罐里存入多少钱;● 用户输入金额;● 把输入的金额与存钱罐的存款相加;● 在屏幕上显示最新的存款余额。

(2) 接收钱款 - Scanner

  显示余额 - System.out.println

  计算金额 - 算术运算符

  输入金额 - 用户的键盘

(3) 以下是可以成功运行的参考代码(存款初始值可以是 0,也可以是任何其他数额):

如果你运行这段代码,会看到程序依次完成以下内容:● 显示初始的总金额;● 询问你输入的金额;● 等待你输入数额并按下回车键;● 显示目前的余额。

你也可以用其他方式实现算法。如果感兴趣的话,可以想一想别的方法,并且试着分析哪种实现方式最有用。

(4) 要想让你的存钱罐接收项链(即字符串)或者支票(即浮点数),只需要创建其他变量,然后按需使用同一个 Scanner 来接收内容。

试一试以下代码片段(把它添加到程序的主方法中):// 询问用户System.out.println(" 请输入存储金额")// 打开新Scanner 对象Scanner myScanner = new Scanner(System.in);// 创建用来存储输入金额的变量String myDeposit = myScanner.nextLine();necklaces = myDeposit;// 向用户显示目前的余额System.out.println( " 您的余额为"+ balance + "。您的项链余额为 " + necklaces + "。感谢您使用存款服务。");选做练习:只推荐给进阶水平的学生

你知道怎样修改程序才能让它接受带小数的金额吗?换句话说,除了硬币,你还可以在存钱罐里存下支票。

你知道怎样修改程序才能让它接受字符串变量吗?这样的话,你也就可以把“项链”存到存钱罐里了。

提示:本章后面的附录会有你需要的工具。附录:你还可以用字符串做其他事

可以看到,字符串(String)是一种和用户“对话”的途径。我们总是希望把字符串装饰得更美观,让程序看上去更专业。现在我要教你一些操作字符串的小技巧,让你创建更复杂的信息,或是处理用户输入的内容。你现在就可以试一试,也可以在贯穿全书的练习中使用这些技巧。

用 String.length 计算字符串的长度public static void main(String args[]) { String collar = " 一条有76 颗珍珠的项链"; int length = collar.length(); System.out.println(" 字符串长度为:" + length);}

拼接字符串

和之前的做法一样,你可以在一条信息中用加号“+”拼接多个字符串。

同样可以用 String.concat() 方法拼接文本:" 我住在".concat(" 巴塞罗那");

或是直接拼接字符串变量:String str_1 = " 我住在";String str_2 = " 巴塞罗那";str_1.concat(str_2);

以上两种用法都可行,因为 concat() 方法可以同时接受变量和带引号的文本作为参数。

比较字符串

你可以用 compareTo() 方法比较两个字符串(可以是变量或带引号的文本)是否相同。你会得到一个整数类型变量的比较结果。如果两个字符串相同,结果为 0,否则就会得到一个正数或负数。

示例如下:public static void main(String args[]) { String str_1 = " 早上好。"; String str_2 = " 晚上好。"; int result = str_1.compareTo(str_2); System.out.println(" 结果为:" + result);}(如果使用的是 compareToIgnoreCase() 方法,那么在比较字符串时将忽略大小写。)

替换字符

如果你想隐藏之前编写的内容,可以把某个特定的字母替换成另一个,就像创建了一种密码一样!public static void main(String args[]) { String message = new String("My little secret message"); System.out.println(message.replace('e', 'r'));}

这就可以得到“隐藏”的信息:"My littlr srcrrt mrssagr"。

你想加密多少字符都行,然后再根据需要解密。

在 Oracle 的 Java 8 官方指导手册中,你可以找到更多关于字符串操作的建议。第 3 章 许多不同的道路

在前面几章中,我们已经学习了编程的基础知识:什么是方法和类,什么是变量,变量有哪些类型,以及如何对变量使用操作符。

不过,一旦开始想要通过编程实现自己的想法,前面学的内容就不够用了。到目前为止,我们写的程序只懂得一遍遍按部就班地依次执行。但有时候,我们希望程序能“多想想”。

能不能让存钱罐程序先询问我们想存储什么类型的数值呢?这样它就知道应该创建什么类型的变量了。此外,如果我们输错了数据,程序是否能提醒我们,并且允许我们重新输入呢?

这当然可以实现!(其实我还真没见过有什么是编程不能实现的,只是不知道要怎么实现……)控制流结构

为了让程序知道在具体情况下应该怎么做,我们需要预判这些情况,并使用所谓的决策结构或者控制流。共有 3 种决策结构:  IF  IF-ELSE  SWITCH CASE

为了更好地理解决策结构是如何工作的,我们可以将程序想象成一个给发光板供电的魔法电路。电路中布满了电线,其中一些导线的开关闭合,另一些的则断开。因此,魔法电流只能流向那些开关处于闭合状态的灯泡。只有我们闭合主开关,才会产生电流。电流通过每个开关时,会确认它的开合状态,判断是否能连通开关后面相应的灯泡。如果开关的状态是断开,电流则会绕过这里前往下一个开关。if 语句

这样是不是一下就理解了。if 语句用来让程序提问,并帮助我们进行比较。要编写这种类型的指令,我们还要使用第 19 页表中列举的条件运算符。

例如,在之前的存钱罐程序中,我们可以增加一条规定:只接受存款不接受取款。要达到这个目的,我们需要在之前进行运算的地方做修改。原来是这么写的:// 创建用来存储输入金额的变量int deposit = myScanner.nextInt(); balance = deposit + balance;

现在我们可以这么写:// 创建用来存储输入金额的变量int deposit = myScanner.nextInt(); if (deposit > 0) { balance = deposit + balance;}

注意:使用 >(大于)运算符时,我们发出了这样的指示:如果输入的数值大于 0,就运行花括号之间的代码块,即进行加法运算;如果输入的数值为 0 或是负数,就跳过花括号之间的代码段,读取下一条指令。

因此,正确使用 if 语句的方法是:if ( 待比较的元素) { 如果条件满足就会执行的代码块;}

你也可以使用已经学过的其他运算符来设立其他规则,例如:● 只接受数额大于 5 的存款;● 只有在余额少于 100 时才接受存款(if (balance<100));● 如果余额少于 100 ,就接受存款,但存款后的总额不能超过

100(if (balance<100 && balance+deposit < 100))。完善电子存钱罐

改写你的存钱罐程序,在其中加入以下新规则:● 只接受大于 0 的存款;● 只接受数额为偶数的存款。

你可以使用上面提及的代码片段,不要只是复制或者默写,明白其运行的原理更重要。

如果你已经完成了改写,现在就运行存钱罐,试着往里面输入不支持的金额或内容。

会发生什么呢?if-else 语句

到目前为止,我们已经看到,如果条件满足,就可以通过 if 语句让程序执行动作。那如果条件不满足,我们又该怎么办呢?有时候我们希望更进一步,确定以下内容:如果条件满足,程序执行 A 动作;如果条件不满足,那么执行 B 动作。换句话说,我们想要一个只有条件不满足时才进入的语句块,我们称之为 else 语句块。

这和上个例子中的照明电路一样:使用 if 语句,我们可以发出“如果开关闭合,那就点亮灯泡”的指令。而使用 if-else 语句,我们就可以发出“如果开关闭合,那就点亮灯泡,否则就拉响警报”的指令。因此,如果灯泡亮了的话,警报就永远不会响,因为只有 if 语句的条件不满足时,else 中的语句块才会执行。

下面来看一个 Java 代码的实例:int freezerTemp = 3; if (freezerTemp >= 4) { System.out.println(" 冰箱内部的温度过高! "+ " 温度为" + freezerTemp + " 摄氏度。"); } else { System.out.println(" 冰箱正常工作中。");}

这是一段控制冰箱的程序代码。可以看到,程序首先会将温度值

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载