2 lwfhunter lwfhunter 于 2014.06.13 17:11 提问

java核心技术中一个关于数组的例子不理解,请教大家

Person是Employer的父类,Employer有个新方法setBonus,代码如下

Employer[] emprs ={new Employer("张三"),new Employer("李四")};              
Person[] ps =emprs;   
ps[0] = new Person("小明");//运行时该行报错ArrayStoreException
emprs[0].setBonus(2000);

书中给出的解释是要保持数组中的元素对象类型一致,
我不理解的是ps定义的元素的类型是Person,为什么在这里不能ps[0] = new Person("小明"),ps[0]不是只是对new Person("小明")的一个引用吗?他又不是Employer类型,我去给它赋值为Person类型有什么不可?

另外以上代码如果不用数组的形式,就是两个对象这么操作下,是没有错误的。

可能我以上的理解本身有错误,请大家指教指正。

3个回答

webMaster2014
webMaster2014   2014.06.15 12:22
已采纳

有错别字,重新说一次:

emprs[0]和 ps[0]这两个引用都指向了Employer对象,现在你要把ps[0]指向的对象换成person对象,emprs[0]也会同时修改为指向该对象。而emprs[0]是Emloyer对象,这就成了“子类的引用执行父类对象”,这是不可以的。所以报错。

feiyun0112
feiyun0112   Rxr 2014.06.13 17:33

你试试
Person[] emprs ={new Employer("张三"),new Employer("李四")};

feiyun0112
feiyun0112 你同时要记住ps引用的是emprs ,他不能指向new Person("小明")
3 年多之前 回复
lwfhunter
lwfhunter ls朋友,这样写父类转子类,确实是不行的,编译时就报错了。我提出的问题中,我不理解的是,ps[0]只是对象的引用(有种说法叫句柄不知道对不对),那么为什么它不能指向new Person("小明")。是不是我的基础概念有问题
3 年多之前 回复
feiyun0112
feiyun0112 emprs、ps指向同一地址,您可以理解为,不能 Employer[] emprs ={new Person("小明")};
3 年多之前 回复
lwfhunter
lwfhunter 这个正常,我认为可以解释为因为emprs、ps类型一致
3 年多之前 回复
webMaster2014
webMaster2014   2014.06.15 12:20

emprs[0] 和 ps[0]这两个引用都指向的是 Employer对象,现在你要把ps[0]指向的对象皇城person对象,那么emprs[0]也会执行这个对象,而emprs[0]是Emloyer对象,这就成了“子类的引用执行父类对象”,这是不可以的。所以报错。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!