本人是某不入流本科院校应届毕业生,在校期间荒废了许多时间,基础知识薄弱,实践经验几乎为零,所以想重新系统学习一下Java语言,所以每周在此分享个人的学习笔记,起到总结和温习的作用。
目录
一.变量和数据类型
1.1基本类型变量
1.2引用类型变量
二.数据类型转换
2.1自动类型转换
2.2强制类型转换
2.3数据类型提升
一.变量和数据类型
在Java中,变量分为两种:基本类型变量、引用类型变量。
1.1基本类型变量
在Java中,定义了以下几种基本数据类型:
- 整数类型:byte,short,int,long
- 浮点数类型:float,double 浮点类型的数即为小数,对于float类型,需要加上f后缀
- 字符类型:char
- 布尔类型:boolean
变量必须先初始化后再使用。例如:
int a=0;
float b=1.23f;
上述语句分别定义了一个整形int类型的变量a,初始值为0,和一个浮点型float变量b,初始值为3.14。
值得一提的是,浮点型变量分为double双精度浮点数和float单精度浮点数,double 精度高,有效数字 15-16 位,float 精度低,有效数字 6-7位,但是 double 消耗的内存是 float 的两倍,运算速度比 float 慢得多。
另外,布尔类型boolean只有true和false两个值,布尔类型常用于逻辑运算结果。
1.2引用类型变量
除了上一节提到的基本数据类型的变量以外,剩下的都是引用数据类型。
在Java中,最常用的引用类型就是String字符串:
String demo="HelloWorld";
二.数据类型转换
在Java的数据运算中,可能会遇到多个数据类型不一致的情况,这个时候运行的结果可能会发生错误,把一种数据类型赋值给另一种数据类型。为了避免这种错误,所以要进行数据类型转换。
2.1自动类型转换
数字表示范围小的数据类型可以自动转换成范围大的数据类型。
例如:
byte a1 = 10;
short a2 = ++a1;
具体自动转换规则如下图所示:
Ps:所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
char型和short型参与运算时,必须先转换成int型。
在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型转换为左边变量的类型。如果右边表达式的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度。
自动类型转换的溢出问题:
如以下代码所示,代码要求两个int数据类型的变量进行相乘运算,但此时的运算结果超过了int数据类型的取值范围(-2147483648~2147483647),此时会发现运算结果total为负数,显然是错误的
int m = 123456789;
int n = 9999;
long total = m * n;
遇到这种情况,可以先把第一个数据转换成范围大的数据类型,再和其他的数据进行运算。
int m = 123456789;
int n = 9999;
long total = (long)m * n;
2.2强制类型转换
强制类型转换适用于数据范围大的数据类型转换到数据范围小的数据类型
如同字面意思,强制类型转换即在数据类型不符合自动类型转换的规则下,把一个数据强制转换成另一种数据类型。
short s = 100;
int i = s;
double d = 10.24;
long l = (long) d;
强制类型转换存在精度丢失的情况,另外也存在数据溢出的问题。
2.3数据类型提升
在多种不同数据类型的表达式中,类型会自动向范围表示大的值的数据类型提升。
int a = 10;
long b = 11;
int c = a + b; // 编译失败,赋值给int时会丢失数据
long d = a + b;
对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算
byte a = 10;
byte b = 11;
byte c = a + b;
System.out.println(c);// 编译失败,从int转换到byte可能会有损失
虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a 和b 都提升成 int, 再进行计算, 得到的结果也是 int,此时赋值给 c, 就会出现上述错误