p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解
又p.s.这一部分内容建议自己复制代码去运行一下,这样印象才更深刻
为什么要进行类型转换
因为JAVA是 强类型语言,不可能随随便便用不同类型的变量
就像踢足球的不可能随随便便地更换位置
而数据类型有阶级之分
在运算中要将不同类型的数据转换为同一类型才能进行计算
而类型转换又有两种不同的转换方式
即强制类型转换和自动类型转换
a、强制类型转换
强制类型转换通常是将高阶类型转换为低阶类型
举例
int i = 50;
byte b = (byte)i;
System.out.println(b);
输出
50
解析
由上表得int
的阶级高于byte
因此要通过强制类型转换将i(int类型)
转换为i(byte类型)
强制转换格式:在要转换的变量前面加(转换类型名)
b、自动类型转换
强制类型转换通常是将低阶类型转换为高阶类型
举例
int i = 50;
long b = i;
System.out.println(b);
输出
50
自动类型转换则不需要在变量前写东西,正常写表达式便可
原因
通过上表可以发现高阶的数据类型精度高容量高,低阶的数据类型精度低容量低
因此自然精度低容量低的数值可以自动转换为精度高容量高的数值
而精度高容量高的数值则必须人为强制地转换为精度低容量低的数值
打个比方
100.1可以转换为100.100000,在数值上没有任何不同,即没有任何损失
而100.1想要变成100就只能人为地转换它,在转换过程中有损失,损失了0.1
这便是为什么低转高是自动类型转换,而高转低是强制类型转换
接下来说明几个问题和注意
1、内存溢出问题(其一)
通过对数据类型的了解我们知道了不同数据类型有他的一个数据范围,也就是内存
比如byte类型的内存就在-128~127之间
那如果转换成byte类型的数据超过这一范围了呢?
举例
int i1 = 150;
byte b1 = (byte)i1;
System.out.println(i1);
System.out.println(b1);
这就会输出
150
-106
为什么b1输出的是-106呢?
这就是因为150超出了byte类型的取值范围,导致了内存溢出问题,最后输出的不是预料中的数据
因此转换时如果出现明显的不对(如正数变负数)要考虑数据转换的类型的范围是否包含了这个数据
1、内存溢出问题(其二)
在计算比较大的数时我们也要考虑内存溢出问题
举例
int money = 10_0000_0000;//热知识:数字之间可以用下划线分割并且下划线不会被输出
int years = 20;
int total = money*years
System.out.println(total);
输出结果为
-1474836480
正数却成负数了,这是就要考虑是不是内存溢出了
但是1000000000和20并没有脱离int类型的范围啊?
但是! 20000000000脱离了int类型的范围
那么我们是不是把total的类型改为高精度的Long类型就可以了呢
试一试
int money = 10_0000_0000;
int years = 20;
long total2 = money*years;
System.out.println(total2);
输出结果为
-1474836480
这是为什么呢?那是因为在计算时系统默认计算的数据是int类型,在转换之前已经出问题了(即溢出了)
而解决方法为:先把一个数转换为Long类型,拔高整个表达式的精度
int money = 10_0000_0000;
int years = 20;
long total2 = money*(long)years;//即强制转换某个变量,这样整个表达式中的变量都会变成被强制转换的类型
System.out.println(total2);
输出结果为
```JAVA
20000000000
这样便解决了内存溢出问题
2、注意事项
1.不能转换布尔值(就两个true和false转换成什么)
2.不能把对象类型转换为不相干的类型(还没学到)
3.在把高容量高精度转换到低容量低精度的时候要强制转换
4.转换的时候可能存在内存溢出或精度问题!
数据类型转换实例
char c = 'a';
int d = c+1;
System.out.println((char) d);
输出
b