第3章 Java的基本程序设计结构
3.1 一个简单的Java应用程序
- 源代码的文件名必须与公共类的名字相同,并用.java作为拓展名。
- 点号(.)用于调用方法。
3.2 注释
文档注释法:
/**
* 注释内容
*
*
*
*/
3.3数据类型
java有8种基本类型,四个整型(int 、short、long、byte)、两种浮点类型(float、double)、1种字符类型char(用于表示Unicode编码的代码单元)和一种表示真值的boolean类型。
3.3.1整型
-
长整数整型后缀 L 或 l ,十六进制数值前缀 0x 或 0X ,八进制数值前缀0,很显然八进制很容易混淆所以最好不要使用八进制常数。
二进制前缀0b或0B。并且可以为数字字面量加下划线,如1_000_000,java编译器会自动去除这些下划线。
-
java没有任何无符号(unsigned)形式的int、long、short或byte类型。
-
若要进行无符号运算,可调用Byte.toUnsignedInt(b)来得到一个0到255的int值,实现无符号的效果,最终再转化为byte即可。
并且在Integer和Long类种都提供了处理无符号除法和求余数的方法。
3.3.2 浮点类型
-
float后缀 F 或 f ,没有后缀F的浮点数值默认为double类型,但double也可加后缀 D 或 d 。
-
表示溢出和出错情况的三个特殊的浮点数值:
- 正无穷大
- 负无穷大
- NaN
例如,一个正整数除以0的结果为正无穷大。计算0/0或负数的平方根结果为NaN。
常量**Double.POSITIVE_INFINTY、Double.NEGATIVE_INFINTY和Double.NaN(**以及相应的Float类型的常量)分别表示这三个特殊的值,但在实际应用中很少遇到。
不能通过‘==’来检测一个特定值是否等于特殊值。
只能通过Double.isNaN方法来判断,如
if(x == Double.NaN) //错误的 if(Double.isNaN( x )) //正确的
-
浮点数值不适用于无法接受舍入误差的金融计算。
例子:代码System.out.println(2.0-1.1);
将会打印出0.899999999999999,而不是人们期望的0.9。
主要原因是浮点数值采用二进制系统表示,而在二进制系统无法精确地表示分数1/10。
就好像十进制无法精确地表示分数1/3一样。
解决:如果在数值计算中不允许有任何舍入误差,就应该使用BigDecimal类。
3.3.3 char类型
-
char类型原本用于表示单个字符。
但如今有些Unicode字符可以用一个char值描述,另外一些Unicode字符则需要两个char值。
-
char类型的字面量值用单引号扩起来,字符串String用双引号。
-
char类型的值表示为十六进制值,范围从 \u0000 到 \uFFFF。
转义序列\u还可以出现在加引号的字符常量或字符串之外(其他转义序列不行)。
-
特殊字符的转义序列:
转义序列 名称 Unicode值 \b 退格 \u0008 \t 制表 \u0009 \n 换行 \u000a \r 回车 \u000d \" 双引号 \u0022 \’ 单引号 \u0027 \\ 反斜杠 \u005c 警告:
-
Unicode转义序列会在解析代码之前得到处理。
例如"\u0022+\u0022"并不是有引号(U+0022)包围加号构成的字符串,实际上\u0022会在解析之前转换为",这会得到 “” + “”,也就是一个空串。
-
更隐秘的是注释中的\u.
// \u000A is a newline
会产生一个语法错误,因为读程序时\u000A会替换为一个换行符。
类似地,下面这个注释
// look inside c:\users
也会产生一个语法错误,因为\u后面并没有跟着4个十六进制数。
-
3.3.4 Unicode 和 char 类型
-
各个国家拥有不同的字符编码机制,产生了两个问题:
一是对于任意给定的代码值,在不同的编码方案有可能对应不同的字母。
二是采用大字的语言其编码长度有可能不同。
-
而设计Unicode编码的目的就是要解决这些问题。
现在16位的char类型以及不能满足所有Unicode字符的需要了。
下面利用一些专用术语来解释Java语言从Java5开始如何解释这个问题。
-
码点(codepoint)是指一个编码表中的某个字符对应的代码值。
-
在Unicode标准中,码点采用十六进制书写,并加上前缀U+,例如U+0041就是拉丁字母的码点。
-
Unicode的码点可以分为17个代码平面(code plane)。
第一个代码平面成为基本多语言平面(basic multilingual pane),包括码点从U+0000到U+FFFF的“经典”Unicode代码;
其余的16个平面的码点从U+10000到U+10FFFF,包括辅助字符(supplementary character)。
-
UTF-16编码采用不同长度的编码表示所有Unicode码点。
在基本多语言平面中,每个字符用16位表示,成为代码单元(code unit);
而辅助字符编码为一对连续的代码单元。
采用这种编码对表示的各个值落入基本多语言平面中未用的2048个值范围内,通常成为替代区域(surrogate area)
(U+D800~U+DBFF 用于第一个代码单元,U+DC00~U+DFFF用于第二个代码单元)。
这样的设计,使得我们可以从中迅速知道一个代码单元是一个字符的编码,还是一个辅助字符的第一或第二部分。
-
在Java中,char类型描述了UTF-16编码中的一个代码单元。
-
我们强烈建议不要在程序中使用char类型,除非确实需要UTF-16代码单元。
最好将字符串作为抽象数据类型处理。