Java 工作原理

Generic java programming code written on black screen
Java 是一种流行的计算机语言。funky-data / Getty Images

您是否曾好奇计算机程序是如何工作的?您是否曾想学习如何编写自己的计算机程序?无论您是14岁,希望能学习编写您的第一个游戏,还是70岁,对计算机编程好奇了20年,本文都适合您。在本期 十万个为什么 中,我将通过教您如何使用 Java 编程语言进行编程来讲解计算机程序的工作原理。

为了教您计算机编程,我将从一开始就做出几个假设

广告

  • 我将假设您现在对计算机编程一无所知。如果您已经了解一些知识,那么本文的第一部分对您来说会显得很基础。请随意跳过,直到遇到您不了解的内容。
  • 我将假设您确实对您正在使用的计算机有所了解。也就是说,我将假设您已经知道如何编辑文件、复制和删除文件、重命名文件、在您的系统中查找信息等。
  • 为简单起见,我将假设您正在使用运行 Windows 95、98、2000、NT 或 XP 的机器。对于运行其他操作系统的用户来说,将这些概念映射过去应该相对简单。
  • 我将假设您有学习的愿望。

您开始用 Java 编程所需的所有工具在网络上都可免费获得。网络上也有大量的 Java 教育材料,因此一旦您完成本文,就可以轻松地学习更多内容以提升您的技能。您可以在这里学习 Java 编程,而无需在编译器、开发环境、阅读材料等方面花费任何金钱。一旦您学会了 Java,学习其他语言就很容易了,所以这是一个很好的起点。

说了这些,我们准备开始。让我们开始吧!

广告

一些术语

请记住,我假设您对编程一无所知。以下是一些词汇术语,将有助于您理解内容

  • 计算机程序 - 计算机程序是一组指令,它告诉计算机确切地做什么。这些指令可能告诉计算机计算一组数字的总和,或者比较两个数字并根据结果做出决策,或者其他任何事情。但计算机程序仅仅是计算机的一组指令,就像食谱是一组给厨师的指令,或者音符是一组给音乐家的指令一样。计算机将精确地遵循您的指令,并在此过程中完成一些有用的事情——例如平衡支票簿、在屏幕上显示游戏或实现一个文字处理器。
  • 编程语言 - 为了让计算机识别您给它的指令,这些指令需要用计算机理解的语言编写——即编程语言。有许多计算机编程语言——Fortran、Cobol、Basic、Pascal、C、C++、Java、Perl——就像有许多口语一样。它们都以不同的方式表达大致相同的概念。
  • 编译器 - 编译器将用人类可读的计算机语言(如 Java)编写的计算机程序翻译成计算机可以执行的形式。您可能在计算机上看到过 EXE 文件。这些 EXE 文件是编译器的输出。它们包含可执行文件——从人类可读程序翻译而来的机器可读程序。

为了让您开始用名为 Java 的编程语言编写计算机程序,您需要一个 Java 语言的编译器。下一节将指导您完成下载和安装编译器的过程。一旦您有了编译器,我们就可以开始了。这个过程将花费数小时,其中大部分时间是下载几个大文件的时间。您还需要大约 40 兆字节的可用磁盘空间(请确保在开始之前有足够的空间)。

广告

下载 Java 编译器

为了在您的机器上设置 Java 开发环境——您使用“开发环境”来“开发”(编写)计算机程序——您必须完成以下步骤

  1. 下载包含 Java 开发环境(编译器和其他工具)的大文件。
  2. 下载包含 Java 文档的大文件。
  3. 如果您的机器上还没有 WinZip(或等效软件),您将需要下载一个包含 WinZip 的大文件并进行安装。
  4. 安装 Java 开发环境。
  5. 安装文档。
  6. 调整几个环境变量。
  7. 测试所有内容。

在开始之前,如果您在临时目录中创建一个新目录来存放我们将要下载的文件,事情会变得更容易。我们将此目录称为下载目录

广告

步骤 1 - 下载 Java 开发环境

