为什么double类型的数值进行运算得不到“数学上精确”的结果
简单来说就是我们给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位),而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。
Java中的类型转换
结论是这图画错了
byte -> short -> int -> long 是 does not lose information (不会损失信息)的 Widening Primitive Conversion,用实线画是可以讲得通;char -> int -> long 也是 does not lose information 的 Widening Primitive Conversion,也可以用实线。但是 float -> double 只有在 strictfp 模式下才是 does not lose information ,一般人大概都不知道 strictfp ,更不用说使用 strictfp 了。
虚线和没画出的地方就更不对了。 byte -> short -> float 的转换也是 does not lose information,理应在 short 到 float 之间有一条实线;同样的道理 char -> float 也应该有一条实线;int -> double 也是 does not lose information,应该用实线而不是虚线。int -> float ,long -> double 会造成 loss of precision (精度损失),用虚线是没错;但是 long 也可以转换到 float ,在 long 和 float 之间也应该有一条虚线。
同名变量的屏蔽原则
Java中如果局部变量名与成员变量名相同,则成员变量会被屏蔽,如果想获得成员变量,需要使用this操作符
反码,补码,原码
所谓原码就是符号位加上数字的二进制表示,int为例,第一位表示符号 (0正数 1负数)简单期间一个字节表示;
一个数如果为正,则它的反码与原码相同;一个数如果为负,则符号位为1,(符号位不变化,其余位数取反)。换言之 该数的绝对值取反(绝对值取反各位都取反);
补码:一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,去到反码然后加1。(反码加1就是补码)为了简单起见,我们用1个字节来表示一个整数。
枚举类型
枚举类型并不是原始数据类型;枚举类型等效于定义static finally 常量;枚举类型可以有自己的属性(参数)和方法;枚举类型可以以独立的文件存在。