附录A Java关键字

下面是Java语言保留使用的50个关键字:

abstract double int super
assert else interface switch
boolean enum long synchronized
break extends native this
byte final new throw
case finally package throws
catch float private transient
char for protected try
class goto public void
const if return volatile
continue implements short while
default import static
do instanceof strictfp①

关键字goto和const是C++保留的关键字,目前并没有在Java中用到。如果它们出现在Java程序中,Java编译器能够识别它们,并产生错误信息。

字面常量true、false和null如同字面值100一样,不是关键字。但是它们也不能用作标识符,就像100不能用作标识符一样。

在代码清单中,我们对true、false和null使用了关键字的颜色,以和Java IDE中它们的颜色保持一致。

① strictfp 关键字是用于修饰方法或者类的,使其能使用严格的浮点计算。浮点计算可以使用以下两种模式:严格的和非严格的。严格模式可以保证计算结果在所有的虚拟机实现中都是一样的。非严格模式允许计算的中间结果以一种扩展的格式存储,该格式不同于标准的IEEE 浮点数格式。扩展格式是依赖于机器的,可以使代码执行更快。然而,当在不同的虚拟机上使用非严格模式执行代码时,可能不会总能精确地得到同样结果。默认情况下,非严格模式被用于浮点数的计算。若在方法和类中使用严格模式,需要在方法或者类的声明中增加strictfp关键字。严格的浮点数可能会比非严格浮点数具有略好的精确度,但这种区别仅影响部分应用。严格模式不会被继承,即在类或者接口的声明中使用strictfp不会使得继承的子类或接口也是严格模式。

附录B ASCII字符集

表B-1和表B-2分别列出了ASCII字符与它们相应的十进制和十六进制编码。字符的十进制或十六进制编码是字符行下标和列下标的组合。例如,在表B-1中,字母A在第6行第5列,所以它的十进制代码为65;在表B-2中,字母A在第4行第1列,所以它的十六进制代码为41。

0 1 2 3 4 5 6 7 8 9
0 nul soh stx etx eot enq ack bel bs ht
1 nl vt ff cr so si dle dcl dc2 dc3
2 dc4 nak syn etb can em sub esc fs gs
3 rs us sp ! # $ % &
4 ( ) * + , - . / 0 1
5 2 3 4 5 6 7 8 9 : ;
6 < = > ? @ A B C D E
7 F G H I J K L M N O
8 P Q R S T U V W X Y
9 Z [ \ ] ^ _ ` a b c
10 d e f g h i j k k m
11 n o p q r s t u v w
12 x y z { | } ~ del
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 nul soh stx etx eot enq ack bel bs ht nl vt ff cr so si
1 dle dcl dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us
2 sp ! # $ % & ( ) * + , - . /
3 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4 @ A B C D E F G H I J K L M N O
5 P Q R S T U V W X Y Z [ \ ] ^ _
6 ` a b c d e f g h i j k k m n o
7 p q r s t u v w x y z { | } ~ del

附录C 操作符优先级表

  • 操作符按照优先级递减的顺序从上到下列出。同一栏中的操作符优先级相同,它们的结合方法如表中所示 | 操作符 | 名称 | 结合方向 | | —- | —- | —- | | ( ) | 圆括号 | 从左向右 | | ( ) | 函数调用 | 从左向右 | | [ ] | 数组下标 | 从左向右 | | . | 对象成员访问 | 从左向右 | | ++ | 后置增量 | 从右向左 | | - - | 后置减量 | 从右向左 | | ------------------------ | ------------------------- | -------------------------- | | ++ | 前置增量 | 从右向左 | | - - | 前置减量 | 从右向左 | | + | 一元加 | 从右向左 | | - | 一元减 | 从右向左 | | ! | 一元逻辑非 | 从右向左 | | ------------------------ | ------------------------- | -------------------------- | | (type) | 一元类型转换 | 从右向左 | | new | 创建对象 | 从右向左 | | ------------------------ | ------------------------- | -------------------------- | | | 乘法 | 从左向右 | | / | 除法 | 从左向右 | | % | 求余 | 从左向右 | | ------------------------ | ------------------------- | -------------------------- | | + | 加法 | 从左向右 | | - | 减法 | 从左向右 | | ------------------------ | ------------------------- | -------------------------- | | << | 左移 | 从左向右 | | >> | 用符号位扩展的右移 | 从左向右 | | >>> | 用零扩展的右移 | 从左向右 | | ------------------------ | ------------------------- | -------------------------- | | < | 小于 | 从左向右 | | <= | 小于等于 | 从左向右 | | > | 大于 | 从左向右 | | >= | 大于等于 | 从左向右 | | ------------------------ | ------------------------- | -------------------------- | | instanceof | 检测对象类型 | 从左向右 | | ------------------------ | ------------------------- | -------------------------- | | == | 相等 | 从左向右 | | != | 不等 | 从左向右 | | ------------------------ | ------------------------- | -------------------------- | | & | 无条件与 | 从左向右 | | ------------------------ | ------------------------- | -------------------------- | | ^ | 异或 | 从左向右 | | ------------------------ | ------------------------- | -------------------------- | | | | 无条件或 | 从左向右 | | ------------------------ | ------------------------- | -------------------------- | | && | 条件与 | 从左向右 | | ------------------------ | ------------------------- | -------------------------- | | || | 条件或 | 从左向右 | | ------------------------ | ------------------------- | -------------------------- | | ? : | 三元条件 | 从右向左 | | ------------------------ | ------------------------- | -------------------------- | | = | 赋值 | 从右向左 | | += | 加法赋值 | 从右向左 | | -= | 减法赋值 | 从右向左 | | = | 乘法赋值 | 从右向左 | | /= | 除法赋值 | 从右向左 | | %= | 求余赋值 | 从右向左 |

