目录
前言
本章主要介绍程序设计的基本概念(如数据类型、分支以及循环)在Java中的实现方式。
3.1 一个简单的Java应用程序
看下面这段简单的代码,它的功能是打印 “We will not use ‘Hello, World!’” 这段话。
public class FirstSample
{
public static void main(String[] args)
{
System.out.println("We will not use 'Hello, World!'");
}
}
从它的结构中,我们可以总结到:
- Java 区分大小写,比如 main 不能写成 Main
- 关键字 public 称为访问修饰符(access modifier),表示程序其他部分对这段代码的访问级别。
- 关键字 class 表示 Java 程序的所有内容都包含在类中。
- class 后面跟的是类名,必须以字母开头,后面可以跟字母和数字的任意组合,但不能使用 Java 保留字(如 public 或 class)。在这段代码中,FirstSample 就是一个标准的命名方式,成为骆驼命名法(camel case)。
- 源代码的文件名必须与公共类的名字相同,存储上面这段代码的文件名必须为 FirstSample.java。
- 编译的时候会生成包含这个类字节码的文件,自动命名为 FirstSample.class,并存储在同一目录下。
- Java 虚拟机总是从指定类中的 main 方法的代码开始执行。
- Java 用大括号 { } 划分程序的各个部分,通常称为块。
- 每个句子必须用分号 ; 结束。
3.2 注释
以下是两种常见的注释方式。
System.out.println("We will not use 'Hello, World!'"); // commment here
/*
Comment here
*/
3.3 数据类型
Java 是一种强类型语言,必须为每一个变量声明一种类型。Java 中,一共有8种基本类型(primitive type),其中有4种整型,2种浮点类型,1种字符类型 char,和1种用于表示真值的 boolean 类型。
3.3.1 整型
整型用于表示没有小数部分的数值,允许是负数。
类型 | 存储需求 | 取值范围 |
---|---|---|
int | 4 字节 | -2 147 483 648 ~ 2 147 483 647 |
short | 1 字节 | -32 768 ~ 32 767 |
long | 8 字节 | -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 |
byte | 1 字节 | -128 ~ 127 |
在 Java 中,整型的范围与运行的机器无关,这就解决了代码移植的问题。
3.3.2 浮点类型
浮点类型用于表示有小数部分的数值。
类型 | 存储需求 | 取值范围 |
---|---|---|
float | 4 字节 | 大约 ± 3.402 823 47E+8F(有效位数6~7位) |
double | 8 字节 | 大约 ± 1.797 693 134 862 315 70E+308(有效位数15位) |
float 类型的数值有一个后缀 F 或 f,没有后缀 F 的浮点数值总是默认为 double 类型,也可以在浮点数值后面添加 D 或 d。
三个特殊的浮点数值:
- 正无穷大 Double.POSITIVE_INFINITY
- 负无穷大 Double.NEGATIVE_INFINITY
- NaN Double.NaN
检测一个特定值是否为 NaN:
if (Double.isNaN(x)) // check whether x is "not a number"
3.3.3 char 类型
char 类型用于表示单个字符。
char 类型的字面量值要用单引号括起来。例如:‘A’ 是编码值为65的字符常量。它与 “A” 不同,“A” 是包含一个字符 A 的字符串。char 类型的值可以表示为十六进制值,范围从 \u000 到 \uFFFF。
转义序列 | 名称 | Unicode 值 |
---|---|---|
\b | 退格 | \u0008 |
\n | 换行 | \u000a |
\r | 回车 | \u000d |
\" | 双引号 | \u0022 |
\’ | 单引号 | \u0027 |
\\ | 反斜杠 | \u005c |
3.3.4 Unicode 和 char 类型
在 Java 中,char 类型描述了 UTF-16 编码中的一个代码单元。
最好避免在程序中使用 char 类型,最好将字符串作为抽象数据类型处理。
3.3.5 boolean 类型
boolean(布尔)类型有两个值:false 和 true,用来判断逻辑条件。整型值和布尔值之间不能进行相互转换。
3.4 变量与常量
Java 用变量来存储值,常量就是值不变的变量。
3.4.1 声明变量
在 Java 中,每个变量都有一个类型(type)。
声明变量的示例如下:
double salary;
int vacationDays;
long earthPoplulation;
boolean done;
也可以在一行中声明多个变量:
int i, j;
但不提倡这种风格,逐一声明每个变量可以提高代码的可读性。
3.4.2 变量初始化
声明变量后,必须用赋值语句对变量进行显式初始化。
示例如下:
int vacationDays;
vacationDays = 12;
或:
int vacationDays = 12;
3.4.3 常量
在 Java 中,利用关键字 final 指示常量。
示例如下:
final double CM_PER_INCH = 2.54;
关键字 final 表示这个变量只能被赋值一次。习惯上,常量名使用全大写。
也可以使用类常量(class constant),使用关键字 static final 设置一个类常量。定义通常位于 main 方法的外部:
public class Constant2 {
public static final double CM_PER_INCH = 2.54;
public static void main(String[] args) {
......
}
}
3.4.4 枚举类型
如果变量的取值只在一个有限的集合内,那么可以自定义枚举类型。
例如:
enum Size {SMALL, MEDIUM. LARGE, EXTRA_LARGE};
Size s = Size.MEDIUM;
3.5 运算符
运算符用于连接值,Java 提供了丰富的算术和逻辑运算符以及数学函数。
3.5.1 算术运算符
运算符 | 名称 | 举例 |
---|---|---|
+ | 加 | |
- | 减 | |
* | 乘 | |
/ | 除 | 整数除法 15/2=7, 浮点数除法 15.0/2=7.5 |
% | 求余 | 15%2=1 |
需要注意,整数被0除将会产生一个异常,而浮点数被0除将会得到无穷大或 NaN 结果。
3.5.2 数学函数与常量
在 Math 类中,包含了各种各样的数学函数。
例如,计算一个数值的平方根,可以使用 sqrt 方法:
double x = 4;
double y = Math.sqrt(x); // y = 2.0
例如,幂运算:
double x = 4;
double y = Math.pow(x, 2); // y = 16.0
Math 也提供了一些常用的三角函数、反函数、甚至两个表示 π \pi π 和 ϵ \epsilon ϵ 常量的最接近的近似值。
3.5.3 数值类型之间的转换
蓝线表示无信息丢失的转换,加粗的紫线表示可能有精度损失的转换。
3.5.4 强制类型转换
Java 允许进行数值之间的类型转换,但有可能会丢失一些信息,通过强制类型转换(cast)来完成。
如 double 转 int:
double x = 9.997;
int nx = (int) x; // nx = 9
对浮点数进行舍入运算:
double x = 9.997;
int nx = (int) Math.round(x); // nx = 10
3.5.5 结合赋值和运算符
x += 4; // equal to "x = x + 4"
3.5.6 自增与自减运算符
int n = 13;
n++; // n= 14
建议不要在表达式中使用,会使代码产生困惑。
3.5.7 关系和boolean运算符
3 == 7; // false
3 != 7; // true
4 != 0 && 5 != 1 // "and"
4 != 0 || 5 != 1 // "or"
x < y ? x : y // return the smaller one
3.5.8 位运算符
处理整型类型时,可以直接对组成整数的各个位完成操作。
运算符 | 名称 |
---|---|
& | and |
| | or |
^ | xor |
~ | not |
>> | 左移 |
<< | 右移 |
3.5.9 括号与运算符级别
略。