java枚举数字_Java枚举类型的使用,数值的二进制表示

本文介绍了Java枚举类型的使用,强调枚举是引用类型而非原始数据类型,探讨了枚举的特性及基本用法。其次,讲解了数值的二进制表示,包括原码、反码和补码的概念,并通过代码示例展示了位操作。最后,通过实验揭示了浮点数计算的不精确性问题,并讨论了同名变量的屏蔽原则。

一.Java枚举类型的使用

首先请看这段代码:

packagejava上课;public classEnumTest {public static voidmain(String[] args) {

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};

运行结果如下

8a4b7733293d21aed18cd627263da29a.png

为什么是这个结果呢?

1.s和t不会引用同一个对象

2.s也不是原始数据类型原始类型,java中的原始类型包括 boolean,char ,byte,short ,int,long ,float ,double

3.将枚举成员经字符串转换后赋值给一新的变量,会与已赋值这个枚举成员的变量共用一处内存,比如代码中的s与u。

4.将枚举成员输出

结论

1.枚举类型是引用类型

2.枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象。相同的值则引用同一个对象。

3.可以使用“==”和equals()方法直接比对枚举变量的值,换句话说,对于枚举类型的变量,“==”和equals()方法执行的结果是等价的。

枚举类型的基本用法

常量,switch,向枚举中添加新方法,覆盖枚举的方法,实现接口,使用接口组织枚举,关于枚举集合的使用

二.数值的二进制表示

概念

原码:二进制的定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反(0变为1,1变为0),但符号位除外。

补码:正数的补码与其原码相同;负数的补码是在其反码末位加1。

实例可以看下面的图

04aa08a4d3a4982b804fdaca560770ba.png

位操作代码测试

packagejavatask;public classBinarySystem {public static voidmain(String [] args) {int a=9;

System.out.println(a<<3);

System.out.println(a>>3);

System.out.println(a&3);

System.out.println(a|3);

System.out.println(~a);

System.out.println(a^3);int b=-9;

System.out.println(b<<3);

System.out.println(b>>3);

System.out.println(b&3);

System.out.println(b|3);

System.out.println(~b);

System.out.println(b^3);

}

}

运行结果:

6e62700be74bb05c8e6a7f645f000681.png

Java用的是补码。

三.动手实验

请运行以下代码

packagejava上课;public classTestDouble {public static voidmain(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));

}

}

你看到了什么样的输出,意外吗?

2dc0990919c5fe399670fa4d431616d6.png

结论:使用double类型的数值进行计算, 其结果是不精确的。

why:因为java中十进制与二进制转化时存在问题,double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差,简单来说就是我们给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需   要无穷多位),而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。

四.动手动脑

Java变量遵循“同名变量的屏蔽原则”,请课后阅读相关资料弄清楚相关知识,然后自己编写一些测试代码,就象本示例一样,有意识地在不同地方定义一些同名变量,看看输出的到底是哪个值。

同名变量的屏蔽原则也就是 假如有一个全局变量与局部变量,会优先使用局部变量的值。看下面的代码

packagejavatask;public classTest2 {static int a = 3,b = 5;static int max(int a,intb) {intc;

c= (a > b) ? a : b; //这里的a,b是局部变量,其值决定于调用函数

return(c);

}public static voidmain(String [] args) {int a = 8;//这里的a是局部变量a = 8,b是全局变量b = 5,两值作为实参传给函数max()

System.out.println("max = "+max(a,b));

}

}

以下代码的输出结果是什么?

int X=100;

int Y=200;

System.out.println("X+Y="+X+Y);

System.out.println(X+Y+"=X+Y");

0e854ed339991e45a8c4cf289abad8c2.png

为什么会有这样的输出结果?

Java中的加号有时是连接符,有时是运算符:

1>当左右两边连接的都是非数字型时,则为连接符。

2>当一边是数值类型,另一边是非数值类型时,则为连接符。

3>当两边都是数值类型时,则为运算符,即相加求和的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值