第三章 操作符
标签(空格分隔): AgainThinkingInJava
挑出几个似乎已经忘记了的点
- 别名问题
- Random类对象的种子
- 短路
- 直接常量
- 移位操作符的道道
- Java中为什么没有sizeof()
别名问题
这个问题就是说的
String s=new String ();
String s1;
s1=s;
此时s1
与s
是指向的同一个对象,假如执行语句s1=new ("dhgh")
,则在执行语句System.out.println(s)
会输出dhgh
。
事实上我记得有的资料在解释引用的时候就是讲的引用是一个变量的别名。
于是牵扯出了一个更大的问题就是,调用方法的时候,虽然很多人知道是复制的引用,但是不知道原理,这里的原理就是别名现象。是不是有一种顿悟的感觉。
Random类的种子
很多人知道要给种子或者可以不给种子,但是很多人在使用的并不知道在什么场合选择什么样的方式。
- Random rand =new Random(47);
给一个数字的目的是产生相同序列的随机数,假如有的场合你需要多次产生相同的随机数序列就可以使用这种方式,可能有的人不是很理解,什么叫相同的随机数序列,多动脑。
- Random rand =new Random();
这种方式就是默认用时间作为随机数生成器的种子,每次生成的随机数序列都不一样
短路
书中对于短路的证明很到位,短路就是说的,要是吃两个包子就已经饱了,就不用再多吃了。
直接常量
都知道在定义常量的时候怎么定义,都知道双精度常量数要这样
double d=1.2d;
但是不知道应该怎么来描述,好吧,这样直接定义的变量叫直接常量,与什么局部变量,全局变量还是很有区别的,只是范围的问题。至于末尾加的d字母,是为了对编译器进行指导
注意到二进制数是没有直接变量表示的,和C++一样,可以使用某种方法将值进行转化成二进制数。Java中就是Integer.toBinaryString()
,当然显然是对int类型及以下的基本数据类型使用。单双精度都不可以。我就奇怪难道二进制小数就没办法转了?,还有一点值得注意的这个方法对前导零无感,输出的时候不会出现前导零。
移位操作符的道道
一个数字进行左移。没问题,直接低位及以上整体左移,低位补0.
一个数字进行右移,如果是无符号,右移的操作符变为>>>
,无论正负都是在高位插入0.这叫零扩展
如果是有符号的,右移操作符不变,但是假如符号位为正,就在高位连续的补0,假如为负,就在高位补1。,这叫符号扩展
当然要是有人问为什么说无符号但是还有正负呢。因为计算机中的数字二进制是用补码表示的。
Java中为什么没有sizeof()
这个sizeof()
本来是C系列用来测量为数据项分配的字节数。C和C++要用这个方法在“移植”的时候出力。因为在不同的机器上就算是相同的数据类型都可能被分配不一样的大小。比如在一个32位机器和64位机器上跑同一个程序就要考虑考虑这个问题。但是Java不需要,所有的数据类型在所有的机器中的大小是相同。不必考虑移植问题,因为它已经被设计在语言中了。