一、仔细阅读示例: EnumTest.java,运行它,分析运行结果?(代码如下)
package test;
public class EnumTest {
public static void main(String[] args) {
Size s=Size.SMALL;
Size t=Size.LARGE;
//s和t引用同一个对象?
System.out.println(s==t); //
//是原始数据类型吗?
System.out.println(s.getClass().isPrimitive());
//从字符串中转换
Size u=Size.valueOf("SMALL");
System.out.println(s==u); //true
//列出它的所有值
for(Size value:Size.values()){
System.out.println(value);
}
}
}
enum Size{SMALL,MEDIUM,LARGE};
运行结果如下:
false
false
true
SMALL
MEDIUM
LARGE
分析:1、对象s,t都是将字符串转化为枚举但是因为字符串不同所以s和t不相等输出false。
2、getClass()函数作用是获取对象的类型类,isPrimitive()是getClass()中的方法作用是判断该类型是否是基本类型,枚举不是基本类型故输出false。
3、Valueof()函数是将字符串转换为其他类型,在此程序中将”SMALL”转换为枚举,故s与u相等输出true
4、Values()函数是将枚举中的常量遍历,通过for循环输出。
你能得到什么结论?你掌握了枚举类型的基本用法了吗?
结论:枚举不是基本类型,对于声明为 enum 的类型,编译器会自动生成 一个继承 java.lang.Enum 的类,并且生成 valueOf 和 values() 方法。
掌握了两种将字符串转换为枚举的方法
1.Size s=Size.SMALL;
2.Size u=Size.valueOf("SMALL");
还有遍历枚举常量并输出的方法。
二、动手实验(代码如下)
public class TestDouble {
public static void main(String args[]) {
System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));
System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));
System.out.println("4.015 * 100 = " + (4.015 * 100));
System.out.println("123.3 / 100 = " + (123.3 / 100));
}
}
运行结果:
0.05 + 0.01 = 0.060000000000000005
1.0 - 0.42 = 0.5800000000000001
4.015 * 100 = 401.49999999999994
123.3 / 100 = 1.2329999999999999
结论:使用double类型的数值进行计算,其结果是不精确的。
原因:这个涉及到二进制与十进制的转换问题。
N进制可以理解为:数值×基数的幂,例如我们熟悉的十进制数123.4=1×10²+2×10+3×(10的0次幂)+4×(10的-1次幂);其它进制的也是同理,例如二进制数11.01=1×2+1×(2的0次幂)+0+1×(2的-2次幂)=十进制的3.25。
double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2的n次方)。
举个例子来说,比如要用4bit来表示小数3.26,从高到低位依次对应2的1,0,-1,-2次幂,根据最上面的分析,应当在二进制数11.01(对应十进制的3.25)和11.10(对应十进制的3.5)之间选择。
简单来说就是我们给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位),而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。
解决方法:使用BigDecimal类
三、以下代码的输出结果是什么?
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
出现此结果的原因:System.out.println()函数中的非字符串+有两个作用,分别是字符连接和数据运算。而要是数据运算必须加括号(在开头可省略括号),其他情况就是字符串连接。
题目中第一个是起连接作用而第二个是运算。