1. 转义字符:
转义字符
\
当使用了转义字符那么将不再视为’\n’这是一个字符串而是"一个"字符
- \n 这是一个"换行符",属于char类型的数据
反斜杠在java语言中具有转义功能
题外话:
- System.out.println() 和 System.out.print() 的区别;
- println输出后会进行换行操作,print表示输出,但不换行
转义字符 | 说明 |
\a | 响铃 |
\b | 退格 |
\f | 换页 |
\u | 联合后面的一串数字是某个文字的unicode编码 |
\n | 换行 |
\r | 回车 |
\t | 制表符 |
\ | \ |
\’ | 单引号 |
\" | 双引号 |
\0 | 空字符(null) |
\ddd | 1~3位八进制数代表的任意字符 |
\xhh | 1~2位十六进制代表的任意字符 |
注:转义字符出现在特殊字符之前,会将特殊字符转换成普通字符
2. char 字符类型:
一个中文占用2个字节,char类型正好是2个字节;
- 所以java中的char类型变量可以存储一个中文字符
以下声明报错:123属于字符串,该使用""双引号进行引起来;
- char k = ‘123’;
以下声明报错:"a"是字符串类型,k变量是char类型;
- char k = “a”;
这属于类型不兼容,编译错误;
char类型正确声明方式:
char k = 'b';
3. 整数类型:
关键字 | 占用空间大小 | 取值范围 | 默认值 |
byte | 1 | [ -128 ~ 127 ] | 0 |
short | 2 | [ -32768 ~ 32767] | 0 |
int | 4 | [ -2147483648 ~ 2147483647] | 0 |
long | 8 | 0L |
3.1 默认类型
java中“整数型字面量” 默认是:
- int类型
要让“整数型字面值”被当作long类型来处理的话,需要在“整数型字面值”后面添加l/L,建议用大写
long a = 120L;
3.2 java中的整数型有三种表达方式:
第一种方式:十进制【是一种缺省默认的方式】
第二种方式:八进制【在编写八进制整数型字面值的时候需要以0开始】
第三种方式:十六进制【在编写十六进制整数型字面值的时候需要以0x开始】
- 010 整数型字面值以0开头的,后面那一串数字就是八进制形式
- 0x10 整数型字面值以0x开头的,后面哪一串字数就是十六进制形式
3.2.1 例子:
long x = 456; // 小容量可以自动转换成大容量,'456' 被默认设为int类型,但是使用的是long类型声明变量进行赋值,所以会自动转换成long类型; // 这种机制被称为:自动类型转换机制 long y = 2147483647;
2147483647 是 int类型,占用4个字节
- 变量 y 是long类型,占用8个字节,自动将 值2147483647 转换成long类型
long z = 2147483648;
这样声明将会报错!在一开始整数型字面量默认当作int类型处理,2147483648已经超出int类型的取值范围所以报错;
- 因为是在一开始的时候就已经报错,所以long声明的z无法进行类型转换!
解决错误:
long h = 2147483648L; System.out.println(h); // 输出:2147483648 在值后面加上L;那么这个字面值一开始就会被当作long类型来处理; 2147483648 ------ int类型 2147483648L ------ long类型 // 以下代码不存在类型转换 long u = 2147483648L; int i = 2416;
3.3 整数类型的转换
- 以下程序编译报错:大容量不能直接赋值给小容量
long x = 100L; int y = x;
- 大容量转换成小容量,需要进行强制类型转换;
强制类型转型需要加“强制类型转换符”
加上转换符后编译通过,但是运行阶段可能损失精度
所以强制类型转换谨慎使用,因为损失精度后可能会损失很严重 - 强制转换符:(转换的数据类型[int,short,byte,long]) 字面量/字面值
long x = 100L; int y = (int)x;
3.3.1 强制转换原理:
- 原始数据:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 01100100
8字节long类型
》》》》》》 转换后 》》》》》
- 强转后的数据:
00000000 00000000 00000000 01100100
4字节int类型 - 将左边的二进制砍掉【所有的数据强转的时候都是这样完成的】
- 当字面值没有超出byte类型取值范围的话,该字面值可以直接赋值给byte类型的变量;
byte b = 127;
3.3.2 精度损失:
计算机二进制有三种表示形式:
- 原码
- 反码
- 补码
计算机在任何情况下底层表示的和存储数据的时候采用了补码形式。
- 正数的补码:和原码相同
- 负数的补码:负数的绝对值对应的二进制码所有的二进制位取反,再加1
补码:10000000
原码计算过程:
- 10000000 - 1 --> 011111111
- 10000000 --> 128
- -128
4. 浮点型:
关键字 | 精度 | 占用空间(字节) |
float | 单精度 | 4 |
double | 双精度 | 8 |
double的精度太低【相对来说】,不适合做财务软件
需要精度高的计算时,会使用SE类库中的一种引用数据类型:java.math.BigDecimal
- 在java中,所有的浮点型字面值【3.2】,默认被当作double类型来处理;
- 要想该字面值以float类型来处理,需要在字面值后面添加F/f
无限小数中例如:
- 1.55555555555555555555555555555555555…
这样的小数在计算机中只能存储近似值;
5. 布尔型:
- boolean
在java中,boolean类型只有两个值:true、false
,没有其他值。
boolean a = false; boolean b = true;
在底层存储的时候boolean类型占用1个字节,因为实际存储的时候flase底层是0,true底层是1
6. 类型转换
关于基本数据类型之间的互相转化:
- 八种数据当中除布尔类型不可转换,剩下的7种类型之间都可以进行转换
- 小容量向大容量转换,称为自动类型转换,容量从小到大排序:
- byte < short < int < long < float < double
char <
注:任何浮点类型不管占用多少个字节,都比整数型容量大。
char和short可表示的种类数量相同,但是char可以取更大的正整数
大容量转换成小容量,叫做强制类型转换,需要加强制类型转换符,程序才能编译通过,但是在运行阶段可能会损失精度,所以谨慎使用。
当帧数字面值没有超出byte,short,char的取值范围,可以直接赋值给byte,short,char类型的变量。
byte,short,char混合运算的时候,各自先转换成int类型再做运算。
多种数据类型混合运算,先转换成容量最大的类型再做运算。
6.1 例1:
double dd = 10/3; System.out.println(dd); // 输出3.0
逻辑分析:
在最开始,整数型已经被当做是int类型进行除法,所以得3;
- 因为赋值的是double类型所以输出的结果是3.0
- 程序先运行10/3=3;int类型相除取整数!然后赋值给dd变量
- 变量是double类型,所以结果是3.0
6.2 例2:
dd = 10.0 / 3; System.out.println(dd); // 输出3.3333333333333335
逻辑分析:
与上方例子不同右方赋值项的式子是
- double类型 / int类型;
- 所以在一开始运算结果的时候就3.333333333333
- 最后将dd重新设置为该值
6.3 例3:
long g = 10; byte b = (byte)(int)g/3;
编译出错!
逻辑分析:
- 24行代码先把g变量弄明白是什么类型了再与3这个int类型做运算公式
- 最开始的g是long类型强制转换后成为了int类型再次转换后成为了byte类型
long类型g > int类型g > byte类型g - 24行代码运算结果 byte类型g(10) / int类型3 = int类型3;
计算结果是int类型而赋值的变量是byte类型,大容量转小容量,精度受损所以报错
解决方法1:
int b = (byte)(int)g/3; System.out.println(b);//输出3
解决方法2:
byte b = (byte)(int)(g/3); System.out.println(b);//输出3
6.4 类型转换总结:
- 牢记类型转换规则
- 在脑海中将编译和运行两个阶段分开,这是两个不同的阶段,不要弄混!