访问页面 http://java.sun.com/j2se/1.4.2/download.html。点击“Download J2SE SDK”链接下载 SDK 软件。您将看到一个许可协议。点击接受。选择您的操作系统并将文件下载到您的下载目录。这是一个非常大的文件,通过普通的电话线调制解调器下载需要数小时。接下来的两个文件也很大。

步骤 2 - 下载 Java 文档

通过选择您的操作系统并点击 SDK 1.4.1 文档链接来下载文档。

步骤 3 - 下载并安装 WinZip

如果您的机器上没有 WinZip 或其等效版本,请访问页面 http://www.winzip.com/ 下载 WinZip 的评估副本。运行您获得的 EXE 文件进行安装。我们稍后将使用它来安装文档。

步骤 4 - 安装开发工具包

运行您在步骤 1 中下载的 j2sdk-1_4_1-*.exe 文件。它将自动解压并安装开发工具包。

步骤 5 - 安装文档

阅读文档的安装说明。它们会指导您将文档文件移动到与您刚刚安装的开发工具包所在的同一目录。解压文档后,它将放置到正确的位置。

步骤 6 - 调整您的环境

按照此页面上的指示,您需要更改您的路径变量。最简单的方法是打开 MS-DOS 提示符并输入 PATH 查看当前路径设置。然后用 Notepad 打开 autoexec.bat,并根据说明更改 PATH。

步骤 7 - 测试

现在您应该能够打开另一个 MS-DOS 窗口并输入 javac。如果一切设置正确,您应该会看到两行文本,告诉您如何使用 javac。这意味着您已准备就绪。如果您看到消息“Bad Command or File Name”,则表示您尚未准备好。通过重新阅读安装说明找出您做错了什么。确保 PATH 设置正确并正常工作。回头重新阅读上面的《程序员信条》,并坚持不懈直到问题解决。

现在,您已拥有一台可以编译 Java 程序的机器。您已准备好开始编写软件!

顺便说一下,您刚刚解压的其中一个东西是一个demo目录,里面充满了精美示例。所有示例都已准备好运行,所以您可能想找到该目录并试玩一些示例。其中许多会发出声音,所以请务必打开您的扬声器。要运行示例,请查找名称如example1.html的页面,并将其加载到您常用的网页浏览器中。

广告

您的第一个程序

您的第一个程序将简短而精彩。它将创建一个绘图区域并在其中绘制一条对角线。要创建此程序,您需要

  1. 打开 Notepad 并输入(或剪切粘贴)程序
  2. 保存程序
  3. 用 Java 编译器编译程序以创建Java applet
  4. 修复任何问题
  5. 创建一个 HTML 网页来“承载”您创建的 Java Applet
  6. 运行 Java applet

这是我们用于此演示的程序

广告

import java.awt.Graphics;

public class FirstApplet extends java.applet.Applet
{

    public void paint(Graphics g)
    {
        g.drawLine(0, 0, 200, 200);
    }
}

步骤 1 - 输入程序

创建一个新目录来存放您的程序。打开 Notepad(或任何其他可以创建 TXT 文件的文本编辑器)。将程序输入或剪切粘贴到 Notepad 窗口中。这很重要:当您输入程序时,大小写敏感。这意味着您必须完全按照程序中显示的大小写字符进行输入。回顾上面的程序员信条。如果您输入的与所示不完全一致,它将无法工作。

步骤 2 - 保存文件

将文件保存为您在步骤 1 中创建的目录中的文件名FirstApplet.java。文件名大小写敏感。确保 'F' 和 'A' 是大写,所有其他字符都是小写,如所示。

步骤 3 - 编译程序

打开一个 MS-DOS 窗口。将目录(“cd”)更改为包含FirstApplet.java的目录。输入

javac FirstApplet.java

大小写敏感!要么它会工作,这种情况下窗口中不会打印任何内容;要么会出现错误。如果没有错误,将在 FirstApplet.java 旁边的目录中创建一个名为 FirstApplet.class 的文件。

