gpt4 book ai didi

java - Java 数组中的 ArrayStoreException

转载 作者:搜寻专家 更新时间:2023-11-01 02:45:09 28 4
gpt4 key购买 nike

这是Core Java一书中的例子

两类员工和经理。经理扩展员工。下面的代码

Manager[] mans ={new Manager("Adam"),new Manager("Ben")};              
Employee[] emps =mans ;
emps[0] = new Employee ("Charlie");//throws ArrayStoreException in runtime actually;

作者说在这种情况下数组中的元素应该保持相同的类型否则它会抛出ArrayStoreException。在我看来,emps[0] 只是对实例 'new Employee ("Charlie")' 的引用,而 emps[0] 的类型是之前声明的 Employee。那么为什么它会抛出异常。我的基础知识有问题吗?

最佳答案

创建数组时,它会记住要存储的数据类型。所以如果你有课

class Employee { .. }
class Manager extends Employee { .. }

然后你将创建数组

Manager[] arrM = new Manager[10];

数组会记住它只需要存储 Manager 类或其派生类型的实例。但是这样的数组不能存储 super 类型的管理器,因为 super 类型可能没有管理器类的所有方法或字段,所以像

arrM[0] = new Manager();

没问题,但是

arrM[0] = new Employee();

抛出 java.lang.ArrayStoreException: Employee 指出 Employee 在这里不是正确的参数。

所以在你的情况下你是

  • 为经理创建数组

    Manager[] mans ={new Manager("Adam"),new Manager("Ben")};
  • 使用父类(super class)型 Employee 创建对此数组的引用

    Employee[] emps =mans;

    (但这个引用仍然指向可以容纳仅管理人员的数组)

  • 并尝试放入数组new Employee

    emps[0] = new Employee("Charlie");

但正如我所提到的,这是不允许的,因为 Employee 可能没有与 Manager 相同的成员。假设 Menager 可以hire(...) 某人,而 Employee 不能(没有此方法)。如果你打电话会发生什么

    mans[0].hire(new Employee("Tom");

emps[0] = new Employee ("Charlie"); 不会抛出异常但会让您将 Employee 放在 emps[0] 中?由于 mansemps 使用相同的数组,这意味着 mans[0].hire(new Employee("Tom") 将被调用来自 Employee("Charlie") 不能雇佣任何人,因为 Employee 没有 hire 方法。

这就是为什么您不能将父类(super class)型 (Employee) 的实例放在 Managers 数组中的原因。

关于java - Java 数组中的 ArrayStoreException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24207155/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com