附录D Java修饰符

  • 修饰符用于类和类的成员(构造方法、方法、数据和类一级的块),但final 修饰符也可以用在方法中的局部变量上。可以用在类上的修饰符称为类修饰符(class modeifier)。可以用在方法上的修饰符称为方法修饰符(method modifier)。可以用在数据域上的修饰符称为数据修饰符(data modifier)。可以用在类一级块上的修饰符称为块修饰符(block modifier)。下表对 Java 修饰符进行了总结。
    | 修饰符 | 类 | 构造方法 | 方法 | 数据 | 块 | 解释 | | —- | —- | —- | —- | —- | —- | —- | | (default)① | √ | √ | √ | √ | √ | 类、构造方法、方法或数据域在所在的包中可见 | | public | √ | √ | √ | √ | | 类、构造方法、方法或数据域在任何包任何程序中都可见 | | private | | √ | √ | √ | | 构造方法、方法或数据域只在所在的类中可见 | | protected | | √ | √ | √ | | 构造方法、方法或数据域在所属包中可见,或者在任何包中该类的子类中可见 | | static | | | √ | √ | √ | 定义类方法、类数据域或静态初始化模块 | | final | √ | | √ | √ | | final 类不能被继承。final 方法不能在子类中修改。终极数据域是常量 | | abstract | √ | | √ | | | 抽象类必须被继承。抽象方法必须在具体的子类中实现 | | native | | | √ | | | 用native 修饰的方法表明它是用 Java 之外的语言实现的 | | synchronized | | | √ | | √ | 同一时间只有一个线程可以执行这个方法 | | strictfp | √ | | √ | | | 使用精确浮点数计算模式,包装在所有的 Java 虚拟机中计算结果都相同 | | transient | | | | √ | | 标记实例数据域,使其不进行序列化 |

  • 默认(没有修饰符)、public、private以及protected 等修饰符称为可见或者可访问性修饰符,因为它们给定了类,以及类的成员是如何被访问的。

  • public、private、protected、static、final以及abstract也可以用于内部类。

①:默认访问没有任何修饰符与之关联。例如:class Test{ }。

附录E 特殊浮点值

  • 整数除以零是非法的,会抛出异常ArithmeticException,但是浮点值除以零不会引起异常。在浮点运算中,如果运算结果对double型或float型来说数值太大,则向上溢出为无穷大;如果运算结果对double 型或float 型来说数值太小,则向下溢出为零。Java用特殊的浮点值POSITIVE_INFINITY、NEGATIVE_INFINITY 和NaN(Not a Number,非数值)来表示这些结果。这些值被定义为Float 类和Double 类中的特殊常量/
  • 如果正浮点数除以零,结果为POSITIVE_INFINITY。如果负浮点数除以零,结果为NEGATIVE_INFINITY 。如果浮点数零除以零,结果为NaN,表示这个结果在数学上是无定义的。这三个值的字符串表示为Infinity、- Infinity 和NaN。例如,
    1. System.out.print(1.0 / 0); //Print Infinity
    2. System.out.print(-1.0 / 0);//Print -Infinity
    3. System.out.print(0.0 / 0); //Print NaN
  • 这些特殊值也可以在运算中用作操作数。例如,一个数除以POSITIVE_INFINITY 得到零。表E - 1 总结了运算符 /、 *、%、+ 和 - 的各种组合。
