一、数据类型分类
- 整型(4种)
- byte 1个字节 -128~127
- short 2个字节 -32768~32767
- int 4个字节 -21 4748 3648~21 4748 3647
- long 8个字节 -922 3372 0368 5477 5808~922 3372 0368 5477 5807
byte和short主要用于特定的场合(如底层文件的处理或者需要控制占用存储空间量的大数组)
int最常用
long在使用时有一个后缀L(如6000000000L)
示例
long num = 2200000000L; //所赋值范围超出int的范围,必须加L
long num = 198L; //所赋值范围未超出int的范围,可以加L
long num = 198; //所赋值范围未超出int的范围,可以不加L
- 浮点型(2种)
- 单精度浮点数 float 4个字节 有效位6-7位
- 双精度浮点数 double 8个字节 有效位为15位
float类型的变量赋值数字后面要加f/F
double类型的变量赋值数字后面可以加或不加d/D
示例
float f = 123.4f; //为一个float类型的变量赋值,必须加f
double d1 = 100.1 //为一个double类型的变量赋值,可以不加d
double d2 = 199.3d //为一个double类型的变量赋值,可以加d
- 字符型(char)
给char类型赋值时,需要加''把字符括起来
示例
char c = 'a';
char ch = 97;
Tips:在这个代码块中,'a'和97都表示a这个字符,在ASCII表十进制的97可以查到代表a这个字符
(十六进制和二进制同理)
- 布尔型(boolean)
布尔型变量只有两个值
- true
- false
示例
boolean flag = ture; //初始化变量为true
flag = false; //将false赋值给flag
二、变量类型的转换
1.自动类型转换(隐式类型转换)
- 条件
- 两种数据类型彼此兼容
- 目标类型的取值范围大于源类型的取值范围
示例
byte b = 3;
int x = b; //程序把byte类型的变量b转换成了int类型,无须特殊声明
Tips:由于int类型的取值范围大于byte类型的取值范围,编译器在赋值过程中不会造成数据丢失
所以编译器能自动完成这种转换
除了示例的情况,还有很多类型之间可以进行自动类型转换
- 整数类型之间可以实现转换,如byte类型的数据可以赋值给short、int、long类型的变量;short、char类型的数据可以赋值给int、long类型的变量;int类型的数据可以赋值给long类型的变量。
- 整数类型转换为float类型,如byte、char、short、int类型的数据可以赋值给float类型的变量。
- 其他类型转换为double类型,如byte、char、short、int、long、float类型的数据可以赋值给double类型的变量。
2.强制类型转换(显示类型转换)
- 两种数据类型之间的转换需要进行显式声明。(当两种类型彼此不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,需要强制类型转换)
示例
1 public class Example01 {
2 public static void main(String[]args) {
3 int num = 4;
4 byte b = num;
5 System.out.println(b);
6 }
7 }
在这种情况下,由于byte的取值范围比int小,一个字节的变量无法存储四个字节的变量,导致数值溢出,所以无法进行自动类型转换,程序会报错,在这时候需要进行强制类型转换:
将第4行代码改为
byte b = (byte) num;
程序就不会报错了,运行结果为4
- Tips : 在对变量进行强制类型转换时,会发生取值范围较大的数据类型向取值范围较小的数据类型的转换。如将一个int类型的数转换为byte类型,极容易导致数据精度的丢失。
示例
1 public class Example02{
2 public static void main(String[]args) {
3 byte a;
4 int b = 298;
5 a = (byte) b;
6 System.out.println("b = " + b);
7 System.out.println("a = " + a);
8 }
9 }
运行结果为
b = 298
a = 42
由此可知,当将变量b的类型强制转换为byte类型后,前面3个高位字节的数据丢失,数值发生改变
过程如下
int :00000000 00000000 00000001 00101010(298)
byte: 00101010(42 )
很明显丢失了精度












网友评论