>[success] # java 类型转换
Java语言中基本数据类型之间的转换方式:`自动类型转换`和`强制类型转换`
* `自动类型转换:`主要指从小类型到大类型之间的转换,就是把一个取值范围小的数据或者变量,赋值给另一个取值范围大的变量。此时不需要我们额外写代码单独实现,是程序自动帮我们完成的
1. 取值范围小的,和取值范围大的进行运算,小的会先提升为大的,再进行运算(取值范围`byte short int long float double`)
![](https://img.kancloud.cn/93/a8/93a842cad7e0f630b41712d0451726a1_1097x201.png)
2. `byte、short、char`三种类型的数据在运算的时候,都会直接先提升为int,然后再进行运算
* `强制类型转换:`主要指从大类型到小类型之间的转换把一个取值范围大的数据或者变量赋值给另一个取值范围小的变量,语法格式如下:`目标类型 变量名 = (目标类型)源类型变量名`,不建议进行类型强制转换
>[danger] ##### 自动类型转换
~~~
public class TypeConversion {
public static void main(String[] args) {
byte b1 = 1; // 一个字节
short s1 = 127; // 两个字节
s1 = b1; // 两个字节接受一个字节
// b1 = s1; //一个字节到两个字节报错 错误: 不兼容的类型: 从short转换到byte可能会有损失
System.out.println(b1 + "," + s1);
double a = 10;
System.out.println(a); // 10.0 小类型像大类型转换
byte b = 100;
int c = b; // 可以赋值成功 因byte 小类型转换大类型int隐式转换,不需要我们额外写代码单独实现,是可以直接赋值
System.out.println(c); // 100
int d = 1;
long e = 100L;
long f = d + e;
System.out.println(f); // long 类型大于int 因此int转换为long,最终的结果其实就是两个long相加,那么最终的result是long类型的。
int g = 10;
long h = 100L;
double i = 20.2;
double j = g + h + i; // double 类型最大最后都会转换为double
byte k = 10;
byte k2 = 20;
int k3 = k + k2; // byte,short,char类型的变量在参与运算的时候,变量里面的值会直接先提升为int
}
}
~~~
>[danger] ##### 强制类型转换
```java
public class OperatorDemo2 {
public static void main(String[] args) {
double a = 12.3;
int b = (int) a;
System.out.println(b);//12
}
}
```
* **注意点:强制转换有可能会导致数据发生错误。(数据的精度丢失)**,以下面案例为例结果为 `-6,250`,过程
将`short` 强制转换为 byte 类型 变成了`-6`,转换过程首先1个字节等于8位二进制,250转换位short 类型的二进制位`1111 1010`因为short 是两个字节补位`0000 0000 1111 1010` 转换位byte 类型为一个字节从最低位开始算8位二进制`1111 1010`,要记住数字类型首位表示正负,此时`1` 为负数,转换十进制需要`1111 1010` 减1等到`1111 1001
` 在取反`0000 0110` 在转换十进制等于`6` 在添加符号因此`250` 转换byte 为`-6`
~~~
public class VarTest{
public static void main(String[] args){
byte b1 = 1; // 一个字节
short s1 = 250; // 两个字节
b1 = (byte)s1;
System.out.println(b1+","+s1); // -6,250
}
}
~~~
>[danger] ##### 编译器优化
* 当 `byte + int` 相加结果还是`int`类型, ` byte + byte \` 相加结果还是`int`类型 ,原因是因为`byte` 类型最大为`127` 往往相加之后很容易超过,因此自动升级为`int`
减法也是一样的,此时`a-b` 已经是int 类型
~~~
public class VarTest{
public static void main(String[] args){
char a = 1;
char b = 2;
b = b-a; // 错误: 不兼容的类型: 从int转换到char可能会有损失
}
}
~~~
- windows -- 环境变量
- Vscode -- 编写java
- 初始java
- java -- 关键字
- 编写第一个java程序
- java -- 注释
- 计算机存储 -- 进制
- java -- 类型
- java -- 变量
- 数字类型
- 布尔类型
- 字符类型
- 类型转换
- 双等比较是什么
- java -- 运算符
- 算数运算符
- 字符串拼接
- 关系/比较运算符
- 自增减运算符
- 逻辑运算符
- 三目运算
- 赋值运算符
- 移位运算符
- 位运算符
- 运算符优先级
- java -- 流程控制语句
- if /else if /if -- 判断
- switch case分支结构
- for -- 循环
- 用双重for循环
- while -- 循环
- do while -- 循环
- 案例练习
- java -- 数组
- 数组的存储
- 数组的增删改查
- 数组的特点
- 数组案例
- 二维数组
- 数组的工具方法
- java -- 方法
- java -- 方法的重载
- java -- 方法的调用流程
- java -- 类方法传参注意事项
- java -- 方法练习案例
- 对比 return break continue
- for each循环
- java -- 基础练习
- java -- 面向对象
- java -- 创建类和对象
- java -- 访问控制符
- java -- 类成员方法
- java -- 构造方法
- java -- this
- java -- 封装
- java -- 对象内存图
- java -- 创建对象案例
- java -- static
- java -- 继承
- super -- 关键字
- java -- 构造块和静态代码块
- java -- 重写
- java -- final
- java -- 多态
- java -- 抽象类
- java -- 接口
- 引用类型数据转换
- 综合案例
- java -- 内部类
- java -- 回调模式
- java -- 枚举类型
- java -- switch 使用枚举
- java -- 枚举方法使用
- java -- 枚举类实现接口
- java -- javaBean
- java -- package 包
- java -- import
- java -- 递归练习
- java -- 设计模式
- 单例模式
- java -- 注解
- java -- 元注解
- Java -- 核心类库
- java -- 处理字符串
- Java -- String
- String -- 常用方法
- String -- 正则
- Java -- StringBuilder 和 StringBuffer
- 知识点
- Java -- StringJoiner 字符串拼接
- 练习题
- 字符串的总结
- Java -- 包装类
- Integer
- Double
- Boolean
- Character
- java -- 集合类
- java -- util.Collection
- Iterator接口
- java -- util.List
- java -- ArrayList
- java -- util.Queue
- java -- util.Set
- java -- util.Map
- java -- util.Collections
- Java -- Math
- Java -- java.lang
- Java -- Object
- Java -- 获取当前时间戳
- Java -- 异常
- Java -- java.util
- java -- Date
- java -- Calender
- Java -- java.text
- Java -- SimpleDateFormat
- Java -- java.time
- Java -- java.io
- java -- io.File
- java -- 泛型
- IDEA -- 用法