Skip to content

Files

Latest commit

70502e8 · Oct 10, 2021

History

History
380 lines (249 loc) · 17.5 KB

File metadata and controls

380 lines (249 loc) · 17.5 KB

一、Java 简介

学习目标

本课程结束时,您将能够:

  • 描述 Java 生态系统的工作原理
  • 编写简单的 Java 程序
  • 从用户处读取输入
  • 利用 java.util 包中的类

导言

在第一课中,我们开始学习 Java。如果您是从使用另一种编程语言的背景中来到 Java 的,您可能知道 Java 是一种用于编程计算机的语言。但 Java 不仅仅限于此。它不仅仅是一种非常流行和成功的语言,实际上无处不在,它是一种技术的集合。除了语言,它还包含一个非常丰富的生态系统,它有一个活跃的社区,在许多方面努力使生态系统尽可能充满活力。

Java 生态系统

Java 生态系统最基本的三个部分是Java 虚拟机(JVM)Java 运行时环境(JRE)和Java 开发工具包(JDK),它们是由 Java 实现提供的库存部件。

Figure 1.1: A representation of the Java ecoystem

图 1.1:Java 生态系统的表示

每个 Java 程序都在一个JVM的控制下运行。每次运行 Java 程序时,都会创建一个 JVM 实例。它为正在运行的 Java 程序提供安全性和隔离。它可以防止代码的运行与系统中的其他程序发生冲突。它就像一个非严格的沙箱,即使在互联网等敌对环境中,也能安全地为资源提供服务,但允许与运行它的计算机进行互操作。更简单地说,JVM 充当计算机中的计算机,专门用于运行 Java 程序。

笔记

服务器通常同时执行多个 JVM。

在 Java 技术股票的层次结构中,最上层是JRE。JRE 是一组程序,其中包含 JVM 以及在 JVM 上执行程序所需的许多库/类文件(通过java命令)。它包括所有基本 Java 类(运行时)以及用于与主机系统交互的库(例如字体管理、与图形系统的通信、播放声音的能力以及用于在浏览器中执行 Java 小程序的插件)和实用程序如前所述,JRE 包括 JVM。