x y x/y x*y x%y x+y x-y
Finite ±0.0 ±infinity ±0.0 NaN Finite Finite
Finite ±infinity ±0.0 ±0.0 x ±infinity infinity
±0.0 ±0.0 NaN ±0.0 NaN ±0.0 ±0.0
± infinity Finite ±infinity ±0.0 NaN ±infinity ±infinity
± infinity ±infinity NaN ±0.0 NaN ±infinity infinity
±0.0 ±infinity ±0.0 NaN ±0.0 ±infinity ±0.0
NaN Any NaN NaN NaN NaN NaN
Any NaN NaN NaN NaN NaN NaN
  • 注意:如果一个操作数是NaN,则结果是NaN

附录F 数系

F.1 引言

  • 因为计算机本身只能存储和处理0和1,所以其内部使用的是二进制数。二进制数系只有两个数字:0和1。在计算机中,数字或字符是以由0 和 1 组成的序列来存储的。每个 0 或1都称为一个比特(二进制数字)。
  • 我们在日常生活中使用十进制数。当我们在程序中编写一个数字,如20,它被假定为一个十进制数。在计算机内部,通常会用软件将十进制数转换为二进制数,反之亦然。
  • 我们使用十进制数编写程序。然而,如果要与操作系统打交道,需要使用二进制数以达到底层的”机器级”。二进制数冗长烦琐,所以经常使用十六进制数简化二进制数,每个十六进制数可以表示四个二进制数。十六进制数系有十六个数:0 ~ 9 、A ~ F,其中字母A、B、C、D、E 和 F 对应十进制数10、11、12、13、14 和 15.
  • 十进制数系中的数字是0、1、2、3、4、5、6、7、8 和 9。一个十进制数是用一个或多个这些数字所构成的一个序列来表示的。这个序列中每个数所表示的值和它的位置有关,序列中数的位置决定了10 的幂次。例如,十进制数7423 中的数7、4、2 和 3 分别表示7000、400、20 和 3,如下所示:
    7 4 2 3 = 7×103+4×102+2×101+3×100
  • 十进制数系有十个数,它们的位置值都是10的整数次幂。10是十进制数系的基数。类似的,由于二进制数系有两个数,所以它的基数为2;而十六进制数系有16个数,所以它的基数为16.
  • 如果1101是一个二进制数,那么数1、1、0 和 1 分别表示:
    1 1 0 1 = 1×23+1×22+0×21+1×20 = 13
  • 如果7423是一个十六进制数,那么数字7、4、2 和 3 分别表示:
    7 4 2 3 = 7×163+4×162+2×161+3×160 = 29731

F.2 二进制数与十进制数之间的转换

  • 给定二进制数bnbn-1bn-2……b2b1b0 ,等价的十进制数为
    bn × 2 n + bn-1 × 2 n-1 + bn-2 × 2 n-2 + …… b2 × 2 2 +b1 × 2 1 +b0 × 2 0
  • 下面是二进制数转换为十进制数的一些例子: | 二进制 | 替换公式 | 十进制 | | —- | —- | —- | | 10 | 1 2^1 + 0 2^0 | 2 | | 1000 | 1 2^3 + 0 2^2 + 0 2^1 + 0 2^0 | 8 | | 10101011 | 1 2^7 + 0 2^6 + 1 2^5 + 0 2^4+1 2^3 + 0 2^2 + 1 2^1 + 1 2^0 | 171 |
  • 把一个十进制数d转换为二进制数,就是求满足
    d = bn × 2 n + bn-1 × 2 n-1 + bn-2 × 2 n-2 + …… b2 × 2 2 +b1 × 2 1 +b0 × 2 0

的位bn,bn-1,bn-2,……,b2,b1,b0。

  • 用2 不断地除d,直到商为0为止,余数即为所求的位b0,b1,b2,……,bn-2,bn-1,b0
  • 例如,十进制数123 用二进制数 1111 011 表示,进行如下转换:
  • 提示:Windows 操作系统所带的计算器是进行数制转换的一个有效工具,如图F - 1 所示。要运行它,从Start 按钮搜索Calculator 并运行 Calculator,然后在View 菜单下面选择Scientific。

F.3 十六进制数与十进制数的转换

基本同F.2 一致,先省略不写,有空在写 —-2021-8-5留

F.4 二进制数与十六进制数的转换

附录G 位操作符

  • 用机器语言编写程序,经常要直接处理二进制数值,并在位级别上执行操作。Java 提供了位操作符和移位操作符,如表G - 1所示。
