00-JAVA语法基础 动手动脑
1、看着类型转换图,结合每个数据类型所占位数和数值范围,可以得出什么结论?
答:
byte占8位,范围-128127;short占16位,范围-3276832767;int占32位;long占64位;float占32位;double占64位;char占16位无符号。
1)自动类型转换方向:byte→short→int→long→float→double,char可以转int。小范围类型向大范围类型转换为自动转换。
2)即使long位数比float多,long转float也有可能损失精度,位数多不代表一定无精度损失。
3)大范围类型转小范围类型必须强制转换,会出现数据截断,丢失数据或者精度。
4)char是无符号类型,可以自动转int,byte、short不能直接转为char,需要强制类型转换。
2、运行TestDouble.java,double运算结果并不精确,原因是什么?
答:
float和double采用IEEE‑754二进制格式存储浮点数。部分十进制小数无法用二进制有限位数精确表示,只能保存近似值;多次运算后误差不断累积,导致运算结果和数学结果不一致。
处理高精度计算应当使用BigDecimal,构建BigDecimal对象时传入字符串,不能直接传入double数值,否则double自带的近似误差会被带入。
3、分析代码输出结果
int X=100;
int Y=200;
System.out.println("X+Y="+X+Y);
System.out.println(X+Y+"=X+Y");
输出:
X+Y=100200
300=X+Y
原因:
+运算符,如果一侧是字符串,执行字符串拼接;运算符结合顺序从左向右。
第一行,先把字符串"X+Y="和X拼接得到字符串"X+Y=100",之后再和Y做字符串拼接,不会做加法运算。
第二行,最左边两个变量都是int,优先执行算术加法得到300,再与后面字符串拼接。想要第一行做加法运算需要写("X+Y="+(X+Y))。
4、枚举EnumTest.java实验结论
答:
枚举属于引用数据类型,不是原始基本数据类型。每一个枚举常量都是对象,同一个枚举常量引用同一个对象。枚举变量使用和equals()比较结果等价,推荐使用。枚举可以使用foreach配合values()遍历,也可以用于switch语句。
5、同名变量屏蔽原则实验
答:
局部变量和类成员变量重名时,方法内优先使用局部变量,局部变量屏蔽成员变量。
同一个代码块不能定义两个同名局部变量;内层代码块可以定义和外层代码块同名的局部变量。变量离开自己的作用域之后直接失效,无法访问。
6、位运算中原码、反码、补码
答:
Java中所有整型数据内存均以补码存储。
正数:原码、反码、补码三者完全相同。
负数:反码是原码符号位不变,其余各位按位取反;补码等于反码加1。
7、BigDecimal构建对象为什么尽量不用double做参数?
答:
double本身存储的就是近似二进制值,传入double构造BigDecimal会把原本的误差保留下来;传入字符串字面量可以得到精确的十进制数值。

浙公网安备 33010602011771号