·数据类型
Java是一种强类型语言,这意味着我们需要为每一个变量声明一种类型。在Java中,数据类型分为两大类,一类是基本数据类型,一类是引用数据类型。如图。
本篇先介绍基本数据类型,引用数据类型需要在引入对象的概念之后介绍。
1.数值型
整数型:byte 1字节(-2^7 ~ 2^7-1);short 2字节(-2^15 ~ 2^15-1);int 4字节(-2^31 ~ 2^31-1);long 8字节 (-2^63 ~ 2^63-1)。在Java中,整型变量的长度是固定的,而不是像C/C++一样受处理器影响。这也是Java可移植性的重要体现。
浮点型:单精度浮点——float 4字节 (符号位 1bit ,指数位 8bit,尾数位 23bit,大约±3.40282347E+38);双精度浮点——double 8字节(符号位 1bit ,指数位 11bit,尾数位 52bit)。在Java中,浮点数默认类型为double,若要使用float需要在数字后面加字母F(大小写均可),例如 float f = 3.14F; 同样,在double类型浮点数后也可以加后缀D,double d = 3.14(D);
2.字符型
char 2字节 占一个采用UTF-16编码表示的Unicode码点的代码单元,可以表示大多数常用Unicode字符。
在实际使用中,一般不建议使用char,因为某些特殊字符需要大于一个的代码单元来表示,所以推荐在处理字符问题时使用String。
3.布尔型
boolean 1字节 仅有true和false两个值,用来判断逻辑是非。true、false必须小写且不能用1、0代替(区别于C++)。
·类型转换
在运算时,我们经常会将各种不同类型的值混合运算,而实际执行过程中,不同类型的量会转换成同一类型再进行运算。上图列出了各种基本数据类型的合法转换。实线箭头表示无信息丢失的转换,虚线箭头表示可能有精度损失的转换。例如,123456789是一个大整数,它的位数比float的精度高。当这个数转化位float时,会损失一定的精度。
int a = 123456789;
float b = a;//b等于1.23456792E8
当使用两个数值型的数据进行运算时,类型转换会遵循以下原则:
如果两个操作数中有一个是double类型,另一个也会转换为double。
当没有double时,若有一个为float类型,另一个也会转换为float。
当没有double和float时,若有一个为long类型,另一个也会转换为long。
否则,只含有byte、short或int时,两个操作数都会转换为int类型。
·强制类型转换
上面我们了解了在必要时,较“低级”的类型会转换为较“高级”的类型。但反过来,“高级”有时也需要转化为“低级”。虽然这种转换可能会丢失一些信息,但在Java中,这种转换是被允许的。此时,就需要用“强制类型转换”。强制类型转换的语法格式为在圆括号中填入转换的目标类型,后面紧跟待转换的量。例如:
byte a = (byte)128; //此时a等于-128,这涉及到原反补码的知识,不展开说明
double b = 3.14;
int c = (int)b; //此时c等于3,小数部分直接丢弃。
由以上语句可以看出若要将一个数值的类型强制类型转换为另一种,而又超出了目标类型的表示范围,结果会被截断成一个不同的值。所以,在强制类型转换时要非常小心数据丢失。
【注】当右操作数为较高级常量,而左操作数为较低级变量时,Java会自动判断右边的值是不是在左边类型的合法范围内。若是,则无需强转,自动将结果类型改为左操作数类型。若否,则会报错。