整数类型
类型 | 占用空间 | 表数范围 |
---|---|---|
byte | 1字节=8bit | -128~127 |
short | 2字节 | -215~215-1 |
int | 4字节 | -231~231-1 |
long | 8字节 | -263~263-1 |
long
类型的变量赋值时,需要在数字后面加上L
或l(小写L)
- java中的整数类型(简称:整形),默认是
int
类型 - 开发中一般都使用
int
,只在整数过大时才使用long
。byte
和short
一般不用。
public class IntegerTest {
public static void main(String[] args) {
// byte, short, int, long
byte a = 10;
short b = 20;
int c = a + b;
long d = 100000000000L;
System.out.println(c);
}
}
补充:
- 字节(byte):是表示计算机容量的基本单位
- 位(bit):是数据存储的最小单位
- java中默认就表示,给变量赋的值,默认是某种类型
- 转换关系:
- 1 Byte = 8 bit
- 1 KB = 1024 Byte
- 1 MB = 1024 KB
- …
浮点类型
类型 | 占用空间 | 表数范围 |
---|---|---|
float | 4字节 | -3.403E38~3.403E38 |
double | 8字节 | -1.798E308~1.798E308 |
- 浮点数通常有两种表数形式:
- 十进制形式:0.1、0.2f、3.0F、.3(可以没有0,但要有小数点)
- 科学计数法形式:1.25E2、1.24e2、1.25E-2
- float:单精度浮点数,尾数可以表示到小数点后7位。大多数情况下,精度难以满足要求。
- double:双精度浮点数,尾数可以表示到小数点后15到16位。也是java默认的浮点数类型。
- 给float变量赋值时,需要在小数末尾加上
f
或F
后缀。
自己定义小数时,最好也使用double
类型。
public class FloatTest {
public static void main(String[] args) {
// float,double
float f1 = 1.0f;
float f2 = .23F; // 0.23
double d1 = 1.0;
double d2 = .23; // 0.23
double d3 = 1.0e-6; // 1.0 x 10^-6
double d4 = 1.0E6; // 1.0 x 10^6
// 精度测试
// 测试1
System.out.println(0.1 + 0.2);
// 测试2
float f3 = 123123123123f;
float f4 = f3 + 1;
System.out.println(f3);
System.out.println(f4);
System.out.println(f3 == f4);
}
}
结果:
0.30000000000000004
1.23123122E11
1.23123122E11
true
补充:
java提供的float和double表示的精度都不高。如果要求小数计算后,精确度不丢失需要使用专门的BigDecimal
类。
字符类型
- char:字符类型,占用2字节。
- 使用Unicode编码,可以存储字母、汉字、标点符号等。
- 字符有三种形式:
- 直接由
''
括起来,形如:'a'
、'中'
、','
。 - 直接使用Unicode值表示,形如
'\u0023'
表示符号#
。其中,从\u0000
`\u007f`为`ASCII`字符,从`\u0080`\uffff
为Unicode
字符 - 具有特殊意义的字符,如
\n
表示换行符,当读到这个字符时,语句自动换行。
- 直接由
public class CharTest {
public static void main(String[] args) {
char ch = 'A';
char ch2 = '\n';
char ch3 = '\u0023'; // 这种以\开头的字符,被称为转译字符。当系统接收到这种字符时,会自动对其进行翻译。
//char ch3 = 'AB'; //error
//char ch4 = ''; //error
System.out.print(ch);
System.out.print(ch2);
System.out.println(ch3);
}
}
输出:
A
#
补充:
字符集:像ASCII
、Unicode
等都是常见的字符集。
应用自:https://www.runoob.com/w3cnote/ascii.html
ASCII
字符集中的字符可以直接用数字表示,当然,Unicode
编码也可以。
java会自动将数字对应到ascii码表中的字符,反之亦然。因此,java中的char类型是可以当作数字进行计算的。如'a' + 1
就是字符'b'
public class CharTest {
public static void main(String[] args) {
char ch = 'a' + 1;
System.out.println(ch);
}
}
输出:
b
布尔类型
- boolean:布尔类型。
- 只有两个值,
true
和false
,表示真
和假
。(java与C不同,不能用数字代替布尔值)
boolean常用在循环控制语句中,也基本只用在循环控制语句中。
public class CharTest {
public static void main(String[] args) {
boolean b = true;
System.out.println(b);
}
}
输出:
true
注意:虽然输出是一个字符串,但在代码中的用处和意义都与字符串无关。
基本数据类型间的运算规则
这里只讨论7种基本数据类型之间的运算规则,其中不包含boolean
类型。因为,boolean
类型不能用于运算。
基本数据类型之间的运算规则有两种:
- 自动类型提升:当容量小的变量与容量大的变量之间进行运算时,结果自动转换为容量大的类型。
- 强制类型转换:无视自动类型转换的规则,进行强制的类型转换。可用于子类型向父类型的转换
说明:容量的大小指的是数据类型的表数范围的大小。并不是数据类型占用内存的大小。如float
类型的表数范围就大于long
类型。
补充:强制类型转换可以兼容自动类型转换。可以进行自动类型转换的地方,如果使用了强制类型转换也没问题。
自动类型提升
容量小的类型变量可以直接向容量大的赋值。
赋值顺序:int > long > float > double
特殊情况:byte、short、char
运算后的结果都会自动转换成int
public class VariableTest{
public static void main(String[] args){
int i1 = 10;
long l1 = i1;
float f1 = l1;
// 运算
long l2 = i1 + l1;
float f2 = l1 + f1;
// 特殊情况1:
byte b1 = 10;
short s1 = 12;
int i2 = b1 + s1; // 容量比int小的类型进行运算时,会默认转换成int类型。
// 特殊情况2:
byte b2 = 12;
char c1 = 'a';
int i3 = b2 + c1; // 这里同样会默认转换成int类型。
// char c2 = b2 + c1; // 报错
//======================
// 情况1:
long l3 = 123L;
long l4 = 123; // 这里虽然不会报错,但其实这里进行了一次自动类型提升。int ----> long
// 情况2:
float f3 = 12.3F;
// float f4 = 12.3; // 报错。这里类似于将double值转为float类型。不符合自动类型提升的规则。
// 情况3:
byte b3 = 12;
// 规则1:java中整数常量参与运算时会被识别为int类型进行运算。(赋值时没有这种规则)
int i4 = b3 + 1;
// 规则2:java中小数常量参与运算时会被识别为double类型。
double d1 = b3 + 12.3;
// 补充:为什么标识符不能以数字开头?原因为了“自洽”
/*
int 123L = 12; // 如果可以数字开头
long l5 = 123L; // 这种情况下会造成歧义。
*/
}
}
强制类型转换
使用格式:数据类型A 标识符 = (数据类型A)数据类型B的数据;
其中()
被称为强转符。符号内指明要转换的目标类型。
public class VariableTest{
public static void main(String[] args){
long l1 = 123L;
int i1 = (int) l1;
int i2 = (int) 12.3;
float f1 = (float)i1; // 编译也可以通过
}
}