本课程结束时,您将能够:
- 描述 Java 生态系统的工作原理
- 编写简单的 Java 程序
- 从用户处读取输入
- 利用 java.util 包中的类
在第一课中,我们开始学习 Java。如果您是从使用另一种编程语言的背景中来到 Java 的,您可能知道 Java 是一种用于编程计算机的语言。但 Java 不仅仅限于此。它不仅仅是一种非常流行和成功的语言,实际上无处不在,它是一种技术的集合。除了语言,它还包含一个非常丰富的生态系统,它有一个活跃的社区,在许多方面努力使生态系统尽可能充满活力。
Java 生态系统最基本的三个部分是Java 虚拟机(JVM)、Java 运行时环境(JRE)和Java 开发工具包(JDK),它们是由 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 中,javac生成类文件中的 Java 字节码)处理。然后,包含 Java 字节码的类文件被送入一个名为 Java 的程序,该程序包含执行我们编写的程序的 Java 解释器/JVM:
与所有编程语言一样,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 编译器忽略这些注释。
单行注释用**/表示,多行注释用/**/**表示。
-
右键点击src文件夹,选择新建****类。
-
输入HelloWorld作为类名,然后点击确定。
-
在类中输入以下代码:
public class HelloWorld{ public static void main(String[] args) { // line 2 System.out.println("Hello, world!"); // line 3 } }
-
Run the program by clicking on Run | Run 'Main'.
程序的输出应如下所示:
Hello World!
-
右键点击src文件夹,选择新建****类。
-
输入算术运算作为类名,然后点击确定。
-
将此文件夹中的代码替换为以下代码:
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); } }
-
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 中有不止一种类型的数字。
-
右键点击src文件夹,选择新建****类。
-
输入算术运算作为类名,然后点击确定。
-
将此文件夹中的代码替换为以下代码:
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 } }
-
Run the main program.
程序的输出应如下所示:
Non-ASCII characters: ☺ ∀x ∈ ℝ: ⌈x⌉ = −⌊−x⌋ π ≅ 3.1415926535
要编写打印任意两个值的和和与积的 java 程序,请执行以下步骤:
-
创建一个新类。
-
在**main()**中,打印一个句子,描述将与结果一起执行的值操作。
-
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 页。
我们之前研究了一个创建输出的程序。现在,我们要研究一个补充程序:一个从用户那里获取输入的程序,这样程序就可以根据用户给程序的内容工作:
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 行中导入需求的行:IOException是java.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的一些主要格式字符串如下表所示:
还有许多其他格式字符串和许多变量,您可以在 Oracle 的网站上找到完整的规范。
我们将看到一些其他常见的(修改过的)格式字符串,例如%.2f(它指示函数打印小数点后正好有两个十进制数字的浮点数,例如 2.57 或-123.45)和%03d(这指示函数打印一个整数,其中至少有三个位置可能剩余 0,例如 001、123 或 27204)。
要从用户处读取两个数字并打印其产品,请执行以下步骤:
-
右键点击src文件夹,选择新建****类。
-
输入ProductOfNos作为类名,然后点击确定。
-
导入java.io.IOException包:
import java.io.IOException;
-
在**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());
-
输入以下代码显示两个变量的乘积:
System.out.printf("The product of the two numbers is %d", (var1 * var2)); } }
-
运行程序。您应该会看到类似的输出:
Enter the first number 10 Enter the Second number 20 The product of the two numbers is 200
很好,这是您的第一个 Java 程序。
包是 Java 中的名称空间,当您有多个具有相同名称的类时,可以使用它来避免名称冲突。
例如,我们可能有多个名为Student的类由 Sam 开发,另一个名为相同的类由 David 开发。如果我们需要在代码中使用这两个类,我们需要一种方法来区分它们。我们使用包将这两个类放在两个不同的名称空间中。
例如,我们可能在两个包中包含两个类:
- 山姆学生
- 大卫。学生
这两个包在文件资源管理器中的外观如下所示:
所有 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:
要在代码中使用包中的类,需要在 Java 文件的顶部导入该类。例如,要使用 Student 类,您可以按如下方式导入它:
import com.example.Student;
public class MyClass {
}
Scanner是java.util包中的一个有用类。这是一种输入类型的简单方法,例如 int 或 string。正如我们在前面的练习中所看到的,包使用**nextInt()**输入具有以下语法的整数:
sc = new Scanner(System.in);
int x = sc.nextIn()
要从用户处读取两个数字并打印其总和,请执行以下步骤:
-
创建一个新类,输入ReadScanner作为类名
-
导入java.util.Scanner包
-
在main()。
-
使用System.out.println输出两个数字之和。
-
Run the main program.
输出应与此类似:
Enter a number: 12 Enter 2nd number: 23 The sum is 35\.
此活动的解决方案见第 304 页。
用户希望看到股票和外币等金融工具的每日增减百分比。我们将要求用户输入股票符号、第 1 天的股票价值、第 2 天的相同股票价值,计算百分比变化,并以良好格式打印。为此,请执行以下步骤:
-
新建一个类,输入StockChangeCalculator作为类名
-
导入java.util.Scanner包:
-
在main()。
-
计算百分比变化值。
-
使用System.out.println以两位十进制数字输出符号和百分比变化。
-
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 程序中使用的不同值。