动手动脑1
public class EnumTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
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
第一个输出是错的,s和t不是引用同一个对象
第二个输出是错的,Size类型不是原始数据类型,原始数据类型有byte(字节)、short(短整型)、int(整数型)、long(长整型)、float(单精度浮点数类型)、double(双精度浮点数类型)、char(字符类型)、boolean(布尔类型)。
第三个输出是对的,从字符串中转换后是一个方法,输出后就对了
第四个输出就是运用了value这个方法进行输出。
结论:枚举类型是引用类型,枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象。相同的值则引用同一个对象。原始数据类型有byte(字节)、short(短整型)、int(整数型)、long(长整型)、float(单精度浮点数类型)、double(双精度浮点数类型)、char(字符类型)、boolean(布尔类型)。
动手动脑2
原码, 反码, 补码是计算机存储一个具体数字的编码方式。
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。
反码的表示方法是:正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。
补码的表示方法是:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。 (即在反码的基础上+1)
Java中运用补码
动手动脑3
输出结果是2,明显第一个value的作用范围是全局,第二个value的作用范围是main方法,而输出的value是在main中输出,所以,在定义变量的时候,一定要注意变量所在的区域。
动手动脑4
byte 数据类型是8位、有符号的,以二进制补码表示的整数;
最小值是 -128(-2^7);
最大值是 127(2^7-1);
short 数据类型是 16 位、有符号的以二进制补码表示的整数
最小值是 -32768(-2^15);
最大值是 32767(2^15 - 1);
int 数据类型是32位、有符号的以二进制补码表示的整数;
最小值是 -2,147,483,648(-2^31);
最大值是 2,147,483,647(2^31 - 1);
long 数据类型是 64 位、有符号的以二进制补码表示的整数;
最小值是 -9,223,372,036,854,775,808(-2^63);
最大值是 9,223,372,036,854,775,807(2^63 -1);
float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
float 在储存大型浮点数组的时候可节省内存空间;
默认值是 0.0f;
浮点数不能用来表示精确的值,如货币;
例子:float f1 = 234.5f。
double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数;
浮点数的默认类型为double类型;
double类型同样不能表示精确的值,如货币;
默认值是 0.0d;
例子:double d1 = 123.4。
char类型是一个单一的 16 位 Unicode 字符;
最小值是 u0000(即为0);
最大值是 uffff(即为65,535);
char 数据类型可以储存任何字符;
例子:char letter = ‘A’;。
结论:由整型向浮点型转换会有精度损失,因为浮点型不能表示精确的值
动手动脑5
结论:使用double类型的数值计算结果是不准确的,double是浮点型,
我们给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位),而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。
动手动脑6
结果证明+X+Y意为分别输出X和Y,如果写成+(X+Y),就不会出现第一种情况