变量是Java程序中基本的存储单元,变量名有三个基本要素:数据类型、变量名和值。变量名是一块内存单元的名称,就像门牌号一样,通过变量可以找到它表示的内存单元,并对这块内存单元进行操作。在Java中变量必须声明后使用。Java有以下数据类型:
本文介绍Java的八种基本数据类型。Java的基本数据类型的长度在不同平台都是一致的,以保证可移植性。
一、整型
1.byte:占一个字节,范围为 -128~127.
2.short:占两个字节,范围为 -32768~32767.
3.int:占四个字节,范围为 -2147483648~2147483647.
4.long:占八个字节,范围为 .
Java整型常量(字面值)默认为int类型,在字面值后加 'l' 或 'L' 表示这个字面值为long类型。
整型在计算机中以反码表示,正数的反码与它的原码一致,负数的反码为它的原码除符号位按位取反再加1.
//此程序用于基本数据类型中的整型测试
public class IntegerTest{
public static void main(String[] args){
byte a = 10;
short b = 100;
int c = 1000L;//使用L会报错,因为long类型转换为int类型会丢失精度
long d = 10000;
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
二、浮点型
1.float(单精度):占四个字节,范围为 .
2.double(双精度):占八个字节,范围为 .
tips:
1. 在计算机中,浮点数的存储形式为:符号位+指数位+尾数位,单精度和双精度浮点数有不同的指数位和尾数位,具体细节在计算机组成原理中可以查到。
2.浮点数字面值默认为double类型,所以在初始化float类型的变量时,需要在字面值后加上 'f' 或 'F' 将其转换为float类型,否则编译时会报错。
3.double的精度比float高,通常情况下应该使用double。
可以看到,float可以表示到小数点后七位,而double可以表示到小数点后16位。
4.浮点数的表示形式:十进制表示(如果整数位为0,则0可以省略,但小数点不能省略)、科学计数法。
5.两个浮点数不能使用等于运算符判断是否相等,尤其是两个浮点数已经经过运算或处理,因为浮点数的表示和运算受制于精度,所以可能无法准确表示浮点数。判断两个浮点数是否相等应该使用容差法。
三、字符型
char:在Java中,字符型使用Unicode码,占两个字节,可以存放汉字。
1.字符型变量可以存储转义字符表示的字符,如换行符等。
常用的转义字符 | |
\t | 制表符,实现对齐功能 |
\n | 换行符 |
\r | 回车符,表示将光标移动到本行开头 |
\\ | 表示一个 \ |
\' | 表示一个 ' |
\" | 表示一个 " |
2.字符型变量在计算机中以整数的形式存储。
3.因为字符型变量以整数形式存储,所以它相当于一个整数,可以参与运算。
几种编码方式:
- ASCII码:占一个字节,总共有128个字符,首位作为奇偶校验码,无法表示所有字符。
- Unicode码:占两个字节,字母和汉字以及其他字符都使用两个字节表示,最多表示65536个字符,可以兼容ASCII码。
- UTF-8:是Unicode码的一种实现方式,是一种变长编码,有单字节(表示ASCII字符)、双字节、三字节(汉字等)和四字节模式。还有UTF-16等方式。
- 其他编码:GBK(全称《汉字内码扩展规范》)、GB2312(被GBK兼容)、BIG5(繁体字的编码)。
四、布尔类型
boolean:占一个字节,只有true和false两种取值,用于逻辑运算。
五、自动类型转换
下图是数值类型的转换方向,自动转换不能逆向进行。
- 当有多种类型参与运算时,会将这些类型的数据都自动转换为参与运算的类型中精度最高的那个类型,并且运算的结果也是这个类型。
- 高精度的类型无法自动转换为低精度的类型。
- 整数字面值的类型默认为int,能够使用字面值初始化短整型是因为:先判断字面值是否在该类型的范围内,如果在,那么就会转换成该类型,否则会报错。
- (byte,short)和char之间无法自动类型转换。
- 短整型(byte,short,char)在参与运算时会整型提升。
- boolean类型不会发生自动类型转换,不能参与运算。
六、强制类型转换
强制类型转换可以将一个类型强制转换成另一个类型(如果合法的话),但这可能会造成精度损失。
七、基本类型转换为String类型
public class ToString{
public static void main(String[] args){
//基本类型+""就可以实现基本类型转换为String类型
String s1 = (byte)123 + "";
String s2 = (short)1234 + "";
String s3 = (char)97 + "";
String s4 = (int)12345 + "";
String s5 = (long)1234567 + "";
String s6 = 123.194f + "";
String s7 = 1434.437 + "";
String s8 = true + "";
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
System.out.println(s5);
System.out.println(s6);
System.out.println(s7);
System.out.println(s8);
}
}
八、String类型转换为基本类型
public class ToBasic{
public static void main(String[] args){
//String类型转换为基本类型需要使用基本类型包装类的parseXX方法
//char不需要使用包装类中的parseXX方法,因为从String可以直接取出字符
byte a = Byte.parseByte("123");
short b = Short.parseShort("12345");
int c = Integer.parseInt("123556");
long d = Long.parseLong("12342134");
float e = Float.parseFloat("123");
double f = Double.parseDouble("1234");
boolean g = Boolean.parseBoolean("true");
String str = "abcdefg";
char ch = str.charAt(0);
System.out.println(ch);
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);
System.out.println(f);
System.out.println(g);
}
}
在将String类型转换成基本类型时,要保证字符串能转换成有效的数据,否则会在运行时抛出异常,因为在运行时才能发现字符串是非法的。
可以看到不论是无法转换的字符串还是字符串中的数字超出范围,都会抛出异常。
如上图,即使前一段可以正常转换成整型,但是仍旧会报错。