(请确保文件保存为FirstApplet.java而不是FirstApplet.java.txt。最简单的做法是在 MS-DOS 窗口中输入dir并查看文件名。如果它有.txt扩展名,请通过重命名文件来删除它。或者运行 Windows 资源管理器并在“查看”菜单中选择“选项”。确保“隐藏已知文件类型的扩展名”框未选中,然后用资源管理器查看文件名。如有必要,请更改它。)

步骤 4 - 修复任何问题

如果存在错误,请修复它们。将您的程序与上面的程序进行比较,使它们完全匹配。持续重新编译直到没有错误。如果javac似乎不工作,请回顾上一节并修复您的安装。

步骤 5 - 创建一个 HTML 页面

创建一个 HTML 页面来承载 applet。打开另一个 Notepad 窗口。在其中输入以下内容

<html>
<body>
<applet code=FirstApplet.class width=200 height=200>
</applet>
</body>
</html>

将此文件保存在同一目录中,文件名为applet.htm

[如果您以前从未接触过 HTML,请阅读网页的工作原理applet 标签是您从网页访问 Java applet 的方式。]

步骤 6 - 运行 Applet

在您的 MS-DOS 窗口中,输入

appletviewer applet.htm

您应该会看到一条对角线从左上角延伸到右下角。

将 applet 查看器拉大一点,以查看整条线。您也应该能够将 HTML 页面加载到任何现代浏览器(如 Netscape Navigator 或 Microsoft Internet Explorer)中,并看到大致相同的内容。

您已成功创建您的第一个程序!!!

广告

理解刚刚发生了什么

那么刚刚发生了什么?

首先,您编写了一个极其简单的Java applet的代码片段。Applet 是一种可以在 Web 浏览器中运行的 Java 程序,与Java 应用程序(一种在您的本地机器上运行的独立程序)不同(Java 应用程序稍微复杂一些,也相对不那么流行,所以我们将从 applet 开始)。我们使用javac编译了 applet。然后我们创建了一个极其简单的网页来“承载”applet。我们使用appletviewer运行了 applet,但您也可以同样轻松地在浏览器中运行它。

广告

程序本身大约有 10 行长

import java.awt.Graphics;

public class FirstApplet extends java.applet.Applet
{

    public void paint(Graphics g)
    {
        g.drawLine(0, 0, 200, 200);
    }
}

这是您可以创建的最简单的 Java applet。要完全理解它,您需要学习相当多的知识,尤其是在面向对象编程技术领域。由于我假设您没有编程经验,我希望您目前只关注程序中的一行代码

g.drawLine(0, 0, 200, 200);

这是程序中执行工作的行。它绘制对角线。程序的其余部分是支持这一行的脚手架,我们暂时可以忽略这些脚手架。这里发生的是,我们告诉计算机绘制一条从左上角 (0,0) 到右下角 (200, 200) 的线。计算机完全按照我们的指示绘制了它。这就是计算机编程的精髓!

(另请注意,在 HTML 页面中,我们在上面的步骤 5 中将 applet 窗口的大小设置为宽度 200 和高度 200。)

在这个程序中,我们调用了一个名为drawLine方法(又称函数),并向它传递了四个参数(0, 0, 200, 200)。这行以分号结束。分号的作用就像句子末尾的句号。这行以g.开头,表示我们想在名为g的特定对象上调用名为drawLine的方法(您可以在上面一行看到它属于Graphics类——我们将在本文后面更详细地讨论类和类的方法)。

方法只是一个命令——它告诉计算机做某事。在这种情况下,drawLine告诉计算机在指定点之间绘制一条线:(0, 0) 和 (200, 200)。您可以将窗口想象成其 (0,0) 坐标位于左上角,X 和 Y 轴正方向分别向右和向下延伸。屏幕上的每个点(每个像素)是刻度上的一个增量。

尝试使用不同的数字作为四个参数进行实验。更改一两个数字,保存您的更改,用javac重新编译,并在appletviewer中每次更改后重新运行,看看您会发现什么。

