动手动脑1
//枚举类型 谷伟华 2015/10/3
package test2;
public class EnumTest {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Size s=Size.SMALL;
//从字串转换为枚举
Size t=Size.LARGE;
//从字串转换为枚举
//s和t引用不同对象
System.out.println(s==t); //比较s和t枚举变量的值,相同时输出true,不同时输出false
//不是原始数据类型
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
true
SMALL
MEDIUM
LARGE
结论:
枚举类型是引用类型,枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象。相同的值则引用同一个对象。
数值的二进制表示
原码:所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
Java中的数是采用上述原码表示的
/*谷伟华 2015/10/4
* 阅读相应教材,
* 或者使用互联网搜索引擎,
* 弄清楚反码、补码跟原 码这几个概念,
* 然后编写示例程序,
* 对正数、负数进行各种位操作,观察输出结果,
* 与手工计算的结果进行比对,
* 看看Java中的数是采用上述哪种码表示的。
*/
package test3;
public class Zfshu {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int num1=-9;
int num2=-10;
int sum;
int cheng;
sum=num1+num2;
cheng=num1*num2;
System.out.println(sum);
System.out.println(cheng);
}
}
输出结果:
-19
90
课后练习:
/*Java变量遵循“同名变量的屏蔽原则”,
* 请课后阅读相关资料弄清楚相关知识,
* 然后自己编写一些测试代码,就象本示例一样,
* 有意识地在不同地方定义一些同名变量,
* 看看输出的到底是哪个值。
*/
package test5;
public class Pb {
private static int value=5;
public static void main(String[] args) {
// TODO 自动生成的方法存根
int value =9;
System.out.println(value);
}
}
输出结果:
9
动手动脑:
看着这个图,再查查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会自动完成从低级类型向高级类型转换,即取值范围相对较小的数据类型转换成取值范围相对较大的数据类型。
动手实验:
输出结果:
0.05+0.01=0.060000000000000005
1.0-0.42=0.5800000000000001
4.015*100=401.49999999999994
123.3/100=1.2329999999999999
为什么double类型的数值进行运算得不到“数学上精确”的结果?
事实上浮点运算很少是精确的,只要是超过精度能表示的范围就会产生误差。往往产生误是 数的大小,而是因为数的精度。
因此,产生的结果接近但不等于想要的结果。尤其在使用 float 和 double 作精确运 算的时候要特别小心。可以考虑采用一些替代方案来实现。如通过使用 long 类型来转换。我们知道在计算机中浮点数的表示方法是由一个整数(即尾数)乘以一个基数(计算机中一般为2)的整次幂得到。(类似于科学计数法,科学记数法基数为10)float的内存结构为:符号位表示正负,1位 指数位,8位 尾数位,32位(符号位1表示负,0表示正)指数是以2为底的,范围是 -128 到 127,如果超过了127,则从-128开始计。 即:127+1=-128尾数都省去了第1位的1,所以在还原时要先在第一位加上1。它可能包含整数和纯小数两部分,也可能只包含其中一部分,视数字大小而定。对于带有整数部分的浮点数,其整数的表示法有两种,当整数大于十进制的16777215时使用的是科学计数法,如果小于或等于则直接采用一般的二进制表示法。科学计数法和小数的表示法是一样的。小数部分则是直接使用科学计数法,形式是X * ( 2 ^ n )。这样就导致浮点类型在计算机的存贮中无法精确表示。
动手动脑
以下代码的输出结果是什么?
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("X+Y="+X+Y)中的“+”为连接运算符,
System.out.println(X+Y+"=X+Y")中的“+”为加法运算符,即为两个数相加。