Java 开发从入门到精通(第2版)
上QQ阅读APP看书,第一时间看更新

3.7 技术解惑

3.7.1 定义常量时的注意事项

在Java语言中,主要利用final关键字(在Java类中灵活使用Static关键字)来进行Java常量的定义。当常量被设定后,一般情况下就不允许再进行更改。在定义常量时,需要注意如下3点。

(1)在定义Java常量的时候,就需要对常量进行初始化。也就是说,必须在声明常量时就对它进行初始化。跟局部变量或类成员变量不同,在定义一个常量的时候,进行初始化之后,在应用程序中就无法再次对这个常量进行赋值。如果强行赋值的话,编译器会弹出错误信息,并拒绝接受这一新值。

(2)需要注意final关键字的使用范围。final关键字不仅可以用来修饰基本数据类型的常量,还可以用来修饰对象的引用或方法,比如数组就是对象引用。为此,可以使用final关键字定义一个常量的数组。这是Java语言中的一大特色。一个数组对象一旦被final关键字设置为常量数组之后,它就只能恒定地指向一个数组对象,无法将其指向另一个对象,也无法更改数组中的值。

(3)需要注意常量的命名规则。在定义变量或常量时,不同的语言,都有自己的一套编码规则。这主要是为了提高代码的共享程度与易读性。在Java中定义常量时,也有自己的一套规则。比如在给常量取名时,一般都用大写字母。在Java语言中,区分大小写字母。之所以采用大写字母,主要是为了跟变量进行区分。虽然说给常量取名时采用小写字母,也不会有语法上的错误,但是为了在编写代码时能够一目了然地判断变量与常量,最好还是能够将常量设置为大写字母。另外,在常量中,往往通过下划线来分隔不同的字符,而不像对象名或类名那样,通过首字母大写的方式来进行分隔。这些规则虽然不是强制性的,但是为了提高代码的友好性,方便开发团队中的其他成员阅读,这些规则还是需要遵守的。

总之,Java开发人员需要注意,被定义为final的常量需要采用大写字母命名,并且中间最好使用下划线作为分隔符来连接多个单词。定义为final的数据不论是常量、对象引用还是数组,在主函数中都不可以改变,否则会被编辑器拒绝并提示错误信息。

3.7.2 char类型中单引号的意义

char类型使用单引号括起来,而字符串使用双引号括起来。关于String类的具体用法以及对应的各个方法,读者可以参考查阅API文档中的信息。其实Java语言中的单引号、双引号和反斜线都有特殊的用途,如果在一个字符串中包含这些特殊字符,应该使用转义字符。例如希望在Java程序中表示绝对路径"c:\daima",但这种写法得不到我们期望的结果,因为Java会把反斜线当成转义字符,所以应该写成"c:\\daima"的形式。只有同时写两个反斜线,Java才会把第一个反斜线当成转义字符,与后一个反斜线组成真正的反斜线。

3.7.3 正无穷和负无穷的问题

Java还提供了3个特殊的浮点数值—正无穷大、负无穷大和非数,用于表示溢出和出错。例如,使用一个正浮点数除以0将得到正无穷大,使用一个负浮点数除以0将得到负无穷大,用0.0除以0.0或对一个负数开方将得到一个非数。正无穷大通过Double或Float的POSITIVE_INFINITY表示,负无穷大通过Double或Float的NEGATIVE_INFINITY表示,非数通过Double或Float的NaN表示。

请注意,只有用浮点数除以0才可以得到正无穷大或负无穷大,因为Java语言会自动把和浮点数运算的0(整数)当成0.0(浮点数)来处理。如果用一个整数除以0,则会抛出“ArithmeticException:/by zero”(除以0异常)。

3.7.4 移位运算符的限制

Java移位运算符只能用于整型,不能用于浮点型。也就是说,>>、>>>和<<这3个移位运算符并不适合所有的数值类型,它们只适合对byte、short、char、int和long等整型数进行运算。除此之外,进行移位运算时还有如下规则:

(1)对于低于int类型(如byte、short和char)的操作数来说,总是先自动类型转换为int类型后再移位。

(2)对于int类型的整数移位,例如a>>b,当b>32时,系统先用b对32求余(因为int类型只有32位),得到的结果才是真正移位的位数。例如,a>>33和a>>l的结果完全一样,而a>>32的结果和a相同。

(3)对long类型的整数移位时,例如a>>b,当b>64时,总是先用b对64求余(因为long类型是64位),得到的结果才是真正移位的位数。

当进行位移运算时,只要被移位的二进制码没有发生有效位的数字丢失现象(对于正数而言,通常指被移出的位全部都是0),不难发现左移n位就相当于乘以2n,右移则相当于除以2n。这里存在一个问题:左移时,左边舍弃的位通常是无效的,但右移时,右边舍弃的位常常是有效的,因此通过左移和右移更容易看出这种运行结果,并且位移运算不会改变操作数本身,只是得到一个新的运算结果,原来的操作数本身是不会改变的。