隐式类型转换和强制类型转换

隐式类型转换

  • 把一个取值范围小的数值或者变量,赋值给另一个取值范围大的变量,也就是精度低的类型赋值给精度高的类型,这种情况不可能导致精度丢失,所以这种类型转换是隐式的或者说是自动的。
  • 这一过程也叫向上转型
  • 还有一种特殊情况是byte类型的变量,因为这个类型的变量本身范围就较小,所以一旦进行运算就是自动转型为int类型。
java 复制代码
// 阅读代码, 分析是否存在错误, 如果有请说明原因并改正.
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2

这段代码运行是会报错的

java 复制代码
package com.itheima.test;

public class TypeChangeTest {
    /*
        阅读代码, 分析是否存在错误, 如果有请说明原因并改正.

        byte b1 = 3;
        byte b2 = 4;
        byte b3 = b1 + b2;

        原因: b1和b2是两个byte类型的数据, 相加的时候会直接提升为int, 提升之后就是两个int相加
                结果还是int这里将int类型的结果, 赋值给byte类型的变量
                属于大的给小的赋值, 不能直接赋值, 需要强转, 或者改变类型.

        改正:
                1. byte b3 = (byte)(b1 + b2);
                2. int b3 = b1 + b2;

        byte b = 3 + 4;

        回答: 这句代码不会出现错误, Java存在字面量优化机制, 在编译的时候(javac)就会完成运算
                字节码文件: byte b = 7;
     */
    public static void main(String[] args) {
        byte b = 3 + 4;
        System.out.println(b);
    }
}
  • 当然我们如果将强制类型转换的结果赋给一个精度较低的类型,也会被隐式类型转换,此时是从低精度转为高精度又转为低精度
java 复制代码
int a = 10;
double b = 12.3;
a += b;
System.out.println(a);//输出为22

强制类型转换

  • 强制类型转换一般用于高精度类型向低精度类型转换,但这很容易导致精度丢失,在开发中要尽量少用
  • 在变量的前面使用括号可以进行强制类型转换
java 复制代码
int a = (int)2.5;   //2
int c = (double)3   // 3.0
  • 在编写代码中如果要对算术运算的式子的结果进行强制类型转换,记得加括号
java 复制代码
int result1 = (int)7/2.5;  //这样写会报错,java会很疑惑强制类型转换是给整数7的还是给式子7/2.5的
//报错信息如下
// 需要的类型:
//int
//提供的类型:
//double
//我们给代码添加上括号  
int result1 = (int)(7/2.5);  //result1 = 2
相关推荐
毕设源码_郑学姐几秒前
计算机毕业设计springboot网络相册设计与实现 基于Spring Boot框架的在线相册管理系统开发与应用 Spring Boot驱动的网络影集设计与实践
spring boot·后端·课程设计
辣机小司1 分钟前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录
码农阿豪4 分钟前
从零到一:Spring Boot快速接入金仓数据库实战
数据库·spring boot·后端
追逐时光者9 分钟前
一个基于 .NET 与 Avalonia 构建、面向 TrinityCore 的开源 WoW 数据库编辑器
后端·.net
追逐时光者1 小时前
精选 5 款基于 .NET 开源免费、功能强大的 Windows 系统优化工具
后端·.net
星越华夏1 小时前
ESP32-CAM图像传输项目说明文档
java·后端·struts·esp32
JustHappy3 小时前
古法编程秘籍(六):程序到底是怎么跑起来的?从 IO 到中断,一次讲明白
前端·后端·全栈
晨曦中的暮雨3 小时前
Golang速通(Javaer版)
java·开发语言·后端·golang
小村儿4 小时前
连载13- 内部Tools,Claude Code 怎么真正"动"你的代码
前端·后端·ai编程
IT_陈寒4 小时前
Python的线程池把我坑惨了,原来异步不是万能的
前端·人工智能·后端