Java 技术股票的顶层是JDK。JDK 包含开发 Java 程序所需的所有程序,它最重要的部分是 Java 编译器(javac。JDK 还包括许多辅助工具,如 Java 反汇编程序(javap),用于创建 Java 应用程序包的实用程序(jar),用于从源代码生成文档的系统(javadoc),以及许多其他实用程序。JDK 是 JRE 的超集,这意味着如果您有 JDK,那么您也有 JRE(和 JVM)。

但这三个部分并不是 Java 的全部。Java 的生态系统包括社区的大量参与,这是该平台流行的原因之一。

笔记

对 GitHub 上顶级 Java 项目使用的最流行 Java 库的研究(根据 2016 年和 2017 年重复的研究)表明,JUnit、Mockito、Google 的 Guava、日志库(log4j、sl4j)和所有 Apache Commons(Commons IO、Commons Lang、Commons Math 等)都标志着它们的存在,还有连接到数据库的库、用于数据分析和机器学习的库、分布式计算,以及几乎任何您可以想象的东西。换句话说,对于您想要编写程序的几乎任何用途,都很有可能存在一个工具库来帮助您完成任务。

除了扩展 Java 股票发行版功能的众多库之外,还有无数工具可用于自动化构建(例如,ApacheAnt、ApacheMaven 和 Gradle)、自动化测试、分发和持续集成/交付程序(例如,Jenkins 和 ApacheContinuum)等等。

我们的第一个 Java 应用程序

正如我们之前简要暗示的,Java 中的程序是用源代码(纯文本,人类可读的文件)编写的,由编译器(在 Java 中,javac生成类文件中的 Java 字节码)处理。然后,包含 Java 字节码的类文件被送入一个名为 Java 的程序,该程序包含执行我们编写的程序的 Java 解释器/JVM:

Figure 1.2: The process of compilation in Java

图 1.2:Java 编译过程

一个简单 Java 程序的语法

与所有编程语言一样,Java 中的源代码必须遵循特定的语法。只有这样,程序才能编译并提供准确的结果。因为 Java 是一种面向对象的编程语言,所以 Java 中的所有内容都包含在类中。一个简单的 Java 程序如下所示:

public class Test { //line 1
    public static void main(String[] args) { //line 2
        System.out.println("Test"); //line 3
    } //line 4
} //line 5

每个 java 程序文件都应该与包含**main()**的类具有相同的名称。它是 Java 程序的入口点。

因此,只有当这些指令存储在名为Test.java的文件中时,前面的程序才会编译并运行,不会出现任何错误。

Java 的另一个关键特性是区分大小写。这意味着System.out.Println将抛出一个错误,因为它没有正确大写。正确的指令应为System.out.println。

main()应始终按照示例中所示进行声明。这是因为,如果main()不是public方法,编译器将不会访问它,java 程序也不会运行。**main()**之所以是静态的,是因为我们不使用任何对象调用它,就像 Java 中所有其他常规方法一样。

笔记

我们将在本书后面更深入地讨论这些公共和静态关键字。

注释用于提供一些附加信息。Java 编译器忽略这些注释。

单行注释用**/表示,多行注释用/**/**表示。

练习 1:一个简单的 Hello World 程序

  1. 右键点击src文件夹,选择新建****类

  2. 输入HelloWorld作为类名,然后点击确定

  3. 在类中输入以下代码:

    public class HelloWorld{    
    public static void main(String[] args) {  // line 2
            System.out.println("Hello, world!");  // line 3
        }
    }
  4. Run the program by clicking on Run | Run 'Main'.

    程序的输出应如下所示:

    Hello World!

练习 2:执行简单数学运算的简单程序

  1. 右键点击src文件夹,选择新建****类

  2. 输入算术运算作为类名,然后点击确定

  3. 将此文件夹中的代码替换为以下代码:

    public class ArithmeticOperations {
        public static void main(String[] args) {
                System.out.println(4 + 5);
                System.out.println(4 * 5);
                System.out.println(4 / 5);
                System.out.println(9 / 2);
        }
    }
  4. Run the main program.

    输出应如下所示:

    9
    20
    0
    4

    在 Java 中,当您将一个整数(如 4)除以另一个整数(如 5)时,结果总是一个整数(除非您另行指示程序)。在前一种情况下,如果看到 4/5 的结果是 0,请不要惊慌,因为这是 4 除以 5 时的商(您可以使用%而不是除法条获得除法的剩余部分)。

    要获得 0.8 的结果,必须指示除法为浮点除法,而不是整数除法。您可以通过以下行执行此操作:

    System.out.println(4.0 / 5);

    是的,这确实意味着,像大多数编程语言一样,Java 中有不止一种类型的数字。

练习 3:显示非 ASCII 字符

  1. 右键点击src文件夹,选择新建****类

  2. 输入算术运算作为类名,然后点击确定

  3. 将此文件夹中的代码替换为以下代码:

    public class HelloNonASCIIWorld {
        public static void main(String[] args) {
                System.out.println("Non-ASCII characters: ☺");
                System.out.println("∀x ∈ ℝ: ⌈x⌉ = −⌊−x⌋");
                System.out.println("π ≅ " + 3.1415926535); // + is used to concatenate 
        }
    }
  4. Run the main program.

    程序的输出应如下所示:

    Non-ASCII characters: ☺
    ∀x: ⌈x⌉ = −⌊−xπ3.1415926535

活动 1:打印简单算术运算的结果

要编写打印任意两个值的和和与积的 java 程序,请执行以下步骤:

  1. 创建一个新类。

  2. 在**main()**中,打印一个句子,描述将与结果一起执行的值操作。

  3. Run the main program. Your output should be similar to the following:

    The sum of 3 + 4 is 7
    The product of 3 + 4 is 12

    笔记

    此活动的解决方案见第 304 页。

Ge 从用户输入

我们之前研究了一个创建输出的程序。现在,我们要研究一个补充程序:一个从用户那里获取输入的程序,这样程序就可以根据用户给程序的内容工作:

import java.io.IOException; // line 1
public class ReadInput { // line 2
    public static void main(String[] args) throws IOException { // line 3
        System.out.println("Enter your first byte");
        int inByte = System.in.read(); // line 4
        System.out.println("The first byte that you typed: " + (char) inByte); // line 5
        System.out.printf("%s: %c.%n", "The first byte that you typed", inByte); // line 6
    } // line 7
} // line 8

现在,我们必须剖析我们的新程序的结构,即具有公共类ReadInput的程序。你可能会注意到它有更多的线条,而且它显然更复杂,但不要担心:每一个细节都会在适当的时候被揭示出来(在其全部、辉煌的深度)。但是,现在,一个简单的解释就可以了,因为我们不想失去对主体的关注,主体是从用户那里获取输入。

首先,在第 1 行,我们使用导入关键字,我们还没有看到。所有 Java 代码都是以分层的方式组织的,包含许多包(稍后我们将更详细地讨论包,包括如何创建自己的包)。

在这里,层次意味着“像树一样组织”,类似于家谱。在程序的第 1 行中,import一词简单地表示我们将使用在java.io.Exception包中组织的方法或类。

在第 2 行,我们像以前一样创建了一个名为ReadInput的新公共类,没有任何意外。正如所料,该程序的源代码必须位于名为ReadInput.java的源文件中。

在第 3 行,我们开始定义我们的main方法,但是,这次,在右括号后面添加一些单词。新单词是。为什么需要这样做?

简短的解释是:“否则,程序将无法编译。”较长版本的解释是“因为当我们读取用户输入时,可能会出现错误,Java 语言迫使我们告诉编译器程序在执行过程中可能遇到的一些错误。”

另外,第 3 行是负责第 1 行中导入需求的行:IOExceptionjava.io.Exception层次结构下的一个特殊类。

第 5 行是实际操作开始的地方:我们定义了一个名为inByte(缩写为“将被输入的字节”)的变量,它将包含System.in.read方法的结果。

System.in.read方法在执行时,将从标准输入(通常是键盘,正如我们已经讨论过的)中获取第一个字节(并且只有一个字节),并将其作为答案返回给执行它的人(在本例中,我们在第 5 行)。我们将此结果存储在inByte变量中,并继续执行程序。

在第 6 行,我们使用调用System.out.println方法的标准方式打印(到标准输出)一条消息,说明我们读取的字节。

请注意,为了打印字节(而不是表示计算机字符的内部数字),我们必须使用以下形式的构造:

  • 开括号
  • 单词char
  • 右括号

我们在名为inByte的变量之前使用此选项。这种构造称为类型转换,将在后面的课程中详细解释。

在第 7 行,我们使用不同的方式将相同的消息打印到标准输出。这意味着向您展示有多少任务可以通过多种方式完成,并且“没有一种正确的”方式。这里,我们使用System.out.println函数。

剩下的行只是关闭了方法定义和ReadInput类的大括号。

System.out.printf的一些主要格式字符串如下表所示:

Table 1.1: Format strings and its meaning

表 1.1:格式字符串及其含义

还有许多其他格式字符串和许多变量,您可以在 Oracle 的网站上找到完整的规范。

我们将看到一些其他常见的(修改过的)格式字符串,例如%.2f(它指示函数打印小数点后正好有两个十进制数字的浮点数,例如 2.57 或-123.45)和%03d(这指示函数打印一个整数,其中至少有三个位置可能剩余 0,例如 001、123 或 27204)。

练习 4:从用户处读取值并执行操作

要从用户处读取两个数字并打印其产品,请执行以下步骤:

  1. 右键点击src文件夹,选择新建****类

  2. 输入ProductOfNos作为类名,然后点击确定

  3. 导入java.io.IOException包:

    import java.io.IOException;
  4. 在**main()**中输入以下代码读取整数:

    public class ProductOfNos{
    public static void main(String[] args){
    System.out.println("Enter the first number");
    int var1 = Integer.parseInt(System.console().readLine());
    System.out.println("Enter the Second number");
    int var2 = Integer.parseInt(System.console().readLine());
  5. 输入以下代码显示两个变量的乘积:

    System.out.printf("The product of the two numbers is %d", (var1 * var2));
    }
    }
  6. 运行程序。您应该会看到类似的输出:

    Enter the first number
    10
    Enter the Second number
    20
    The product of the two numbers is 200

很好,这是您的第一个 Java 程序。

包装

包是 Java 中的名称空间,当您有多个具有相同名称的类时,可以使用它来避免名称冲突。

例如,我们可能有多个名为Student的类由 Sam 开发,另一个名为相同的类由 David 开发。如果我们需要在代码中使用这两个类,我们需要一种方法来区分它们。我们使用包将这两个类放在两个不同的名称空间中。

例如,我们可能在两个包中包含两个类:

  • 山姆学生
  • 大卫。学生

这两个包在文件资源管理器中的外观如下所示:

Figure 1.3: Screenshot of the sam.Student and david.Student packages in File Explorer

图 1.3:FileExplorer 中 sam.Student 和 david.Student 包的屏幕截图

所有 Java 语言的基础类都属于Java.lang包。在 Java 中包含实用程序类的所有类,如集合、本地化类和时间实用程序,都属于Java.util包。

作为程序员,您可以创建和使用自己的包。

使用包装时应遵循的规则

以下是使用软件包时需要考虑的一些规则:

  • 包是用小写字母编写的

  • 为避免名称冲突,包名称应为公司的反向域。例如,如果公司域为example.com,则包名应为com.example。因此,如果该包中有一个Student类,则可以通过com.example.Student 访问该类。

  • Package names should correspond to folder names. For the preceding example, the folder structure would be as follows:

    Figure 1.4: Screenshot of the folder structure in File Explorer

图 1.4:FileExplorer 中文件夹结构的屏幕截图

要在代码中使用包中的类,需要在 Java 文件的顶部导入该类。例如,要使用 Student 类,您可以按如下方式导入它:

import com.example.Student;
public class MyClass {
}

Scannerjava.util包中的一个有用类。这是一种输入类型的简单方法,例如 int 或 string。正如我们在前面的练习中所看到的,包使用**nextInt()**输入具有以下语法的整数:

sc = new Scanner(System.in);
int x =  sc.nextIn()

活动 2:从用户读取值并使用 Scanner 类执行操作

要从用户处读取两个数字并打印其总和,请执行以下步骤:

  1. 创建一个新类,输入ReadScanner作为类名

  2. 导入java.util.Scanner

  3. main()。

  4. 使用System.out.println输出两个数字之和。

  5. Run the main program.

    输出应与此类似:

    Enter a number: 12
    Enter 2nd number: 23
    The sum is 35\.  

    笔记

    此活动的解决方案见第 304 页。

活动 3:计算金融工具的增减百分比

用户希望看到股票和外币等金融工具的每日增减百分比。我们将要求用户输入股票符号、第 1 天的股票价值、第 2 天的相同股票价值,计算百分比变化,并以良好格式打印。为此,请执行以下步骤:

  1. 新建一个类,输入StockChangeCalculator作为类名

  2. 导入java.util.Scanner包:

  3. main()。

  4. 计算百分比变化值。

  5. 使用System.out.println以两位十进制数字输出符号和百分比变化。

  6. Run the main program.

    输出应类似于:

    Enter the stock symbol: AAPL
    Enter AAPL's day 1 value: 100
    Enter AAPL's day 2 value: 91.5
    AAPL has changed -8.50% in one day.

    笔记

    此活动的解决方案见第 305 页。

总结

本课介绍了 Java 的基本知识。我们了解了 Java 程序的一些基本功能,以及如何向控制台显示或打印消息。我们还了解了如何使用输入控制台读取值。我们还研究了可用于分组类的包,并在java.util包中看到了Scanner的示例。

在下一课中,我们将详细介绍如何存储值,以及可以在 Java 程序中使用的不同值。