# 第 2 章　变量和运算符

## 2.1　声明变量

``````String message;

``````

``````int x;

``````

``````String firstName;
String lastName;
int hour, minute;

``````

## 2.2　赋值

``````message = "Hello!"; // 给变量message指定值"Hello!"
hour = 11;          // 将值11赋给变量hour
minute = 59;        // 将变量minute的值设置为59

``````

• 当声明变量时，便创建了一个命名的存储位置。

• 当给变量赋值时，便修改了它的值。

``````message = "123"; // 合法
message = 123;   // 非法

``````

``````String message = "Hello!";
int hour = 11;
int minute = 59;

``````

## 2.3　状态图

``````int a = 5;
int b = a;     // 现在a和b相等
a = 3;         // a和b不再相等

``````

## 2.4　显示变量

``````String firstLine = "Hello, again!";
System.out.println(firstLine);

``````

``````System.out.print("The value of firstLine is ");
System.out.println(firstLine);

``````

``````The value of firstLine is Hello, again!

``````

``````int hour = 11;
int minute = 59;
System.out.print("The current time is ");
System.out.print(hour);
System.out.print(":");
System.out.print(minute);
System.out.println(".");

``````

``````The current time is 11:59.

``````

## 2.5　算术运算符

``````int hour = 11;
int minute = 59;
System.out.print("Number of minutes since midnight: ");
System.out.println(hour * 60 + minute);

``````

``````Number of minutes since midnight: 719

``````

``````System.out.print("Fraction of the hour that has passed: ");
System.out.println(minute / 60);

``````

``````Fraction of the hour that has passed: 0

``````

``````System.out.print("Percent of the hour that has passed: ");
System.out.println(minute * 100 / 60);

``````

``````Percent of the hour that has passed: 98

``````

## 2.6　浮点数

``````double pi;
pi = 3.14159;

``````

``````double minute = 59.0;
System.out.print("Fraction of the hour that has passed: ");
System.out.println(minute / 60.0);

``````

``````Fraction of the hour that has passed: 0.9833333333333333

``````

``````int x = 1.1; // 编译错误

``````

``````double y = 1; // 合法，但这是一种糟糕的做法

``````

``````double y = 1 / 3; // 常见的错误

``````

``````double y = 1.0 / 3.0; // 正确

``````

## 2.7　舍入误差

``````System.out.println(0.1 * 10);
System.out.println(0.1 + 0.1 + 0.1 + 0.1 + 0.1
+ 0.1 + 0.1 + 0.1 + 0.1 + 0.1);

``````

``````1.0
0.9999999999999999

``````

``````double balance = 123.45; // 可能存在舍入误差

``````

``````int balance = 12345; // 美分数

``````

## 2.8　字符串运算符

``````"Hello" - 1     "World" / 123    "Hello" * "World"

``````

``````System.out.println(1 + 2 + "Hello");
// 输出为3Hello

System.out.println("Hello" + 1 + 2);
// 输出为Hello12

``````

Java 按从左到右的顺序执行这些运算。在第 1 行中，`1 + 2` 等于 `3`，而 `3 + "Hello"` 的结果为 `"3Hello"`；在第 2 行中，`"Hello" + 1` 的结果为 `"Hello1"`，而 `"Hello1" + 2` 的结果为 `"Hello12"`

• 乘除运算的优先级高于加减运算，这意味着先乘除后加减。因此 `1 + 2 * 3` 的结果为 `7`，而不是 `9`，而 `2 + 4 / 2` 的结果为 `4`，而不是 `3`

• 运算符的优先级相同时，按从左到右的顺序执行。因此，表达式 `minute * 100 / 60` 先执行乘法运算；如果 `minute` 的值为 59，这个表达式将变为 `5900 / 60`，结果为 `98`。如果按从右到左的顺序执行这些运算，将得到错误的结果 `59 * 1`

• 要想改变默认的运算优先级或对默认的运算优先级不太确定时，可使用括号。首先计算括号内的表达式，因此 `(1 + 2) * 3` 的结果为 `9`。还可用括号让表达式更容易理解，如 `(minute * 100) / 60`，虽然就这个表达式而言，用不用括号对结果并没有影响。

## 2.9　组合

``````System.out.println(17 * 3);

``````

``````System.out.println(hour * 60 + minute);

``````

``````int percentage;
percentage = (minute * 100) / 60;

``````

``````hour = minute + 1;  // 正确
minute + 1 = hour;  // 导致编译错误

``````

## 2.10　错误类型

