第 1 章 咒语之书

第 1 章 咒语之书

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

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

在本书中,我们基于 Java 语言开展学习。为了在你的电脑上运行 Java 程序,也就是让程序跑起来,你需要下面三件东西。

  • 一款用来写代码的文本编辑器。它不需要有多特别,免费的文本编辑器就可以,比如本书前面第Ⅹ页向你推荐的那些;
  • 一个 Java 编译器,它能生成所谓的字节码
  • 一个解释器,能让特定的处理器明白我们编写的代码。

我们可以先把 Java 程序看成是用文本编辑器编写的一系列代码。将它保存为扩展名为 . java 的文件,这样电脑就会把这部分内容当作 Java 代码来处理。

驼峰

编程世界中有一些规则,规定了如何给程序文件命名。在 Java 中,这种命名标准被称作大驼峰式命名法(UpperCamelCase)。这个称呼生动形象、易于记忆,同时也提醒了我们,.java 文件的名字必须是连续完整,没有重音音符、句点或者其他字符的;同时,文件名中的单词之间不能有空格,要首尾相连并大写单词的首字母。这种命名方式方便了编译器的工作,也能帮助我们避免错误。请仔细看,依照这个规则起的名字是不是的确和驼峰的形状很相似。

下面是两个正确的程序命名示范:

MyFirstProgram.java
RuleTheWorld.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() 中提及的名字),让它和文件名称不同。

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

目录