[转]java提高篇(十一)-----强制类型转换

news/2024/7/6 6:31:45

 在java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换。

      在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换。因为子类拥有比父类更多的属性、更强的功能,所以父类转换为子类需要强制。那么,是不是只要是父类转换为子类就会成功呢?其实不然,他们之间的强制类型转换是有条件的。

      当我们用一个类型的构造器构造出一个对象时,这个对象的类型就已经确定的,也就说它的本质是不会再发生变化了。在Java中我们可以通过继承、向上转型的关系使用父类类型来引用它,这个时候我们是使用功能较弱的类型引用功能较强的对象,这是可行的。但是将功能较弱的类型强制转功能较强的对象时,就不一定可以行了。

      举个例子来说明。比如系统中存在Father、Son两个对象。首先我们先构造一个Son对象,然后用一个Father类型变量引用它:

      Father father = new Son();

      在这里Son 对象实例被向上转型为father了,但是请注意这个Son对象实例在内存中的本质还是Son类型的,只不过它的能力临时被消弱了而已,如果我们想变强怎么办?将其对象类型还原!

      Son son = (Son)father;

      这条语句是可行的,其实father引用仍然是Father类型的,只不过是将它的能力加强了,将其加强后转交给son引用了,Son对象实例在son的变量的引用下,恢复真身,可以使用全部功能了。

      前面提到父类强制转换成子类并不是总是成功,那么在什么情况下它会失效呢?  

      当引用类型的真实身份是父类本身的类型时,强制类型转换就会产生错误。例如:

      Father father = new  Father();

      Son son = (Son) father;

      这个系统会抛出ClassCastException异常信息。

   所以编译器在编译时只会检查类型之间是否存在继承关系,有则通过;而在运行时就会检查它的真实类型,是则通过,否则抛出ClassCastException异常。

    所以在继承中,子类可以自动转型为父类,但是父类强制转换为子类时只有当引用类型真正的身份为子类时才会强制转换成功,否则失败。

 

原文链接:http://www.cnblogs.com/chenssy/p/3393160.html

 

转载于:https://www.cnblogs.com/ryq2014/p/6639645.html


http://www.niftyadmin.cn/n/4611451.html

相关文章

NodeJS-express框架搭建

首先新建一个文件夹C:\test在该文件夹打开cmd安装express模块,npm install express 再运行npm init初始化项目这时候的目录是test{node_modules,package-lock.json,package.json} 在test目录下创建文件app.js 在test目录下创建文件夹route 在route文件夹下创建文件u…

express静态资源配置

目录如下 创建views.js const router require(express).Router(); const fs require(fs); const { resolve } require(path); router.get(/index.html, (req, res) > {// 这里设置utt-8否则返回的buffer数据格式,会自动下载fs.readFile(resolve(./)/views/in…

说一说我理解的css

什么是CSS 从字面上来理解,css的全称是Cascading Style Sheets,翻译成为中文,就是层叠样式表,为啥子要叫作这个名字? 先来看看这个层字:从字面意义上来理解,就是一层一层的意思 我们一般都是怎么…

vue封装数字键盘

先看效果图 组件XKeyboard.vue <template><div id"XKeyBoard" style"display:none;" :style"{width: widthvw,height: heightvw,left:leftpx,top:toppx}" ref"XKeyBoard"><div class"x-top"><div cli…

spring中使用spring mvc jdbc操作数据库

为什么80%的码农都做不了架构师&#xff1f;>>> 初次接触Java Spring MVC, 正准备选个适合自己的orm用, Hibernate我感觉还是有点复杂, Mybatis一样如此. 这是我最后确定的orm, spring自带的jdbc, 蛮适合我! 先看下我的配置 web.xml <?xml version"1.0&qu…

MulterError: Unexpected field

今天上传多文件时报了个错MulterError: Unexpected field 这里代码反复检查没有出错 const express require(express); const router express.Router(); const path require(path);/** 文件接收器**/ const multer require(multer); const { log } require(console); //…

如何在ASP.NET Core中使用Redis

注&#xff1a;本文提到的代码示例下载地址> https://code.msdn.microsoft.com/How-to-use-Redis-in-ASPNET-0d826418 Redis 是一个开源的内存中的数据结构存储系统&#xff0c;可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构&#xff1a;字符串&#xff0c;哈…

node请求页面时自动下载

问题如下&#xff0c;这里浏览器访问接口会直接下载 const router require(express).Router(); const fs require(fs);router.get(/index.html,(req,res)>{fs.readFile(./views/cookie.html,utf8,(err,data)>{if(err) res.send(error);else res.send(data);}); }); mo…