【2023,学点儿新Java-35】强制类型转换的执行时机、风险与安全 | 基本类型转换、引用类型转换

news2024/11/25 2:25:47

前情提要:

  • 【2023,学点儿新Java-34】基本数据类型变量 运算规则:自动类型提升、强制类型转换 | 为什么标识符的声明规则里要求不能数字开头?(通俗地讲解——让你豁然开朗!)
  • 【2023,学点儿新Java-33】字符型变量char | 布尔类型变量 boolean:true、false
  • 【2023,学点儿新Java-32】Java基础小练习:根据圆周率与半径求圆的面积 | 温度转换 | 计算矩形面积 | 判断奇偶数 | 年龄分类
  • 更多系列文章,可参阅本专栏或博主主页哦~

 
坚持和热爱,可填山海之远。

 

🎯作者主页: 追光者♂🔥

        

🌸个人简介:
 
💖[1] 计算机专业硕士研究生💖
 
🌟[2] 2022年度博客之星人工智能领域TOP4🌟
 
🏅[3] 阿里云社区特邀专家博主🏅
 
🏆[4] CSDN-人工智能领域优质创作者🏆
 
📝[5] 预期2023年10月份 · 准CSDN博客专家📝  
 

  • 无限进步,一起追光!!!

        

🍎感谢大家 点赞👍  收藏⭐   留言📝!!!

        

🌿在上一篇中简单介绍了一下java 基本数据类型变量 运算规则中的 强制类型转换的概念,本篇对此做一个简要的补充说明~ 针对强制类型转换中的几个注意要点:即 转换规则、执行时机以及风险与安全等。(此外针对 引用类型的 强制转换,给出了一个简单的实例,不要求初学者看懂哈~~)

🕝目录

  • 🍁java中的强制类型转换
    • 🍂1.1 补充说明
    • 🍂1.2 附:强制类型转换——引用
    • 🍂1.3 简单练习:能否编译成功?

🍁java中的强制类型转换

🍂1.1 补充说明

在Java中,强制类型转换(也称为类型转换 或 类型强制转换)是指将一个数据类型转换为另一个数据类型。

强制类型转换通常发生在两个类型之间具有父子关系的时候,即从一个较大的数据类型向一个较小的数据类型转换。强制类型转换需要使用圆括号和目标类型来表示。

强制类型转换的一般语法如下:

目标类型 变量名 = (目标类型) 表达式;

具体来说,强制类型转换有以下几个要点:

    1. 转换规则:只有当两个数据类型之间存在父子关系时,才能进行强制类型转换。
      • 基本类型:可以进行数值之间的转换(如int转换为short),但是可能会 导致数据溢出或精度丢失。
      • 引用类型:可以进行父类到子类的转换(向下转型),但是 可能会导致类型不兼容的异常(ClassCastException)。
    1. 执行时机:强制类型转换 是在编译时进行静态检查的。编译器会在进行类型转换时 检查目标类型 是否与源类型存在父子关系,如果不存在则会编译错误。
    1. 风险与安全:由于强制类型转换 可能导致数据丢失或异常,因此需要谨慎使用。在进行强制类型转换时,开发人员需要确保转换是安全的,并进行必要的类型检查和错误处理。

以下是一个较为复杂的示例,演示 强制类型转换的使用情况:

double x = 3.14;
int y = (int) x; // 强制将double类型转换为int类型

System.out.println("x = " + x); // 输出原始值 3.14
System.out.println("y = " + y); // 输出转换后的值 3

在上面的示例中,将一个double类型的变量x强制转换为int类型。由于double类型是一个更大的数据范围,将其转换为int类型会导致小数部分的丢失。在转换后,变量y将包含转换后的整数部分3。

需要注意的是,强制类型转换 可能会导致数据丢失或异常,因此在进行强制类型转换时应谨慎操作,并确保转换是安全的。

🍂1.2 附:强制类型转换——引用

下面是一个较为详细的示例代码,演示在Java中涉及引用类型的强制类型转换的情况:

// 定义一个父类Animal
class Animal {
    public void eat() {
        System.out.println("Animal is eating.");
    }
}

// 定义一个子类Dog,继承自Animal
class Dog extends Animal {
    public void bark() {
        System.out.println("Dog is barking.");
    }
}

