javaSE --基础部分 类型转换
为什么要学习类型转换?
因为计算机对不同的数据类型有不同的保存方式,例如:int(整型)
类型在32位计算机中,占4位。而double(双精度)类型在32位计算机中,占8位。当高位转向低位的时候,如果不进行类型转换,就会造成数据溢出。为保护数据信息,需要进行数据类型转换。
package test;
public class code03 {
public static void main(String[] args) {
int a = 10;
double b = 12.3;
数据类型 c = a + b;
}
}
隐式转换的过程
- 隐式转换
将数据类型中,取值范围小的数据,给取值范围大的类型赋值,可以直接赋值范例:
int a = 10;
double b =a;
简单记: 小的给大的,可以直接给
表示范围从小到大图片
- 小的数据类型,和大的数据类型运算,小的会提升为大的类型之后再运算
package code1;
public class code02 {
public static void main(String[] args) {
int a = 10;
double b = 12.3;
double c = a + b;
}
}
/*
a是int类型4个字节
b是double类型8个字节
a和b运算的过程中,就会先将a提升为double类型
当类型统一后,再进行运算
两个double运算,结果还是double
所以,结果使用double接收
*/
- 特殊关注:type short char 三种数据在运算的时候,不管是否有更高的数据类型,都会提升为int,然后再进行运算
package code1;
public class code02 {
public static void main(String[] args) {
byte a = 10;
byte b = 20;
double c = a + b;
}
}
ava基本数据类型就8种,除了这些都是引用型的了。
java四类八种基本数据类型:
第一类:整型 byte short int long
第二类:浮点型 float double
第三类:逻辑型 boolean(它只有两个值可取true false)
第四类:字符型 char
在栈中可以直接分配内存的数据是基本数据类型。
引用数据类型:
是数据的引用在栈中,但是他的对象在堆中。
字节:
boolean 布尔型 1/8
byte 字节类型 1
char 字符型 2 一个字符能存储一个中文汉字
short 短整型 2
int 整数类型 4
float 浮点类型(单精度) 4
long 长整形 8
double 双精度类型(双精度) 8
八大基本数据类型占用内存大小排序:
boolean < byte < char <= short < int <= float < long <= double
强制转换
把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量
使用强制类型转换时,可能会失去精度,所以在进行强制类型转换之前,一定要注意转换后的值是否与转换前一致。
在Java中,默认小数的类型为double,如果要将小数定义为float,就必须通过下面的两种方法将其转化为float类型,否则编译无法通过。
float f = 3.1f;
float f = (float)3.1;
- 格式: 目标数据类型 变量名 = (目标数据类型) 值或者变量;
- 范例: int k = (int)88.88;
注意: 强制类型转换,有可能会发生精度损失
精度损失: 简单理解,将容积为8升的容器中的水,倒入容积为4升的容器中,如果水超出了4升,就洒了。
package test;
/*
* 强制转换:把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量
* 简答理解:大的给小的,不能直接给,需要强转
* 格式:目标数据类型 变量名 = (目标数据类型)值或者变量;
* */
public class code03 {
public static void main(String[] args) {
int a = 10; //int 4个字节
byte b = (byte)a; //byte 1个字节 错误:不兼容的类型:从Int转换到byte可能会有损失精度
System.out.println(b);
double num1 = 12.9;
int num2 = (int)num1;
System.out.println(num2);
}
}
类型转换案例
- 请判断下列代码是否存在问题,如果有,请指出并修正
package test;
/*
* 强制转换:把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量
* 简答理解:大的给小的,不能直接给,需要强转
* 格式:目标数据类型 变量名 = (目标数据类型)值或者变量;
* */
public class code03 {
public static void main(String[] args) {
byte a = 3;
byte b = 4;
/*
* 前置知识点铺垫:
* 隐式转换:当小的数据类型和大的数据类型在一起运算的时候,小的会先提升大的之后,在进行运算
* 特殊关注: type short char 在运算的时候,都会直接提升为int,然后再进行运算
* 错误原因:
* type c = a + b;
* 这里的a和b是两个type类型,他们在运算之前会将自己提升为int型,然后再进行运算
* 两个int相加,结果还是int,相要把一个int类型的结果,赋值给byte类型的变量
* 大的给小的,不能直接给
* 非要给的话,就需要强制类型转换
* 解决方案:
* 首先让a和b进行相加,使用()提升算数优先级
* 再对相加的结果整体进行转换
* */
byte c = (byte) (a + b);
byte d = 3 + 4;
}
}
package test;
/*
* 请找出下列代码的错误,指出原因并解决
* 担心的问题:
* 3 和 4是两个常量,整数常量默认的数据类型是int
* 这里两个int相加,结果还是int,int给byte赋值。
* emmm。。。应该需要强转把
* JAVA 存在常量优化机制:
* byte d = 3 + 4
* 这里的3和4是两个常量,java存在常量优化机制,会在编译的时候就会让3和4进行相加,然后会自动判断7是否再byte的取值范围内
* 不在范围内: 编译出错
* 在范围内: 通过编译
* */
public class code03 {
public static void main(String[] args) {
byte d = 2 + 4;
System.out.println(d);
long num = 123343454523423L;
}
}
问题疑问: byte d 3 + 4;为什么不会出现错误?
public class code03 {
public static void main(String[] args) {
byte d = 3 + 4;
}
}
因为3和4,是两个常量,java中存在[常量优化机制]
常量优化机制:在编译时(java), 就会将3和4计算出一个7的结果,并且会自动判断该结果是否在byte取值范围内
在:编译通过
不在: 编译失败
参考链接
https://blog.csdn.net/u011983531/article/details/49226265