《Java编程思想》第四版读书笔记 第三章

3.1dom

本节做者为了简化System.out.println操做,引入了本身写的一个Print类,里面的静态方法print()内部就是调用了System.out.println()。函数

在使用Print类时运用了静态import。这个1.5添加的新特性,它import具体的类,这样在代码中可使用该类的静态方法,也能够import类的静态方法,导入单一的静态方法。例如要使用com.test.Print类的静态方法能够:spa

import static com.test.Print.*;.net

注意必定要带*,表明静态导入Print类下的全部静态方法,这样在代码中能够直接使用方法名调用方法而不用加类名,要导入一个静态方法就把*替换成方法名便可。对象

 

3.5字符串

整数之间除法的结果会直接去掉小数位而不是四舍五入的结果。get

 

本小节的示例程序中使用了Random类的对象,若是构造函数无参数,则会使用当前时间做为随机数生成器的种子。若是在构造函数的参数中指定固定的种子,那么产生的随机数序列老是相同的。编译器


一元加号的存在是为了与一元减号相对应,它惟一的做用是将较小类型的操做数提高为int。it

 

3.6编译

自增运算符和自减运算符分为前缀式和后缀式两种,前缀式是++或--在变量或表达式前。前缀式是先执行运算再生成值,然后缀式则先生成值再执行运算。

 

3.8

与、或、非操做只可应用于布尔值,与C++不一样,C++认为非零为true,而Java只能使用布尔类型。

 

短路:一旦可以明确无误的肯定整个表达式的值,就再也不计算表达式的余下部分了。

 

3.9

C、C++或者Java中,二进制数没有直接常量表示方法。Java中,使用Integer和Long类的静态方法toBinaryString()能够输出二进制表示的字符串。

若是给变量赋值,字面常量超出了变量的范围,编译器会报错。

 

用小数字面常量给float赋值,编译器一般会将其做为双精度处理,因此若是没有尾随f,会报错。

 

Java的指数字面常量中e或者E表明10的幂次。

 

3.10

按位与、按位或、按位异或也能够用于布尔类型,可是判断表达式时不能短路,按位非不能够用于布尔类型。

 

练习10中要求构造两个int,有交替的二进制位1和0,一个以1结尾一个以0结尾。提示中写到用十六进制是最简单的表示方法,由于十六进制一个数正好表明四个位。

 

3.11

<< 左移操做符,左移位后补零;

>>有符号右移操做符,右移后若符号为正,则在高位插入0,若为负则插入1。

还有一种无符号右移操做符>>>不管正负都插入0

 

char、byte或short移位前会被转换成int,且获得的结果也是int。long移位后获得的结果是long。

 

第二段有这么一段话“对char,byte或者short进行移位处理,那么在移位进行以前,它们会自动转换成一个int。只有右侧的5个低位才会有用。这样可防止咱们在一个int数里移动不切实际的位数。若对一个long值进行处理,最后获得的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。” 不理解,感谢@阿信sxq的解答,把答案也放在这里供你们参考:

对上面那段话的理解是:移位操做符操做的运算对象是二进制的“位”,int类型是32位也就是2的5次幂 !若是移32位以上,那么原来的数的信息会所有丢失,这样也就没有什么意义了!因此上面的“只有右侧的5个低位才会有用”说的是:移位操做符右端的那个数(化成二进制)的低5位才有用,即
X < <y;
是指y的低5位才有用,即不能大于32。 而对于long型也是一样的道理!
所以,若是对一个int 型,进行移位,X < <y; 当y小于32时,移位后的结果通常都在咱们的预料当中;而若是y大于32时,因为移位超出了int所能表示的范围,这时就先把y化成二进制数,而后取该二进制数右端的低5位,再把这5位化成十进制,此时的这个十进制就是要对X移动的位数。
例如: int int a=140;
a << 34
System.out.println(Integer.toBinaryString(a << b));
上面那两个语句的执行过程是:先把a化成二进制数:10001100

执行语句 a << 34 对a左移32位时,先把 34化成二进制:100010,对该二进制数取右边5位,即00010,化成十进制数为2,因此其实是对a左移两位。如今,地球人都会知道上面程序的输出结果是:1000110000

 

 

 

在使用>>>=应注意,若是对byte或short值进行移位,它们会先被转换成int,再进行右移操做,而后被阶段赋值给原来的类型,这可能会获得-1的结果。

 

练习13中要对char类型以二进制形式展现,调用Integer.toBinaryString()方法将char类型做为参数传入便可。而若是在System.out.println方法直接传入char打印出的是字符,将char转换为int打印出数值。

 

3.15

Java容许把任何基本数据类型转换成其余基本数据类型,除布尔型外。类数据类型不容许转换,除非类族之间的转换。

 

类型提高,对基本类型执行算术操做和按位操做,只要类型比int小,那么运算以前这些值会自动转换成int。

因此要将结果赋值给原类型须要显示类型转换,而+=这样的复合操做符不须要这样的转换,它能够自动转换。

相关文章
相关标签/搜索