// 定义一个子类Cat,继承自Animal
class Cat extends Animal {
    public void meow() {
        System.out.println("Cat is meowing.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();  // 创建一个Dog对象,并将其引用赋值给父类Animal类型的变量

        // 使用父类类型的引用,只能访问父类中定义的成员方法
        animal.eat();

        // 强制类型转换,将父类类型的引用转换为子类类型的引用
        Dog dog = (Dog) animal;

        // 使用子类类型的引用,可以访问子类中定义的特有方法
        dog.bark();

        // 将父类类型的引用转换为不相关的子类类型,会导致编译错误
        // Cat cat = (Cat) animal;  // 编译错误,在运行时会抛出ClassCastException异常
    }
}

注:本小节 不要求 初学者 看懂哈~

在上面的示例中,我们定义了一个父类 Animal,并分别定义了两个子类 DogCat,它们都继承自 Animal 类。在主方法中,我们首先创建一个 Dog 对象,并将其引用赋值给一个父类 Animal 类型的变量 animal。这是一个向上转型的操作,因为 Dog 是 Animal 的子类。由于引用类型的多态特性,我们可以通过父类类型的引用变量 调用父类 Animal 中定义的方法,即可以调用 eat() 方法。

接着,我们进行了类型转换,将父类类型的引用 animal 强制转换为子类 Dog 类型的引用 dog,这是一个向下转型的操作。使用子类类型的引用 dog,我们可以调用子类 Dog 中特有的方法 bark()。

需要注意的是,这里的强制类型转换是基于我们已经确保了 animal 引用实际指向的是一个 Dog 对象。如果我们将 animal 引用实际指向的是一个 Cat 对象,那么在进行向下转型时,会抛出 ClassCastException 异常,因为 Cat 和 Dog 之间没有直接的继承关系。

还要注意:在进行类型转换时,需要确保 引用实际 指向的对象的类型与目标类型一致或存在父子关系。否则,在编译时 会出现类型不兼容的错误,或者在运行时会抛出 ClassCastException 异常。因此,在进行强制类型转换时,需要谨慎操作,并进行必要的类型检查和错误处理。

🍂1.3 简单练习:能否编译成功?

/*
此VariableTest4.java用来测试强制类型转换

规则:
1. 如果需要将容量大的变量的类型转换为容量小的变量的类型,需要使用强制类型转换
2. 强制类型转换需要使用强转符:()。在()内指明要转换为的数据类型。
3. 强制类型转换过程中,可能导致精度损失。
*/
class VariableTest4 {
	public static void main(String[] args) {
		
		double d1 = 12;//自动类型提升
		
		//编译失败
		//int i1 = d1;

		int i2 = (int)d1;
		System.out.println(i2);


		long l1 = 123;
		//编译失败
		//short s1 = l1;
		short s2 = (short)l1;
		System.out.println(s2);


		//练习
		int i3 = 12;
		float f1 = i3;//自动类型提升
		System.out.println(f1); //12.0

		float f2 = (float)i3; //编译可以通过。只不过可以省略()而已。
		
		//精度损失的例子1:
		double d2 = 12.9;
		int i4 = (int)d2;
		System.out.println(i4);

		//精度损失的例子2:
		int i5 = 128;
		byte b1 = (byte)i5;
		System.out.println(b1); //-128


		//实际开发举例:
		byte b2 = 12;
		method(b2);

		long l2 = 12L;
		//编译不通过
		//method(l2);
		method((int)l2);
	}


	public static void method(int num){   //int num = b2;自动类型提升
		System.out.println("num = " + num);
	}
}

同样地,注释内容,大家可以自行打开测试,来看是否编译通过~

在这里插入图片描述

 


 

🍒 热门专栏推荐

