`
凌紫冥
  • 浏览: 24524 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java编程思想第四版——第九天

    博客分类:
  • Java
 
阅读更多
2012-03-30
80-97/913

Java编程思想第四版——第九天

3.9 直接常量
一般来说,使用直接常量,编译器可以准确的知道要生成什么样的类型,但有时候却是模凌两可的,这种时候必须对编译器加以适当的指导,用与直接量相关的某些字符来额外增加一些信息。
直接常量后面的后缀字符标志了它的类型:大写(或小写)的L,代表long(使用小写字母l容易造成混淆,因为它看起来很像数字1),大写(或小写)字母F,代表float,大写(或小写)字母D,则代表double。
十六进制数适用于所有整数数据类型,以前缀0x(或0X),后面跟随0-9或小写(或大写)的a-f来表示。
将一个变量初始化超出自身表示范围的值(无论这个值得数值形式如何),编译器都会报告一条错误信息。超出范围,会进行窄化转型。
八进制数由前缀0以及后续的0~7的数字来表示。
在C、C++或者java中,二进制数没有直接常量表示方法,但是,在使用十六进制和八进制记数法时,以二进制形式显示结果将非常有用。通过使用Integer和Long类的静态方法toBinaryString()可以很容易地实现这一点。如果将比较小的类型传递给Integer. toBinaryString()方法,则该类型将自动被转换为int。

3.9.1 指数记数法
在科学与工程领域,“e”代表自然对数的基数,约等于2.718(java中的Math.E给出了更精确的double型的值)。
C、C++以及java都用e代表“10的幂次”。

3.10 按位操作符
按位操作符用来操作整数基本数据类型中的单个“比特”(bit),即二进制位。按位操作符会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果。
按位操作符来源于C语言面向底层的操作,在这种操作中经常需要直接操纵硬件,设置硬件寄存器内的二进制位。Java的设计初衷是嵌入式电视机机顶盒内,所以这种面向底层的操作仍被保留了下来。不会过多地用到位操作符。
按位操作符和逻辑操作符都使用了同样的符号:&(按位与)、|(按位或)、^(按位异或)、~(按位非)。由于位是非常小的,所以按位操作符仅使用了一个字符。按位操作符可与等号(=)联合使用,以便合并运算和赋值:&=、|=、^=(~是一元操作符,不可与=联合使用)。
布尔类型作为一种单比特值,有些独特。可以对它执行按位“与”、按位“或”和按位“异或”运算,但不能执行按位“非”(大概是为了避免与逻辑NOT混淆)。对于布尔值,按位操作符具有与逻辑操作符相同的效果,只是它们不会中途短路。针对布尔值进行的按位运算新增了一个“异或”逻辑操作符,没有包括在“逻辑”操作符列表中,移位表达式中,不能使用布尔运算。

3.11 移位操作符
移位操作符操作的运算对象也是二进制的“位”,只可用来处理整数类型。

按位和移位操作符都不是很理解,后面需要着重了解下。

3.12 三元操作符if-else
三元操作符也称为条件操作符,有三个操作数,属于操作符的一种,最终也会生成一个值,与普通if-else语句是不同的。
boolean-exp ? value0 : value1
如果boolean-exp结果位true,计算value0,计算结果为最终值,如果false,计算value1,结果为最终值。也可以用普通if-else,但这样更简洁。C发明了该操作符,此操作符的引入多半就是为了这种高效率的编程。如果打算频繁使用它,需要多作思量,它很容易产生可读性极差的代码。

3.13 字符串操作符+和+=
Java中的特殊用途:链接不同的字符串。
C++中引入操作符重载(operator overloading)机制,以便C++程序员可以为几乎所有操作符增加功能。但与C++的另外一些限制结合在一起,使得操作符重载成为了一种非常复杂的特性。Java中更易实现,但java程序员不能像C++和C#程序员那样实现自己的重载操作符。

表达式以一个字符串起头,后续所有操作数都必须是字符串型(编译器会把双引号内的字符序列自动转换成字符串)。

最先计算括号内
一个空的String后面跟随+和一个基本类型变量,转换成String。

3.14 使用操作符时常犯的错误
对表达式如何计算有点不确定,也不愿意使用括号。
Java中不会把int转换成布尔值
Java不允许随便把一种类型当作另一种类型来用。

3.15 类型转换操作符
类型转换(cast)的原意是“模型铸造”。在适当的时候,java会将一种数据类型自动转换成另一种。
窄化转换(narrowing conversion):将容纳更多信息的数据类型转换成无法容纳那么多信息的类型,有可能面临信息丢失的危险。编译器会强制进行类型转换。
扩展转换(widening conversion):不必显示地进行类型转换,新类型肯定能容纳原来类型的信息不会造成任何信息的丢失。
Java允许把任何基本数据类型转换成别的基本数据类型,布尔类型除外,后者根本不允许进行任何类型的转换处理。“类”数据类型不允许进行类型转换,将一种类型转换成另一种,必须采用特殊的方法(后面会讲到,对象可以在其所属类型的类族之间进行类型转换)。

3.15.1 截尾和舍入
执行窄化转换时,必须注意截尾与舍入问题。
float或double转型为整数值时,总是对该数字执行截尾。如果想要得到舍入的结果,就需要使用java.lang.Math中的round()方法。
round()是java.lang的一部分,使用时不需要额外地导入。

3.15.2 提升
表达式中出现的最大的数据类型决定了表达式最终结果的数据类型。

3.16 Java没有sizeof
C和C++中,sizeof()操作符可以知道数据项分配的字节数,使用的最大原因是为了“移植”。移植是令C和C++程序员颇为头痛的一个问题。
Java不需要sizeof(),因为所有数据类型在所有机器中的大小都是相同的,不必考虑移植的问题,已经被设计在语言中了。

3.17 操作符小结
能够对布尔型值进行的运算非常有限,只能赋予它true和false值,测试它为真还是假,不能将布尔值相加,或对布尔值进行其他任何运算。
如果对两个足够大的int值执行乘法运算,结果可能会溢出,但编译器不会报错或警告,运行时也不会出现异常,这说明java虽好,但也没有想象中那么好。
对于char、byte或者short,复合赋值并不需要类型转换。尽管它们执行类型提升,但也会获得与直接算术运算相同的结果,某些时候省略类型转换可使代码更加简练。
除了boolean以外,任何一种基本类型都可通过类型转换变为其他基本类型,当类型转换成一种较小的类型时,必须留意“窄化转换”的结果,否则会在类型转化过程中不知不觉地丢失了信息。

3.18 总结
Java中的操作符与C相似。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics