引用类型间的类型转换

引用类型间的转换有自动类型转换和强制类型转换两种。对于类引用类型,只有具有继承关系的类,即父类与子类之间,才可以进行类型的转换。
[b]当引用了某个子类的变量对引用该子类的父类的变量赋值时,会自动进行类型的转换;反之,父类对子类进行赋值时则需要进行强制类型转换。[/b]
例如,A为父类,B、C分别继承自类A,分别定义引用这3个类的变量,然后进行各种赋值操作。
定义引用变量:

Object obj = new Object();
A objA = new A();
B objB = new B();
C objC = new C();

● 子类对父类进行赋值:

obj = objA; //编译成功,将类A赋给直接父类Object,会自动进行类型转换
obj = objB; //编译成功,将子类B赋给间接父类Object,会自动进行类型转换
objA = objC; //编译成功,将子类C赋给直接父类A,会自动进行类型转换

● 父类对子类进行赋值:

objA = obj; //编译出错,将父类Object赋给直接子类A时,需要强制类型转换
objA = (A)obj; //编译成功
objB = obj; //编译出错,将父类Object赋给间接子类B时,需要强制类型转换
objB = (B)obj ; //编译成功
objC = objA; //编译出错,将父类A赋给直接子类C时,需要强制类型转换
objC = (C)objA; //编译成功

● 两个子类间的赋值:
如果两个不同的子类继承自同一个父类,那么这两个子类之间也不能进行类型转换,因为它们之间没有直接或间接的继承关系。

objB = objC; //编译出错,不能从C类型自动转换为B类型
objB = (B)objC; //编译出错,不能从C类型强制转换为B类型

● 如果声明了一个父类型的变量,但使其引用子类对象,在编译时,java编译器是根据变量被显示声明的类型去编译,因此该变量的类型被看作父类类型。然后将其进行强制类型转换并[b]赋给[/b]引用了另一个子类对象的变量时编译成功,但运行时将抛出java.lang.ClassCastException异常,因为[b]这个变量实际引用的是子类对象[/b],两个子类属于不同的类型,也没有继承关系,所以不能将一个子类强制转换为另一个子类。

A objAA = new C(); //objAA变量被显示声明为A类型
objB = (B)objAA; //编译时,objAA的类型被视为A类型,所以编译成功
//但运行时抛出java.lang.ClassCastException异常


对于引用类型中的数组引用类型,任何两个不同类型的数组之间不能进行类型的转换,但可以将数组转换为java.lang.Object类。
例如:

Object objArray = new Object();
int num_I[] = {1,2,3};
long num_L[] = {4,5,6};
num_I = num_L; //编译出错,数组引用类型间不能自动进行类型转换
num_I = (int [])num_L; //编译出错,数组引用类型间不能进行强制类型转换
objArray = num_I; //编译成功
objArray = num_L; //编译成功
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值