Class类型信息之类型转换前检查

在java类型转换的时候经常会遇到类型转换。例如Circle是Shape的子类(Circle extends Shape)。那么Circle的对象转换成Shape的对象则是向上转换。那么Shape类型向Circle类型转换则为向下转换。

a, 在java中类型转换中 向上类型转换是可以被接受的。拿上面的例子中来说,由于编译器知道Circle肯定是一个Shape,所以编译器允许自由的做向上类型的赋值操作 。所以红字中即使你把显示的类型转换去掉也没有关系
以下是一个简单的demo RedToy是Toy的子类。
RedToy redToy = new RedToy();
System. out .println( "redToy is " + redToy);
Toy toy = new Toy();
System. out .println( "toy1 is " + toy);
toy = (Toy) redToy; // toy = redToy;
System. out .println( "toy is " + toy);
toy.writes();
打印日志如下:

我们可以根据HashCode来看出 当进行向上类型转换的时候。只是将父类的对象的哈希码变成了子类对象的哈希码而已。这也是多态的体现。父类对象指向子类对象的地址
而向下类型转换中还是拿Circle和Shape举例子。你要把Shape变成Circle类型的话, 由于编译期间只会知道Circle对象是一个Shape。而不知道它是Circle还是Square。所以不使用显式的类型转换,编译器就不允许执行向下赋值。
Toy toy = new Toy();
System. out .println( "toy1 is " + toy);
redToy = (RedToy) toy;
// error
Toy toy1 = new RedToy();
System. out .println( "toy2 is " + toy1);
redToy = (RedToy) toy1;
// success

在上面两端代码中第一段出现错误。第二段是可以运行的。根据打印结果第一个toy指向的是Toy的对象的哈希码。第二个toy1 指向的是RedToy对象的哈希码。之所以 第二个可以成功是因为toy1本身指向的就是RedToy对象

所以得出结论: -> 在向下进行类型转换的时候要么进行异常的处理 要么使用instanceof函数判断是否改类对象指向你所需要转换的那个对象。 (可以转型的情况为先把子类转父类,向下转型时候确定父类能不能转回为之前的子类)
Toy toy = new Toy();
System. out .println( "toy1 is " + toy);
if (toy instanceof RedToy) {
redToy = (RedToy) toy;
}
Toy toy1 = new RedToy();
System. out .println( "toy2 is " + toy1);
if (toy1 instanceof RedToy) {
redToy = (RedToy) toy1;
}
所以instanceof和Class对象的isInstance()方法一样,判断的是你是这个类吗?或者你是这个类的派生类不。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值