操作符 名称 示例(例中使用字节) 描述
& 位与 1010 1110
& 1001 0010
得到1000 0010
两个相应位上的比特如果都为1,则执行与操作会得到1
| 位或 1010 1110
| 1001 0010
得到1011 1110
两个相应位上的比特如果其中有一个位1,则执行或操作会得到1
^ 位异或 1010 1110
^ 1001 0010
得到0011 1100
两个相应位上的比特如果相异,则执行异或操作会得到1
~ 求反 ~1010 1110
得到0101 0001
操作符将每个比特进行从0到1或者从1到0 的转换
<< 左移位 1010 1110
<< 2 得到1110 1011
操作符将其第一个操作数按照第二个操作数指定的比特数进行左移位,右边 补0
>> 带符号位右移位 1010 1110
>> 2 得到1110 1011
0010 1110
>>2 得到0000 1011
操作符将其第一个操作数按照第二个操作数指定的比特数进行右移位,左边补上最高(符号)位
>>> 无符号位右移位 1010 1110
>>> 2 得到00101011
00101110
>>>2 得到 0000 1011
操作符将其第一个操作数按照第二个操作数指定的比特数进行右移位,左边 补0`
  • 位操作符仅适用于整数类型(byte、short、int 和 long)。位操作涉及的字符将转换为整数。所有的位操作符都可以形成位赋值操作符,例如 =,|=,<<=,>>=,以及>>>=。

附录H 正则表达式

  • 经常会需要编写代码来验证用户输入,比如验证输入是否是一个数字,是否是一个全部小写的字符串,或者社会安全号。如何编写这种类型的代码呢?一个简单而有效的做法是使用正则表达式来完成这个任务。
  • 正则表达式(regular expression,简写位regex)是一个字符串,用来描述匹配一个字符串集合的模式。对于字符串处理来说,正则表达式是一个强大的工具。可以使用正则表达式来匹配、替换和拆分字符串。

H.1 匹配字符串

  • 让我们从String 类中的matches 方法开始。乍一看,matches 方法很类似euqals 方法。例如,以下两个语句结果都为true。
    1. "Java".matches("Java");
    2. "Java".equals("Java");
  • 然而,matches 方法功能更加强大。它不仅可以匹配一个固定的字符串,还可以匹配符合一个模式的字符串集。例如,以下语句结果都为true。
    1. "Java is fun".matches("Java.*");
    2. "Java is cool".matches("Java.*");
    3. "Java is powerful".matches("Java.*");
  • 前面语句中的”Java.“ 是一个正则表达式。它描述了一个字符串模式,以 Java 开始,后面跟 0 个或者多个字符串。这里,子字符串 . 匹配 0 或者多个任意字符。

H.2 正则表达式语法

  • 正则表达式由字面值字符和特殊符号组成。表H - 1 列出了正则表达式常用的语法。
  • 注意:反斜杠是一个特殊的字符,在字符串中开始转义序列。因此 Java 中需要使用 \ 表示\。
  • 注意:回顾一下,空白字符是’ ‘、’ \t’、’\n’、 ‘\r’ ,或者 ‘\f’。因此,\s 和 [\t\n\r\f] 等同, \S 和 [^ \t \n \r \f]等同。
正则表达式 匹配 示例
x 指定字符x Java 匹配 Java
. 任意单个字符,除了换行符外 Java 匹配 J..a
(ab|cd) ab或者cd ten 匹配t(en|im)
[abc] a、b或者c Java 匹配 Ja[uvwx]a
[^abc] 除了a、b 或者c 外的任意字符 Java 匹配 Ja[^ars]a
[a-z] a到z Java 匹配 [A-M] av [a-d]
[^a-z] 除了a到z外的任意字符 Java 匹配 Jav[^b-d]
[a-e[m-p]] a到e 或m-p Java 匹配 [A-G[I-M]]av[a-d]
[a-e&&[c-p]] a到e与c到p的交集 Java 匹配 [A-P && [I-M]]av[a-d]
\d 一位数字,等同于[0-9] Java2 匹配 “Java[\\d]”
\D 一位非数字 $Java 匹配 “[\\D] [\\ D]ava”
\w 单词字符 Java1 匹配”[\\w] ava[\\d]”
\W 非单词字符 $Java 匹配 “[\\W] [\ w]ava”
\s 空白字符 “Java 2”匹配”Java\\s2”
\S 非空白字符 Java匹配 “[\\S]ava”
p* 0 或者多次出现模式p aaaa 匹配”a“ abab匹配 “(ab)
p+ 1次或者多次出现模式p a 匹配 “a+b“ able匹配 “(ab)+.
p? 0或者1次出现模式p Java匹配”J ? Java” ava 匹配 “J?ava”
p{n} 正好出现n次模式p Java 匹配 “Ja{1}.*” Java不匹配”.{2}”
p{n, } 至少出现n次模式p aaaa匹配”a{1, }” a 不匹配 “a{2, }”
p{n,m} n 到 m (不包含)次出现模式p aaaa 匹配 “a{1, 9}” abb 不匹配 “a{2,9}bb”
\p{P} 一个标点符号!”#$%&’()*+,-./:;<=>?@[\]^_‘ {|}~ J?a 匹配 “J\p{P}a” J?a 不匹配 “J\p{P}a”
(这两个不是一样?)