数据类型总览
Java的数据类型分为基本数据类型与引用数据类型。
一共有8种基础数据类型,3种引用数据类型。这里有个要注意的地方是在Java内字符串String是一个类。
英文名称 | 中文名称 | 长度(位) | 表数范围 |
---|---|---|---|
byte | 字节型 | 8 | -128~127 |
short | 短整型 | 16 | -215~215-1 |
int | 整型 | 32 | -231~231-1(约21亿) |
long | 长整形 | 64 | -263~263-1 |
float | 单精度浮点型 | 32 | -3.403E38~3.403E38 |
double | 双精度浮点型 | 64 | -1.798E308~1.798E308 |
char | 字符型 | 16 | |
boolean | 布尔型 | 32 | |
class | 类 | ||
interface | 接口 | ||
array | 数组 |
注:Java规范中没有明确给出布尔类型的长度,但是在Java中布尔类型false存储为0,true存储为1,也就是占据1bit;但是在计算机中最小的处理单位是1byte,也就是8bit;但是在JVM规范中指出,将布尔类型作为整型来计算,也就是说布尔类型占4byte,也就是32bit。
整型
Java各整数类型有固定的表数范围和字段长度,不受操作系统的影响,以保证Java程序的可移植性。
Java的整数常量默认为int型,声明long型常量须后加‘l’或者‘L’。
Java程序中变量通常声明为int型,除非不足以表示比较大的数,才是用long。
class VariableTest1{
public static void main(String[] args) {
// byte
byte b1 = 127;
byte b2 = -128;
System.out.println(b1);
System.out.println(b2);
// short
short s1 = 32767;
short s2 = -32768;
System.out.println(s1);
System.out.println(s2);
// int
int i1 = 2147483647;
int i2 = -2147483648;
System.out.println(i1);
System.out.println(i2);
// long
long l1 = 9223372036854775807L;
long l2 = -9223372036854775807L;
System.out.println(l1);
System.out.println(l2);
}
}
浮点型
与整型类似,Java浮点类型也有固定的表数范围和字段长度,不受具体操作系统的影响
浮点型常数有两种表示形式:
-
十进制数形式,如:5.12 512.0f .512(必须要有小数点)
-
科学计数法形式,如:5.12e2 512E2 100E-2
float:单精度,尾数可以精确到7位有效小数,很多情况下,精度很难满足需求。
double:双精度,精度是float的两倍,通常使用这种类型。
class VariableTest1{
public static void main(String[] args) {
// float
float f1 = 0.9999999f;
float f2 = 0.1f;
System.out.println(f1);
System.out.println(f2);
// float的精度只有7位,如果小数点后超过7位呢?
float f3 = 0.99999999f;
System.out.println(f1 == 1); //false
System.out.println(f3 == 1); //true
// double
double d1 = 0.9999999999999999;
double d2 = 0.1;
System.out.println(d1);
System.out.println(d2);
}
}
字符型
char型数据用来表示通常意义上的“字符”
Java中所有的字符都是使用Uncicode编码,故一个字符可以存储一个字母,一个汉字或者其他语言的一个字符。
字符型变量的三种表现形式:
- 字符常量是用单引号(’’)括起来的单个字符。例如:
char c1='a'
,char c2='中'
,char c3='9'
- Java中还允许使用转义字符’\'来将其后的字符转变为特殊字符型常量,例如:
char c1='\n'
,\n表示换行符 - 直接使用Unicode值来表示字符型常量:’\uXXXX’。其中XXXX代表一个十六进制整数。如
\u000A
表示\n。
class VariableTest1{
public static void main(String[] args) {
// char
char c1 = 'a';
char c2 = '中';
char c3 = 'ぬ';
// char c4 = 'ab'; 报错(错误: 不是语句),因为char类型的变量只能有一个字符。
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
// 转义字符
char c5 = '\n';
System.out.println("hello"+c5+"world");
// Unicode字符
char c6 = '\u0043'; // '\u0043' == C
System.out.println("hello"+c6+"world");
}
}
布尔型
class VariableTest1{
public static void main(String[] args) {
// 布尔型
boolean be1 = true ;
boolean be2 = false;
System.out.println(be1);
System.out.println(be2);
}
}
自动类型转换
类型转换只包含除布尔型外的七种基础数据类型。
class VariableTest2 {
public static void main(String[] args) {
// 自动类型转换
byte b1 = 2;
int i1 = 129;
// byte b2 = i1 + b1; 编译不通过(错误: 不兼容的类型: 从int转换到byte可能会有损失)。应该使用能够承载他们运算结果长度的数据类型来接收。
int i2 = i1 + b1; // i2是int类型,长度是4byte,可以接收i1和b1的和
System.out.println(i2);
long l1 = i1 + b1; // l1是long类型,长度是8byte,远远超过i1和b1的长度,当然可以接收他们的和
System.out.println(l1);
float f1 = i1 + b1; // f1是float类型,长度是4byte,也可以用来接收i1和b1的和,但是结果会自动添加小数点
System.out.println(f1); // 相对于,double也可以。
// 这里总结一下就是:短类型和长类型进行运算,结果类型自动提升为长类型。和浮点型进行运算,结果类型自动提升为浮点型。
// 短类型是容量小的类型,长类型是容量大的类型,容量大小指的是表示数的范围,大小是相对的。
// 我们这里并没有特别点明是数值类型才可以,因为字符类型也可以进行运算。
char c1 = 'a';
System.out.println(c1 + i1); // 运算将字符类型看作ASCII码值进行运算,同时将字符类型识别为整型。'a'(char) == 97(int).
// Java中的布尔值只有true和false两个值,所以不进行运算。
// 补充:当byte,char,short三种类型做运算时,结果为int类型。
// short s1 = 3;
// byte b2 = b1 + s1; 编译不通过(错误: 不兼容的类型: 从int转换到byte可能会有损失)。
// char c2 = b1 + c1; 编译不通过(错误: 不兼容的类型: 从int转换到char可能会有损失)。
// short s2 = s1 + b1; 编译不通过(错误: 不兼容的类型: 从int转换到short可能会有损失)。
}
}
强制类型转换
自动类型转换的逆运算,自动类型转换会将短类型提升为长类型,那么如果要把长类型转换为短类型,那就要用强制类型转换。
class VariableTest2 {
public static void main(String[] args) {
// 强制类型转换
double d1 = 12.3;
int i1 = (int)d1; // 强制类型转换需要使用强转符,但是有可能损失精度。
System.out.println(i1); // 因为int无法存放小数,所以必须舍去小数部分,影响精度
int i2 = 128;
short s1 = (short)i2;
System.out.println(s1); // 因为short可以放下128,所以精度没有损失
byte b1 = (byte)i2;
System.out.println(b1); // 因为byte类型只能存放8位(-128~127),所以byte会将128强转成-128
}
}