黑马程序员技术交流社区

标题: 新手求解??? [打印本页]

作者: 王海旺    时间: 2013-7-14 19:58
标题: 新手求解???
本帖最后由 杨兴庭 于 2013-7-15 17:51 编辑

下面两行代码可以编译,为什么会导致运行时错误?求解啊 。。。
Number [] numberArray = new Integer[2];
numberArray[0] = new Double (1.5);

作者: 月亮人生    时间: 2013-7-14 20:14
因为编译期间编译器只知道numberArray是Number类型,不知道它指向什么对象,所以只要符合语法,就可以编译。而运行期,因为numberArray指向的是Integer对象,强行转换就相当于把Integer对象转为Double,因为这是两种不同的类型,所以转换失败。
作者: 月亮人生    时间: 2013-7-14 20:15
因为编译期间编译器只知道numberArray是Number类型,不知道它指向什么对象,所以只要符合语法,就可以编译。而运行期,因为numberArray指向的是Integer对象,强行转换就相当于把Integer对象转为Double,因为这是两种不同的类型,所以转换失败。
作者: iBadboy    时间: 2013-7-14 20:21
因为编译期间编译器只知道numberArray是Number类型,不知道它指向什么对象,所以只要符合语法,就可以编译。numberArray 实际上是Integer类型,它不能强制转换成Double类型,它们彼此之间不是父子关系。PS:我也是新手,之前看到网上的解释,共勉。谢谢
作者: 禾呈    时间: 2013-7-14 20:32
编译时期看左边,编译器认为 数组numberArray是Number 类型,所以 数组中可以存储 Number类型或其子类型的数据 所以编译器认为数组可以存储 Double 类型没有错

运行时期看右边,运行期认为 numberArray 为Integer 类型,所以不可以存储Double 类型
作者: 诸隆隆    时间: 2013-7-14 22:26
编译器其实只看语法的,语法合理就过了。至于类型合不合适都是看运行,1.5是double类数据,而数组是integer类的,编译器可以强迫转型,但运行结果发觉类型不合适,就只能抛异常了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2