``````public class Hello {

public static void main(String[] args) {
// 生成一些简单的输出
System.out.println("Hello, World!");
}
}

``````

``````File: Hello.java  [line: 5]
Error: ';' expected

``````

``````File: Hello.java  [line: 7]
Error: reached end of file while parsing

``````

``````Exception in thread "main" java.lang.ArithmeticException: / by zero at Hello.main(Hello.java:5)

``````

``````public class Hello {

public static void main(String[] args) {
System.out.println("Hello, ");
System.out.println("World!");
}
}

``````

``````Hello,
World!

``````

## 2.11　术语表

• 变量

命名的存储位置。所有变量都有类型，这是在创建变量时声明的。

• 数字、字符串或其他可存储在变量中的数据。每个值都属于特定的类型，如 `int``String`

• 声明

创建变量并指定其类型的语句。

• 类型

从数学角度来说，类型是一个值集。变量的类型决定了它可存储哪些值。

• 关键词

编译器用来分析程序的保留词。关键词（如 `public``class``void`）不能用作变量名。

• 赋值

给变量指定值的语句。

• 初始化

首次给变量赋值。

• 状态

程序中的变量及其当前值。

• 状态图

程序在特定时点的状态的图形表示。

• 运算符

表示计算（如加、乘和字符串串接）的符号。

• 操作数

运算符操作的值。在 Java 中，大多数运算符需要两个操作数。

• 表达式

表示单个值的变量、运算符和值的组合。表达式也有类型，这是由表达式包含的运算符和操作数决定的。

• 浮点

一种数据类型，表示包含整数部分和小数部分的数字。在 Java 中，默认的浮点类型为 `double`

• 舍入误差

要表示的数字和与之最接近的浮点数之间的差。

• 拼接

将两个值（通常是字符串）首尾相连。

• 运算顺序

决定运算顺序执行的规则。

• 组合

将简单的表达式和语句合并为复合的表达式和语句。

• 语法

程序的结构，即程序包含的单词和符号的排列方式。

• 编译时错误

导致源代码无法编译的错误，也叫“语法错误”。

• 分析

分析程序的结构，这是编译器做的第一项工作。

• 运行时错误

导致程序无法完成运行的错误，也叫“异常”。

• 逻辑错误

导致程序的行为不符合程序员预期的错误。

## 2.12　练习

(1) 新建一个程序，将其命名为 Date.java。输入或复制类似于程序 Hello World 中的代码，并确保程序能够通过编译并运行。

(2) 仿照 2.4 节中的示例，编写一个创建变量 `day``date``month``year` 的程序。变量 `day` 用于存储星期几（如星期五），`date` 用于存储日期（如 13 号）。这些变量应声明为何种类型呢？将表示当前日期的值赋给这些变量。

(3) 显示（打印）每个变量的值，且每个变量要独占一行。这是一个中间步骤，有助于确认到目前为止一切正确。编译并运行这个程序，然后再接着往下做。

(4) 修改程序，使其以美国标准格式显示日期，如 `Thursday, July 16, 2015`

(5) 修改程序，使其以欧洲格式显示日期。最终的输出应类似于以下这样：

``````American format:
Thursday, July 16, 2015
European format:
Thursday 16 July 2015

``````

(1) 新建一个程序，将其命名为 Time.java。从现在开始，我们将不再提醒你先编写一个可运行的小程序，但你应该这样做。

(2) 仿照 2.4 节中的示例，创建变量 `hour``minute``second`，并将大致表示当前时间的值赋给这些变量。请使用 24 小时制，即如果当前时间是下午两点，就将变量 `hour` 的值设置为 14。

(3) 让程序计算并显示从午夜开始过去了多少秒。

(4) 计算并显示当天还余下多少秒。

(5) 计算并显示当天已逝去时间的百分比。如果用整数计算百分比，可能会出现问题，因此请考虑使用浮点数。

(6) 根据当前时间修改变量 `hour``minute``second` 的值，再编写代码来计算从你开始做这个练习算起，已过去了多少时间。

### 目录

• 第 3 章　输入和输出
• 第 4 章　void 方法
• 第 5 章　条件和逻辑
• 第 6 章　值方法
• 第 7 章　循环
• 第 8 章　数组
• 第 9 章　字符串
• 第 10 章　对象
• 第 11 章　类
• 第 12 章　对象数组
• 第 13 章　数组对象
• 第 14 章　包含其他对象的对象
• 附录 A　开发工具
• 附录 B　Java 2D 图形
• 附录 C　调试
• 作者简介
• 封面简介