CodeGym /课程 /Java 语法 /引用类型转换

引用类型转换

Java 语法
第 10 级 , 课程 6
可用
引用类型转换 - 1

“现在,迭戈来给我们上一小节课。尽量简明扼要。主题是关于引用类型转换。”

“让我们从 Object 变量开始。你可以将任何引用类型赋给此类变量(拓宽转换)。但是,要在另一个方向上进行赋值(窄化转换),则必须显式指示强制转换操作:”

代码 说明
String s = "妈妈";
Object o = s; // o 存储一个 String
典型的拓宽引用转换
Object o = "妈妈"; // o 存储一个 String
String s2 = (String) o;
典型的窄化引用转换
Integer i = 123; // o 存储一个 Integer
    Object o = i;
拓宽转换。
Object o = 123; // o 存储一个 Integer
String s2 = (String) o;
运行时错误!
你不得将 Integer 引用转换为 String 引用。
Object o = 123; // o 存储一个 Integer
Float s2 = (Float) o;
运行时错误!
你不得将 Integer 引用转换为 Float 引用。
Object o = 123f; // o 存储一个 Float
Float s2 = (Float) o;
转换为相同类型。窄化引用转换。

“拓宽或窄化引用转换一丝丝都不会改变对象。窄化(或拓宽)部分具体是指赋值操作包括(不包括)变量及其新值的类型检查。”

“让我看一个一目了然的例子,虽然这种例子很少见。”

“为了避开这些示例中的错误,我们必须找出 Object 变量引用何种类型:

代码
int i = 5;
float f = 444.23f;
String s = "17";
Objecto = f;                       // o 存储一个 Float

if (o instanceof  Integer)
{
    Integer i2 = (Integer) o;
}
else if (o instanceof Float)
{
    Float f2 = (Float) o;            // 这个 if 块将被执行
}
else if (o instanceof String)
{
    String s2 = (String) o;
}

“除非你百分百确定对象的类型,否则应在每次拓宽转换之前执行此检查。”

“明白了。”

评论 (8)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Harry Levis 级别 11,Aruba,Aruba
15 四月 2025
拓宽或窄化引用转换会改变编译时类型,但一丝丝都不会改变对象的运行时类型(实际的类型)。
二号白菜 级别 12,Jinan,China
21 十月 2022
可以将object变量比喻成一个箱子。箱子里可以装很多物品,可以是int类型,float类型,byte类型等等。 Object o = 12.3f; 要正确说明要取出的物品的类型(以Float f 为例)。箱子才可以打开,把箱子里的物品拿出来,不报错。 Float f = o;
TaoLu 级别 20,泾县,China
10 三月 2021
identity conversion 身份(类型)转换 narrowing reference conversion 窄化引用转换,即向上转型 widening reference conversion 拓宽引用转换,即向下转型 primitive 基本类型 reference 引用类型 boxing 装箱 unboxing 拆箱
hj@coder 级别 13
3 一月 2021
说反了
rojack 级别 16,Chongqing,China
21 七月 2020
也就是说引用类型的转换一定要和变量类型相同 但是为什么将任何引用类型赋给Object类变量属于窄化转换?object类不是涵盖最大的对象类型吗,其他类型转换为object应该是拓宽吧
AKA 级别 18,Jieyang,China
23 七月 2020
我也觉得
Michael.Rabbit 级别 20,Bonn,Germany
8 二月 2021
Object是所有类的父类。打个比方,就像Animal是Dog的父类,dog转换成Animal就可能造成信息丢失。所以是窄化了
null 级别 10,Wuhan
16 七月 2021
我觉得是因为Object类型转换成其他类型时发生了拓宽转化,例如Object o=123;其实o已经转换成了int 类型,但是由于是拓宽转化所以是隐式的,那么再String s=(String) o就会报错吧