java的向下转型_Java 向上/向下转型浅析

基于java的继承,向上或者向下转型是一种常见的情景,在thinking in java对这一情况进行了详细说明,见以下例子:

class Useful {

public void f() {}

public void g() {}

}

class MoreUseful extends Useful {

public void f() {}

public void g() {}

public void u() {}

public void v() {}

public void w() {}

}

public class RTTI {

public static void main(String[] args) {

Useful[] x = {

new Useful(),

new MoreUseful()

};

x[0].f();

x[1].g();

// Compile time: method not found in Useful:

//! x[1].u();

((MoreUseful)x[1]).u(); // Downcast/RTTI

((MoreUseful)x[0]).u(); // Exception thrown

}

}

在以上例子内,x[0],x[1]在对象实例化时,均向上转型,但是其子类是不一样的。因此在进行向下转型时,调用原本不存在的方法,则会报错,见下面第二行代码:

((MoreUseful)x[1]).u(); // Downcast/RTTI ((MoreUseful)x[0]).u(); // Exception thrown

这个涉及到Run-Time Type Information(RTTI)概念。由于java在编译时很难确切知道一个类的实际类型,那么在代码运行期间,则会进行类型检查,若类型相符则正常运行,类型异常则抛出ClassCastException.

如果想知道一个类是否可以进行向下转型,可以使用instanceof方法进行判断,

return (x[1] instanceof Useful) ? 1 : 0;

结果返回1.

看了上面的例子,就可以大概了解转型这个概念。实际上,转型在日常开发中使用的很多,比如以下代码:

List stringList = new ArrayList<>();

其实这也是转型。由ArrayList向上转型为List,只不过平时写的太6了,没感觉到而已。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值