Java学习动手问题整理
最近跟着老师学Java基础,遇到了不少需要动手验证的小问题,整理了几个印象深的,记录下我的思考和结果,方便以后复习。
一、枚举类型怎么用?
老师让看EnumTest.java,我自己写了个简单例子试了试:
// 定义枚举类型
enum Size {SMALL, MEDIUM, LARGE}
public class EnumTest {public static void main(String[] args) {Size s1 = Size.SMALL;Size s2 = Size.valueOf("SMALL");// 比较两个枚举值System.out.println(s1 == s2); // 输出true// 遍历所有枚举值for (Size size : Size.values()) {System.out.println(size);}}
}
运行后发现,相同的枚举值其实是同一个对象,用“==”就能比较。而且还能通过values()
方法遍历所有枚举选项,这点还挺方便的。
二、double计算为啥不精确?
老师给的TestDouble.java代码,运行结果跟我想的不一样:
public class TestDouble {public static void main(String[] args) {System.out.println(0.05 + 0.01); // 结果是0.060000000000000005System.out.println(1.0 - 0.42); // 结果是0.5800000000000001}
}
查了资料才明白,double用二进制存储,有些十进制小数没法精确表示,只能存近似值。后来用BigDecimal解决了,要注意用字符串当参数:
import java.math.BigDecimal;
public class TestBigDecimal {public static void main(String[] args) {BigDecimal a = new BigDecimal("0.05");BigDecimal b = new BigDecimal("0.01");System.out.println(a.add(b)); // 正确输出0.06}
}
三、字符串拼接的小陷阱
下面两段代码,一开始以为结果差不多,实际差很多:
public class StringAddTest {public static void main(String[] args) {int x = 100, y = 200;System.out.println("x+y=" + x + y); // 输出x+y=100200System.out.println(x + y + "=x+y"); // 输出300=x+y}
}
琢磨了半天,原来“+”遇到字符串就会变成连接操作,而且是从左往右算。第一段先把“x+y=”和x连起来,再连y;第二段先算x+y的和,再跟字符串连接,难怪结果不一样。
四、同名变量谁生效?
看到一段代码,里面有两个叫value的变量:
public class VariableTest {private static int value = 1;public static void main(String[] args) {int value = 2;System.out.println(value); // 输出2}
}
运行后输出2,不是1。原来局部变量会“盖住”外面的变量,要是想访问外面的,得用特殊方式,比如静态变量用类名,成员变量用this(不过这个例子里是静态的,暂时还没完全搞懂this的用法,后续再学)。