除了drawLine之外还有哪些函数可用?您可以通过查阅Graphics类的文档来找到答案。当您安装 Java 开发工具包并解压文档时,其中一个解压出来的文件名为java.awt.Graphics.html,它在您的机器上。这个文件解释了Graphics类。在我的机器上,这个文件的确切路径是 D:\jdk1.1.7\docs\api\java.awt.Graphics.html。在您的机器上,路径可能会略有不同,但很接近——这取决于您的具体安装位置。找到该文件并打开它。在该文件的顶部附近有一个名为“方法索引”的部分。这是该类支持的所有方法的列表。drawLine方法是其中之一,但您可以看到许多其他方法。您可以绘制,其中包括

  • 线条
  • 圆弧
  • 椭圆
  • 多边形
  • 矩形
  • 字符串
  • 字符

阅读并尝试用这些不同的方法进行实验,以发现可能性。例如,尝试这段代码

        g.drawLine(0, 0, 200, 200);
        g.drawRect(0, 0, 200, 200);
        g.drawLine(200, 0, 0, 200);

它将绘制一个带有两条对角线的盒子(务必将窗口拉得足够大以看到整个内容)。尝试绘制其他形状。阅读并尝试使用setColor方法更改颜色。例如

import java.awt.Graphics;
import java.awt.Color;

public class FirstApplet extends java.applet.Applet
{

    public void paint(Graphics g)
    {
        g.setColor(Color.red);
        g.fillRect(0, 0, 200, 200);
        g.setColor(Color.black);
        g.drawLine(0, 0, 200, 200);
        g.drawLine(200, 0, 0, 200);
    }
}

注意程序第二行新增的import语句。此程序的输出如下

现在您脑中可能闪过一个问题:“他怎么知道要用Color.red而不是简单的red,以及他怎么知道要添加第二个import行?”您可以通过示例学习这些东西。因为我刚刚向您展示了如何调用setColor方法的示例,所以您现在知道,每当您想改变颜色时,您将使用Color.后面跟一个颜色名称作为setColor方法的参数,并且您将在程序的顶部添加相应的import行。如果您查阅setColor,它有一个链接会告诉您关于Color类的信息,其中列出了所有有效的颜色名称以及创建新的(未命名)颜色的技术。您阅读这些信息,将其储存在脑中,现在您就知道如何在 Java 中改变颜色了。这就是成为一名计算机程序员的精髓——您学习技术并记住它们,以便编写下一个程序。您可以通过阅读示例(如您在此处所做)、阅读文档或查看示例代码(如 demo 目录中的代码)来学习这些技术。如果您有一个喜欢探索、学习和记忆事物的大脑,那么您一定会喜欢编程!

在本节中,您已经学习了如何编写线性的、顺序的代码——代码块由从上到下执行的方法调用组成(尝试在绘制红色矩形之前绘制其中一条线,看看会发生什么——它将被矩形覆盖并变得不可见。代码序列中行的顺序很重要)。顺序代码行构成了任何计算机程序的基本核心。尝试使用所有不同的绘图方法,看看您能发现什么。

广告

Bug 和调试

在学习编程时,您会注意到一件事,那就是您倾向于犯相当多的错误和假设,这些错误和假设会导致您的程序要么:1) 无法编译,要么 2) 在执行时产生您不期望的输出。这些问题被称为bug,而消除它们的行为被称为调试。任何程序员大约一半的时间都花在调试上。

