动手动脑问题分析

一、仔细阅读示例: EnumTest.java,运行它,分析运行结果?代码如下

package test;

public class EnumTest {

public static void main(String[] args) {

Size s=Size.SMALL;

Size t=Size.LARGE;

//st引用同一个对象?

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都是将字符串转化为枚举但是因为字符串不同所以st不相等输出false

2、getClass()函数作用是获取对象的类型类,isPrimitive()getClass()中的方法作用是判断该类型是否是基本类型,枚举不是基本类型故输出false

3、Valueof()函数是将字符串转换为其他类型,在此程序中将”SMALL”转换为枚举,故su相等输出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×(100次幂)+4×(10-1次幂);其它进制的也是同理,例如二进制数11.01=1×2+1×(20次幂)+0+1×(2-2次幂)=十进制的3.25
double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2n次方)。

举个例子来说,比如要用4bit来表示小数3.26,从高到低位依次对应21,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()函数中的非字符串+有两个作用,分别是字符连接和数据运算。而要是数据运算必须加括号(在开头可省略括号),其他情况就是字符串连接。

题目中第一个是起连接作用而第二个是运算。

原文地址:https://www.cnblogs.com/chenaiiu/p/11543517.html