  • 🥇Python&AI专栏:【Python从入门到人工智能】
  • 🥈前端专栏:【前端之梦~代码之美(H5+CSS3+JS.】
  • 🥉文献精读&项目专栏:【小小的项目 (实战+案例)】
  • 🍎C语言/C++专栏:【C语言、C++ 百宝书】(实例+解析)
  • 🍏Java系列(Java基础/进阶/Spring系列/Java软件设计模式等)
  • 🌞问题解决专栏:【工具、技巧、解决办法】
  • 📝 加入Community 一起追光:追光者♂社区

 

持续创作优质好文ing…✍✍✍

 

记得一键三连哦!!!

 

求关注!求点赞!求个收藏啦!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/752281.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式Linux开发实操(五):embedded linux嵌入式Linux开发

前言: embedded linux开发有个好处就是开源的,总的来说涉及五个部分: 1、工具链Toolchain:为目标设备创建代码需要的编译器和其他工具。其他一切都取决于工具链。 2、引导程序Bootloader:它初始化板并加载Linux kernal。 3、内核kernal:这是系统的core核心,管理系统…

ELK-日志服务【redis-配置使用】

目录 环境 【1】redis配置 【2】filebeat配置 【3】对接logstash配置 【4】验证 【5】安全配置:第一种:kibana-nginx访问控制 【6】第二种:在ES-主节点-配置TLS 【7】kibana配置密码 【8】logstash添加用户密码 环境 es-01,kibana 1…

一文详解什么是数据库分片

概要 应用程序正在变得越来越好,它拥有更多的功能、更多的活跃用户,并且每天都会收集更多的数据。但数据库现在导致应用程序的其余部分变慢。数据库分片可能是问题的答案,但许多人不知道它是什么,最重要的是何时使用它。在本文中我…

Android13 编译错误汇总

1. error: New setting keys are not allowed 一版是在Settings中添加了新的字段导致的 解决: 在你的字段上面加上SuppressLint("NoSettingsProvider") 继续编译应该会出现 按照提示 make api-stubs-docs-non-updatable-update-current-api 然后再…

领域驱动设计(四) - 战略设计 - 【2/2】核心域提取和模型能力设计

模型的复杂性必须通过重构和知识的消化才能把关键的领域、最有价值的部分(core domain)、优先级提取出来。让团队而把主要精力放在core domain上而不要为无关的细节分散注意力,这有益于: 帮助团队成员掌握系统的总体设计以便更好…

基于多场景的考虑虑热网网损的太阳能消纳能力评估研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

微信小程序使用字体图标——链接引入

目录 1.下载字体图标 1.选择需要的图标加入购物车添加到项目 2.查看项目 3.生成在线链接 4.复制生成的链接 等下放到iconfont.json中​编辑 2.引入链接 1.下载 2.生成iconfont.json文件 3. 在iconfont.json中 放入生成的链接 4.需要重新编译小程序之后在终端执行 5…

二维码识别 OCR 原理及如何应用于物流和仓储管理中

摘要 在传统的物流和仓储管理中,人工操作容易出现错误和低效率。然而,随着二维码技术的普及和二维码识别OCR接口的应用,物流和仓储管理实现了更高水平的自动化和智能化。通过扫描和解码二维码,物流和仓储管理系统可以实现货物跟踪…

yapi的部署和安装

安装Node.js环境 wget https://nodejs.org/dist/v14.15.4/node-v14.15.4-linux-x64.tar.xz 或者直接浏览器下载传输到服务器上。 https://nodejs.org/zh-cn/download/tar -xvf node-v14.15.4-linux-x64.tar.xz 太高版本不行,install会报错。16开头的。 配置环境…

使用cpolar内网穿透,将Tomcat网页发布到公共互联网

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器,不仅名字很有趣&#xff0…

前端JavaScript入门-day07

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 深入对象 创建对象三种方式 1. 利用对象字面量创建对象 2. 利用 new Object 创建对象 3. 利用构造函数创建对…

Java阶段五Day06

Java阶段五Day06 文章目录 Java阶段五Day06问题解析阶段性架构图 Dubbo组件远程调用RPC概括DubboDubbo调用案例调用业务选择和dubbo角色环境准备dubbo远程调用原理 问题解析 阶段性架构图 这个架构图,由于nacos的功能,可以实现服务治理(服务…

精确长延时电路/数字式长延时电路设计

精确长延时电路 该电路由CD4060组成定时器的时基电路,由电路产生的定时时基脉冲,通过内部分频器分频后输出时基信号。在通过外设的分频电路分频,取得所需要的定时控制时间。 一、电路工作原理 电路原理如图13 所示。 通电后,时…

MySQL在Centos 7环境安装

说明: 1.安装与卸载中,用户全部切换成为root,一旦安装,普通用户都能使用。 2.初期练习,mysql不进行用户管理,全部使用root进行,尽快适应mysql语句,后面学了用户管理,在考…

Unity UnityWebRequest使用http与web服务器通讯

一、搭建客户端与服务器http通讯 1.在Nodejs中文官网Node.js 中文网 (nodejs.com.cn),下载并安装Nodejs 2.在项目文件夹下新建WebServer文件夹,打开CMD窗口,在WebServer文件夹路径下安装express 3.在WebServer文件夹中新建main.js文件&#…

【UE4 塔防游戏系列】03-创建第一个敌人

步骤 1. 新建一个父类为“Chararcter”类,作为所有敌人的总类,命名为“TotalEnemyCategory” 以“TotalEnemyCategory”为父类创建子蓝图类,命名为“Enemy1” 2. 新建一个动画蓝图 选择目标骨骼为“Skeleton_Crossbowman_Skel” &#xff0c…

Stable Diffusion - After Detailer 插件 脸部和手部 重绘算法与应用

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131699857 After Detailer 是一个用于 Stable Diffusion Webui 的扩展插件,可以自动检测、遮盖和修复图片中的人脸、手部或全身&#…

Latex 合并单元格 (合并同列的两行不居中问题)

Excel转latex 即使设置了居中,在latex也会不居中 删除上面这个

音频播放器Web页面集成(基于HTML5)

音频播放器是云点播Web播放器的重要补充,主要应用于音频为主的业务场景,基于HTML5实现PC/移动端兼容,并深度融合了视频云业务,如支持加密播放等,为用户提供简单、快速、安全、稳定的播放服务。 基础功能 支持播放上传…

冒泡排序模拟实现qsort()函数

冒泡排序模拟实现qsort函数 前言1. 分析2. 解决一,如何接受不同数据3. 解决二,如何实现不同数据的比较4. 解决三,如何实现不同数据交换5. 模拟bubble_sort()函数排序整型所有代码实现6. 结构体排序实现7. 结尾 前言 要…