数据类型
概述
数据类型: Java是一门强类型语言,针对每一种数据都提供了对应的类型
数据类型的分类
八大基本数据类型
整数类型 字节数 取值范围
byte 1 -128~127
short 2 -32768 ~ 32767
int 4 -2^31 ~ 2^31 - 1
long 8 -2^63 ~ 2^63 - 1
小数类型
float 4 -3.403E38 ~ 3.403E38
double 8 -1.798E308~1.798E308
注意:
1.虽然小数表示的范围特别大,但是永远不能够存储所有的小数,因为小数存在无限不循环小数
2.同样是4/8个字节的小数类型取值范围大于整数类型,原因是小数和整数的存储形式不一样
3.在处理金融相关项目的时候,小数的计算要求精度非常高,那么使用float或者double来表示会出现精度问题,后期考虑使用BigDecimal来处理
布尔类型
boolean 1 false true
字符类型
char 2 0 ~ 65535 【Java使用Unicode编码的范围】
引用数据类型
类 (class) String
接口 (interface)
数组 ([])
代码示例
public class DataTypeDemo {
public static void main(String[] args){
// 定义一个byte类型的变量
byte by = 20;
System.out.println(by);
// by = 130; // -128~127
// System.out.println(by);
// short s = 32768;
// System.out.println(s);
long l = 1111111111111111111L;
System.out.println(l);
float f = 2.5f;
System.out.println(f);
double d = 3.5;
System.out.println(d);
boolean bool = false;
System.out.println(bool);
// bool = 0b00000001;
// System.out.println(bool);
char ch = 'a';
System.out.println(ch);
}
}
类型转换
概述
数据类型转换
当运算符两边类型不一致的时候,需要进行类型转换
类型转换的依据: 取决数据的取值范围
从上图可以观察出以下注意事项:
1.boolean类型不能够参与类型转换
2.char和byte/short只有交集关系,没有子集关系
3.数据类型的数据范围顺序:
byte -> short -> int -> long -> float -> double
char ->
类型转换常见的9中情况
1.自动类型转换 大类型数据 = 小类型数据
将小类型的数据转换成大类型数据,系统会自动转换
2.强制类型转换 小类型数据 = 大类型数据
将大类型的数据转换成小类型的数据,会编译报错
解决办法: 强制类型转换
格式:
目标类型 变量名 = (目标类型) 被转换的类型;
强制类型转换会出现的问题:
1.精度的丢失
2.数据的溢出
3.byte/short/char特例
4.byte/short 和 char 参与转换,都需要强制类型转换
5.表达式类型提升
当表达式的运算符两边类型不一致的时候,结果的类型会自动向高类型转换
6.当byte short char 之间参与运算的时候,底层都会转换成int类型来计算
7.boolean类型不能够参与运算和转换
8.字符串在参与运算中的转换问题,字符串相加是拼接操作
9.变量计算和常量计算问题
变量相加,编译器无法判断具体的结果
常量相加,在编译时期,系统就会运算结果
代码示例
public class DataTypeConvertDemo {
public static void main(String[] args){
// 1.自动类型转换
double d = 2.5f;
System.out.println(d);
// 2.强制类型转换
double d2 = 2.6;
// int i = d2; // 不兼容的类型: 从double转换到int可能会有损失
// 目标类型 变量名 = (目标类型) 被转换的类型;
int i = (int)d2; // 1.精度的丢失
System.out.println(i);
// 2.数据的溢出
// byte by = 128; // 不兼容的类型: 从int转换到byte可能会有损失
byte by = (byte)129; // -127
System.out.println(by);
// 3.byte/short/char特例
// 由于120正好在byte的范围内,所以编译帮助我们做了这个转换
// 但是如果一旦超出了byte的范围,那么系统就不会帮助我们转换,会出错
byte by2 = 120;
System.out.println(by2);
short s = 32767;
System.out.println(s);
// 97 正好在char的范围【0~65535】内,所以系统会帮助我们转换
char ch = 97;
System.out.println(ch);
// 4.byte/short 和 char 参与转换,都需要强制类型转换
byte by3 = 97;
char ch2 = (char)by3;
System.out.println(ch2);
char ch3 = 'b';
byte by4 = (byte)ch3;
System.out.println(by4);
// 5.表达式类型提升
// 当表达式的运算符两边类型不一致的时候,结果的类型会自动向高类型转换
int i2 = 100;
// i2 = i2 + 2.5; // 不兼容的类型: 从double转换到int可能会有损失
i2 = (int)(i2 + 2.5);
System.out.println(i2);
// 6.当byte short char 之间参与运算的时候,底层都会转换成int类型来计算
// 其实Java是强语言类型,针对整数类型划分出来很多类型【byte short int char】,
// 其实在其他语言里面只有整数和小数, Java针对【byte short int char】计算都是先转换成同一种类型int类型再进行运算
short ss = 25;
byte bb = 30;
ss = (short)(bb + ss); // 不兼容的类型: 从int转换到short可能会有损失
System.out.println(ss);
char ch4 = 'a';
byte by5 = 1;
char ch5 = (char)(ch4 + by5); // 错误: 不兼容的类型: 从int转换到char可能会有损失
System.out.println(ch5);
char ch6 = 'a';
byte by6 = 98;
System.out.println(ch6 < by6);
// 7.boolean类型不能够参与运算和转换
boolean bool = false; // 0000 0000 + 1 = 0000 0001
// boolean i3 = bool + 1; // 错误: 二元运算符 '+' 的操作数类型错误
// System.out.println(i3);
// 8.字符串在参与运算中的转换问题,字符串相加是拼接操作
String str = "2222";
str = "2222" + false + 2.5 + 2 + 'x';
System.out.println(str);
// 9.变量计算和常量计算问题
// byte by7 = 1;
// short s7 = 97;
// s7 = by7 + s7;
// System.out.println(s7); // wrong
// byte s7 = 1 + 97;
// System.out.println(s7); // right
// java文件 编译的时候 会优化代码,会将s7结果计算出来,所以真正在运行的时候应该是这样的: byte s7 = 98;
// short s7 = 97;
// s7 = 1 + s7;
// System.out.println(s7); // wrong
final byte by7 = 1;
final short s7 = 97;
short s8 = by7 + s7;
System.out.println(s8); // right
}
}