锁定老帖子 主题:【解惑】数组向上转型的陷阱
精华帖 (0) :: 良好帖 (12) :: 新手帖 (12) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-03
最后修改:2010-06-21
问题提出:
//创建一个Manager数组 Manager[] managers=new Manager[10]; //Ok,完全合法,因为任何managers[i]对象都是一个Manager类型,自然也是Employee类型 Employee[] employees=managers; //Ok,完全合法,因为employees[i]声明成Employee类,完全可以引用一个Employee对象。 employees[0]=new Employee(...); //Ok,完全合法,因为managers[i]一开始声明的时候就是Manager类型, managers[0].setBonus(...); 上面的程序编译器完全可以通过,但是一运行就出现了异常:java.lang.ArrayStoreException。这是为什么呢?
陷阱就开始于第二句: Employee[] employees=managers; 上 说白了,通过将整个数组的引用向上转型,轻而易举的使得Manager m=new Employee();这句绝对错误的程序逃过了编译器的眼睛。这太让人糟糕了。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-11-03
基本语法吧
|
|
返回顶楼 | |
发表时间:2009-11-03
确实很基础的问题,如果你写一个句Manager m=new Employee(); 编译器绝对通过不了。但是通过数组转型,实际上就使得Manager m=new Employee(),而且编译器竟然通过了。
|
|
返回顶楼 | |
发表时间:2009-11-03
恩不错啊。。喊我想个让Manager m=new Employee()骗过编译器的方法,估计想不出来。。。
|
|
返回顶楼 | |
发表时间:2009-11-05
也就是说,通过数组“偷天换日”,逃过了编译器的“法眼”。
|
|
返回顶楼 | |
发表时间:2009-11-05
最后修改:2009-11-05
patrickyao1988 写道 恩不错啊。。喊我想个让Manager m=new Employee()骗过编译器的方法,估计想不出来。。。
Object o = new Employee(); Manager m = (Manager)o; 也是编译不报错,运行报错 数组写入和这个机制一样,只是这个类型检查,虚拟机依据的是数组的实际类型,而不是声明的类型 Employee e = new Employee(); Employee[] es = new Manager[1]; es[0] = e; // 虚拟机中是 es[0] = (Manager)e |
|
返回顶楼 | |
发表时间:2009-11-05
最后修改:2009-11-05
重复了...
|
|
返回顶楼 | |
浏览 3031 次