首页 > 代码库 > java动手动脑
java动手动脑
一、
1、仔细阅读示例: EnumTest.java,运行它,分析运行结果?
此程序的功能是枚举类型对象的比较,判断s与t是否引用的一个对象,是输出true不是输出false,显然一个为small一个为large不是一个引用对象所以输出false。接而判断两个枚举类型是不是基本数据类型,不是所以输出false。又将字符串转换为枚举类型,将字符串u转换为枚举类型,并赋值于small,然后再与s比较,则s与u相等输出true,最后输出枚举类型的所有值SMALL、MEDIUM、LARGE。
2、你能得到什么结论?你掌握了枚举类型的基本用法了吗?
枚举类型是引用类型,枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象。相同的值则引用同一个对象。枚举类型使用时需要用到字符串类型到枚举类型的转换。
3、阅读相应教材,或者使用互联网搜索引擎,弄清楚反码、补码跟原码这几个概念,然后编写示例程序,对正数、负数进行各种位操作,观察输出结果,与手工计算的结果进行比对,看看Java中的数是采用上述哪种码表示的。
原码:原码表示的有符号数,最高位为符号位,数值 位部分就是该数的绝对值
反码:反码表示的有符号数,也是把最高位规定为符号 但数值部分对于正数是其绝对值, 而对于负数则是其绝对值按位取反( 数则是其绝对值按位取反(即1变0,0变1)
补码:补码表示的有符号数,对于正数来说同原码,反码一样,但负数的数值位部分为其绝对值按位取反后末位加1所得 。
在计算机内,定点数有3种表示法:原码、反码和补码。反码是数值存储的一种,但是由于补码更能有效表现数字在计算机中的形式,所以多数计算机一般都不采用反码表示数。
4、看着这个图,再查查Java中每个数据类型所占的位数,和表示数值的范围,你能得出什么结论?
无精度损失
char 8位二进制数范围是-2的7次方到2的7次方-1,byte 8位带符号整数-128到127之间的任意整数,short 16位无符号整数-32768到32767之间的任意整数,int 32位带符号整数-2的31次方到2的31次方-1之间的任意整数,long 64位带符号整数-2的63次方到2的63次方-1之间的任意整数,float 32位单精度浮点数,double 64位双精度浮点数。
结论是:Java会自动完成从低级类型向高级类型转换,即取值范围相对较小的数据类型转换成取值范围相对较大的数据类型。
5、请运行以下代码:
你看到了什么样的输出,意外吗?
0.05 + 0.01 = 0.060000000000000005
1.0 - 0.42 = 0.5800000000000001
4.015 * 100 = 401.49999999999994
123.3 / 100 = 1.2329999999999999
输出的结果跟平时double类型输出结果精度不一样。
6、为什么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,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。
7、以下代码的输出结果是什么?
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()中,如果在string字符串后面是+和变量,会把变量转换成string类型,加号起连接作用,然后把两个字符串连接成一个新的字符串输出;如果先有变量的加减运算再有字符串,那么会从左到右先计算变量的加减,然后再与后面的string结合成一个新的字符串。也就是说加号只有在两个string类型或者其中一个是string类型的时候才起到连接作用,否则仍然是运算符。
java动手动脑