一,
代码:
public class EnumTest {
private enum MyEnum{
ONE, TWO, THREE
}
public static void main(String[] args) {
for(MyEnum value:MyEnum.values()){
System.out.println(value);
}
}
private enum MyEnum{
ONE, TWO, THREE
}
public static void main(String[] args) {
for(MyEnum value:MyEnum.values()){
System.out.println(value);
}
}
}
运行结果:
ONE
TWO
THREE
TWO
THREE
总结如下:
1.java中的enum关键字背后实际是Enum这个类实现的。
2.values()方法遍历枚举类中的每个元素。
3.在我们编写自定义的enum时,其中是不含values方法的,在编译java文件时,java编译器会自动帮助我们生成这个方法。
3.在我们编写自定义的enum时,其中是不含values方法的,在编译java文件时,java编译器会自动帮助我们生成这个方法。
二,
原码:所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
示例:
+100表示为2进制数为+1100100
原码=01100100 反码=01100100 补码=01100100 正数的话3码都一样
-100表示为2进制树为-1100100
原码=11100100 反码=10011011(第一位表示符号的数字不变)
补码=反码+1=10011100
原码=01100100 反码=01100100 补码=01100100 正数的话3码都一样
-100表示为2进制树为-1100100
原码=11100100 反码=10011011(第一位表示符号的数字不变)
补码=反码+1=10011100
示例:
package 练习一;
public class Shu {
public static void main(String[] args) {
System.out.println(2&3);
System.out.println(2&3);
}
}
运行结果:
2
采用补码的形式
三,
package 练习一;
public class Shu {
private static int value=1;
private static int value=1;
public static void main(String[] args) {
int value=2;
System.out.println(value);
int value=2;
System.out.println(value);
}
}
运行结果:
2
分析:Shu类中的value变量为私有变量,外部函数没有访问权限。
四,
从int或long转换为float或double会有精度的损失
分为三个部分:
(1) 一个单独的符号位s 直接编码符号s 。
(2)k 位的幂指数E ,移码表示 。
(3)n 位的小数,原码表示 。
当下面情况出现是则无法精确表示:
1.幂数不够表示了:这种情况往往出现在数字太大了,超过幂数所能承受的范围,那么这个数字就无法表示了。如幂数最大只能是10,但是这个数字用科学计数法表示时,幂数一定会超过10,就没办法了。
2.尾数不够表示了:这种情况往往出现在数字精度太长了,如1.3434343233332这样的数字,虽然很小,还不超过2,这种情况下幂数完全满足要求,但是尾数已经不能表示出来了这么长的精度。
(1) 一个单独的符号位s 直接编码符号s 。
(2)k 位的幂指数E ,移码表示 。
(3)n 位的小数,原码表示 。
当下面情况出现是则无法精确表示:
1.幂数不够表示了:这种情况往往出现在数字太大了,超过幂数所能承受的范围,那么这个数字就无法表示了。如幂数最大只能是10,但是这个数字用科学计数法表示时,幂数一定会超过10,就没办法了。
2.尾数不够表示了:这种情况往往出现在数字精度太长了,如1.3434343233332这样的数字,虽然很小,还不超过2,这种情况下幂数完全满足要求,但是尾数已经不能表示出来了这么长的精度。
五,
package 练习一;
public class Shu {
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));
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
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,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。
六,
package 练习一;
public class Shu {
public static void main(String[] args) {
int X=100;
int Y=200;
System.out.println("X+Y="+X+Y);
System.out.println(X+Y+"=X+Y");
public static void main(String[] args) {
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
300=X+Y
分析:第一个依次输出了X和Y的值,若第一个想要求和应该改为:System.out.println("X+Y="+(X+Y));
第二个则为计算了两个变量的值