问题提出:
有两个类Manager和Employee具有继承关系 Class Manager extends Employee (setBonus是Manager特有方法)。当Manager[] 数组向上转型成Employee[] 数组的时候,很容易出现下面一个陷阱:
//创建一个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; 上
这种数组的引用向上转型是十分危险,employees和managers引用的是同一个数组,employees[i]和managers[i]指向的是相同的内存区域。如果此时 employees[0]=new Employee(...);就使得managers[0]指向了一个刚创建的Employee实际对象。而managers[0]是Manager类型的。糟糕了,子类类型引用了一个父类类型对象。而且巧妙的逃过了编译器的语法检查。这样的结果导致 managers[0].setBonus(...); 看视完全合理(编译器也这么认为),但事实上 managers[0]的实际指向的对象确实Employee的,当然就没有setBonus()方法了,一运行就出异常了。
说白了,通过将整个数组的引用向上转型,轻而易举的使得Manager m=new Employee();这句绝对错误的程序逃过了编译器的眼睛。这太让人糟糕了。
解决办法:
作为一个程序员,运行阶段出现问题是再糟糕不过的事情了。如何避免这个让人很难发现的诡秘错误那。
记住一条:使用数组的时候,所有的数组必须牢记创建他们元素的实际类型,并负责监督仅将类型兼容的引用存储到数组中。就如上面的:new Manager[10]创建的数组是一个经理数组。千万要避免使得Manger数组元素引用指向一个Employee类型的对象。
分享到:
相关推荐
C语言解惑,初学者必备宝典 !
数组的本质则是一系列的变量。 2、数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来...
C语言解惑—指针、数组、函数和多文件编程
创新性地从“错误”的角度出发进行讲授,通过对比程序的对错、程序的好坏,使读者具备编制高质量程序的能力从对比程序的对错到对比程序的质量,循序渐进地引领读者成为编程高手。
再再论指针,解惑指针,解惑数组。
java解惑java解惑java解惑java解惑java解惑java解惑
Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑
行业-城投解惑系列之十二-城投转型,从建设者到运营者.rar
解惑SQL
Java解惑.pdf Java解惑.pdf Java解惑.pdf Java解惑.pdf
SQL解惑(第2版)
也许有人看过java解惑,即通过讲述一个案例,解释一个java特性抑或一个容易遇到的小陷阱。SQL解惑与其相同,通过小小案例解析、阐述SQL各个特性,比刻板而唠叨的教科书更小巧、便捷,焕然一新。
《Java解惑》《Java解惑》《Java解惑》《Java解惑》《Java解惑》《Java解惑》
JAVA解惑.pdf JAVA解惑.pdf JAVA解惑.pdf
Java解惑中文版 Java解惑 java健壮程序
讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java程序员阅读。
该书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短...在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向读者展示了如何一劳永逸地避免底层的陷阱与缺陷。
在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向读者展示了如何一劳永逸地避免底层的陷阱与缺陷。. 本书趣味十足、寓教于乐,适合于具备Java知识的学习者和有编程经验的Java...