从"意外输出"开始——Java第一课动手实践小结
苏中昊 信2505-1班 20253871
这一周 Java 课最深的感受是:书上的结论看似简单,亲手跑一遍代码,才会撞见真正的"意外"。
第一个意外来自枚举。运行 EnumTest.java 后我才明白,枚举不是简单的基本类型,而是引用类型:相同的枚举值引用同一个对象,所以用"=="和 equals() 比较结果完全一致。
第二个意外藏在位运算里。查阅资料弄清原码、反码、补码之后,我编写程序对正负数做各种位操作,把输出与手工推算逐条比对,最终确认:Java 中的整数是用补码存储的。
第三个意外是变量的"遮蔽"。在不同作用域里定义同名变量,程序输出的永远是当前作用域里最内层的那一个——同名变量的屏蔽原则由此得证。
第四个意外最经典。TestDouble.java 的输出与数学直觉相悖:double 运算并不精确。根源在于十进制小数转成二进制时常是无限循环,只能近似表示。解决方案是用 BigDecimal,且构造时必须传入字符串,否则精度问题依旧。
类似的还有类型转换:小类型转大类型安全无损失,大转小就可能出事,double 强转 float 后变成 1.23456794E9 便是明证。
最后一个"陷阱"来自一行简单代码:"X+Y="+X+Y 打印出 X+Y=100200,而 X+Y+"=X+Y" 打印出 300=X+Y。加减运算自左向右,遇到字符串就变成拼接,先后顺序决定了结果。
回看这些练习,答案其实都在"动手"与"动脑"的结合点上。看懂了不算会,跑通并能解释为什么,才算真正掌握。
浙公网安备 33010602011771号