您将有充足的时间和机会创建自己的 bug,但为了更熟悉各种可能性,让我们创建一些。在您的程序中,尝试删除行末的一个分号,然后用javac编译程序。编译器会给您一个错误消息。这被称为编译错误,在执行程序之前您必须消除所有这些错误。尝试拼错函数名,遗漏一个“{”或删除一条import行,以熟悉不同的编译错误。第一次看到某种类型的编译错误可能会令人沮丧,但通过像这样——有意创建已知错误——进行实验,您可以熟悉许多常见的错误。

广告

Bug,也称为执行(或运行时)错误,发生在程序编译正常并运行,但随后未产生您预期的输出时。例如,这段代码会生成一个带有两条对角线的红色矩形

        g.setColor(Color.red);
        g.fillRect(0, 0, 200, 200);
        g.setColor(Color.black);
        g.drawLine(0, 0, 200, 200);
        g.drawLine(200, 0, 0, 200);

另一方面,以下代码只生成红色矩形(它覆盖了那两条线)

        g.setColor(Color.black);
        g.drawLine(0, 0, 200, 200);
        g.drawLine(200, 0, 0, 200);
        g.setColor(Color.red);
        g.fillRect(0, 0, 200, 200);

代码几乎完全相同,但执行时看起来完全不同。如果您期望看到两条对角线,那么第二种情况下的代码就包含一个 bug。

这是另一个例子

        g.drawLine(0, 0, 200, 200);
        g.drawRect(0, 0, 200, 200);
        g.drawLine(200, 0, 0, 200);

这段代码会生成一个带有黑色边框的盒子和两条对角线。而接下来的这段代码只生成一条对角线

        g.drawLine(0, 0, 200, 200);
        g.drawRect(0, 0, 200, 200);
        g.drawLine(0, 200, 0, 200);

同样,如果您期望看到两条对角线,那么第二段代码就包含一个 bug(请仔细查看第二段代码,直到您理解出了什么问题)。这类 bug 可能需要很长时间才能找到,因为它们很微妙。

您将有充足的时间练习发现自己的 bug。平均而言,程序员大约一半的时间都花在追踪、发现和消除 bug 上。当它们出现时,尽量不要感到沮丧——它们是编程生活中正常的一部分。

广告

变量

所有程序都使用变量来临时存放数据片段。例如,如果程序在某个时刻要求用户输入一个数字,您会将其存储在一个变量中,以便以后使用。

变量在程序中使用之前必须定义(或声明),并且您必须为每个变量指定一个特定的类型。例如,您可能声明一个变量的类型允许它保存数字,而另一个变量的类型允许它保存一个人的名字。(因为 Java 要求您在使用变量之前明确定义它们,并声明您计划存储在变量中的值的类型,所以 Java 被称为强类型语言。某些语言没有这些要求。一般来说,在创建大型程序时,强类型倾向于减少您犯的编程错误数量。)

广告

import java.awt.Graphics;
import java.awt.Color;

public class FirstApplet extends java.applet.Applet
{

    public void paint(Graphics g)
    {
        int width = 200;
        int height = 200;
        g.drawRect(0, 0, width, height);
        g.drawLine(0, 0, width, height);
        g.drawLine(width, 0, 0, height);
    }
}

在这个程序中,我们声明了两个名为widthheight的变量。我们声明它们的类型为int。一个int变量可以保存一个整数(例如 1、2、3 等整数)。我们已经将两个变量都初始化为 200。我们也可以这样说

        int width;
        width = 200;
        int height;
        height = 200;

第一种形式只是打字更快一些。

将变量设置为其第一个值的行为称为初始化变量。当您忘记初始化变量时,就会出现一个常见的编程错误。要查看该错误,请尝试删除代码的初始化部分(即“= 200”部分),然后重新编译程序以查看会发生什么。您会发现编译器会抱怨这个问题。顺便说一句,这是一个非常好的功能。它将为您节省大量浪费的时间。

Java 中有两种类型的变量——简单(原始)变量和

int类型是简单的。该变量可以保存一个数字。这就是它能做的全部。您声明一个int,将其设置为一个值并使用它。另一方面,可以包含多个部分并具有使其更易于使用的方法。Rectangle类是一个简单明了的很好的例子,所以让我们从它开始。

我们到目前为止一直在处理的程序的一个局限性是它假定窗口大小为 200x200 像素。如果我们想问窗口“你有多大?”,然后调整我们的矩形和对角线以适应它,该怎么办?如果您回到Graphics类的文档页面(java.awt.Graphics.html——列出所有可用绘图函数的文件),您会看到其中一个函数名为getClipBounds。点击此函数名称以查看完整描述。此函数不接受任何参数,而是返回一个Rectangle类型的值。它返回的矩形包含可用绘图区域的宽度和高度。如果您在此文档页面上点击Rectangle,您将被带到Rectangle类的文档页面(java.awt.Rectangle.html)。查看页面顶部的变量索引部分,您会发现该类包含分别名为 x、y、width 和 height 的四个变量。因此,我们要做的是使用getClipBounds获取剪辑边界矩形,然后从该矩形中提取宽度和高度,并将这些值保存到我们在上一个示例中创建的widthheight变量中,如下所示

import java.awt.Graphics;
import java.awt.Color;
import java.awt.Rectangle;

public class FirstApplet extends java.applet.Applet
{

    public void paint(Graphics g)
    {
        int width;
        int height;
        Rectangle r;

        r = g.getClipBounds();
        width = r.width - 1;
        height = r.height - 1;

        g.drawRect(0, 0, width, height);
        g.drawLine(0, 0, width, height);
        g.drawLine(width, 0, 0, height);
    }
}

当您运行这个例子时,您会注意到矩形和对角线正好适应绘图区域。此外,当您改变窗口大小时,矩形和对角线会自动以新大小重新绘制。这段代码引入了五个新概念,让我们来看看它们

  1. 首先,因为我们使用了 Rectangle 类,所以需要在程序的第三行导入java.awt.Rectangle
  2. 我们在这个程序中声明了三个变量。两个(widthheight)是int类型,一个(r)是 Rectangle 类型。
  3. 我们使用getClipBounds函数来获取绘图区域的大小。它不接受任何参数,所以我们传递给它空参数(“()”),但它返回一个 Rectangle。我们写了这行“r = g.getClipBounds();”来表示:“请将返回的矩形放入变量r中。”
  4. 变量r,作为 Rectangle 类的一个实例,实际上包含四个变量——x、y、width 和 height(您可以通过阅读 Rectangle 类的文档来了解这些名称)。要访问它们,您可以使用“.”(点)运算符。因此,“r.width”这个短语表示:“在变量r中检索名为width的值。”该值被放入我们的局部变量width中。在此过程中,我们减去了 1。尝试不进行减法运算,看看会发生什么。也尝试改为减去五,看看会发生什么。
  5. 最后,我们在绘图函数中使用了widthheight

此时一个常见的问题是:“我们真的需要声明名为widthheight的变量吗?”答案是“不需要”。我们可以直接将r.width - 1输入到绘图函数中。创建变量只是让代码更易于阅读,因此这是一个好习惯。

Java 支持几种简单的变量类型。以下是其中三种最常见的

  • int - 整数值(如 1, 2, 3...)
  • float - 小数值(例如 3.14159)
  • char - 字符值(a, b, c...)

您可以对简单类型执行数学运算。Java 理解+(加法)、-(减法)、*(乘法)、/(除法)以及其他几种运算符。这里有一个示例,说明您如何在程序中使用这些运算。假设您想计算一个直径为 10 英尺的球体的体积。以下代码可以处理它

float diameter = 10;
float radius;
float volume;

radius = diameter / 2.0;
volume = 4.0 / 3.0 * 3.14159 * radius * radius * radius;

第一个计算表示:“将名为diameter的变量中的值除以 2.0,并将结果放入名为radius的变量中。”您可以看到这里的“=”号表示:“将等号右侧计算的结果放入等号左侧的变量中。”

广告

循环

计算机擅长的一件事是执行重复的计算或操作。在前面的章节中,我们已经了解了如何编写“顺序代码块”,所以接下来我们应该讨论如何使一个顺序代码块重复执行的技术。

例如,假设我让您绘制页面顶部所示的网格。

广告

一个好的开始是绘制水平线。

绘制这些线条的一种方法是创建一个顺序代码块

import java.awt.Graphics;

public class FirstApplet extends java.applet.Applet
{

    public void paint(Graphics g)
    {
        int y;
        y = 10;
        g.drawLine(10, y, 210, y);
        y = y + 25;
        g.drawLine(10, y, 210, y);
        y = y + 25;
        g.drawLine(10, y, 210, y);
        y = y + 25;
        g.drawLine(10, y, 210, y);
        y = y + 25;
        g.drawLine(10, y, 210, y);
        y = y + 25;
        g.drawLine(10, y, 210, y);
        y = y + 25;
        g.drawLine(10, y, 210, y);
        y = y + 25;
        g.drawLine(10, y, 210, y);
        y = y + 25;
        g.drawLine(10, y, 210, y);
    }
}

(对于一些新程序员来说,语句“y = y + 25;”第一次看到时可能觉得很奇怪。它的意思是:“取出变量y当前的值,加上 25,然后将结果放回变量y中。”因此,如果该行执行前 y 包含 10,那么执行后它将立即包含 35。)

大多数看到这段代码的人会立刻注意到它包含相同的两行代码反复重复。在这个特定情况下,重复并不算太糟糕,但您可以想象,如果您想创建一个包含数千行和列的网格,这种方法会使程序编写变得非常累人。解决这个问题的方法是循环,如下所示

import java.awt.Graphics;

public class FirstApplet extends java.applet.Applet
{

    public void paint(Graphics g)
    {
        int y;
        y = 10;
        while (y <= 210)
        {
            g.drawLine(10, y, 210, y);
            y = y + 25;
        }
    }
}

当您运行这个程序时,您会看到它绘制了九条长 200 像素的水平线。

while语句是 Java 中的一个循环语句。该语句告诉 Java 以以下方式执行:在while语句处,Java 查看括号中的表达式并询问:“y是否小于或等于 210?”

  • 如果答案是肯定的,那么 Java 将进入由大括号——“{”和“}”——括起来的代码块。循环部分发生在代码块的末尾。当 Java 到达结束大括号时,它会循环回到while语句并再次提出问题。这个循环序列可能会发生很多次。
  • 如果答案是否定的,它将跳过大括号括起来的代码并继续执行。

因此您可以看到,当您运行此程序时,最初y为 10。10 小于 210,所以 Java 进入大括号中的代码块,绘制一条从 (10,10) 到 (210, 10) 的线,将y设置为 35,然后回到while语句。35 小于 210,所以 Java 进入大括号中的代码块,绘制一条从 (10,35) 到 (210, 35) 的线,将y设置为 60,然后回到while语句。此序列重复,直到y最终大于 210。然后程序退出。

我们可以通过在程序中添加第二个循环来完成我们的网格,如下所示

import java.awt.Graphics;

public class FirstApplet extends java.applet.Applet
{

    public void paint(Graphics g)
    {
        int x, y;
        y = 10;
        while (y <= 210)
        {
            g.drawLine(10, y, 210, y);
            y = y + 25;
        }
        x = 10;
        while (x <= 210)
        {
            g.drawLine(x, 10, x, 210);
            x = x + 25;
        }
    }
}

您可以看到while语句包含三个部分

  • 有一个初始化步骤将 y 设置为 10。
  • 然后是 while 语句括号内的评估步骤
  • 然后,在 while 语句的某个地方有一个递增步骤,用于增加 y 的值。

Java 支持另一种做同样事情的方法,它比while语句更紧凑一些。它被称为for语句。如果您有一个看起来像这样的while语句

        y = 10;
        while (y <= 210)
        {
            g.drawLine(10, y, 210, y);
            y = y + 25;
        }

那么等效的for语句看起来像这样

        for (y = 10; y <= 210; y = y + 25)
        {
            g.drawLine(10, y, 210, y);
        }

您可以看到,for语句所做的就是将初始化、评估和递增行浓缩成一个简短的单行。它只是缩短了您编写的程序,仅此而已。

既然我们在这里,关于循环的两点快速提示

  • 在许多情况下,将y初始化为 210,然后在每次循环中递减 25 同样容易。评估会询问:“y是否大于或等于 10?”选择权在于您。大多数人觉得在脑中做加法比做减法更容易,但您可能不同。
  • 递增步骤非常重要。假设您不小心遗漏了循环内部的“y = y + 25;”这部分。那么y的值将永远不会改变——它将始终为 10。因此它永远不会大于 210,并且循环将永远持续下去(或者直到您通过关闭计算机或关闭窗口来停止它)。这种情况称为无限循环。这是一个相当常见的 bug。

为了练习循环,尝试编写程序绘制以下图形

要了解更多关于 Java 和其他计算机编程语言的信息,请查看下一页的链接。

广告

广告

加载中...