从数组内部的类调用方法

时间:2013-02-07 00:44:06

标签: java arrays object methods

我有一个包含对象的数组。我如何在数组元素上使用方法?

我的数组是Object类型。我试过array[i].getSalary(),但这不起作用。

2 个答案:

答案 0 :(得分:4)

首先,您几乎不应该使用Object数组。原因是您丢失了所有类型信息:

  • 会让代码更容易理解代码的人(包括你的教授,你自己和你自己在六个月内忘记了代码的所有内容)
  • 编译器和IDE可以使用
  • 在测试程序之前告诉您何时出错。
  • 会避免我在本答复的第二部分向你解释的易犯错误的类型。

使用与将放入其中的对象类型(或公共基类)对应的类型的数组,而不是Object数组。假设您的类被称为Employee,您应该以这种方式声明您的数组:

Employee[] employeeArray;

employeeArray是一个比array更好的名称,因为它告诉它包含哪种对象,再次是为了便于阅读。一般来说,更喜欢变量的显式名称。)

如果类employeeArray[i].getSalary()包含此类方法,则使用该解决方案很容易使用Employee。当你阅读它时,这段代码的意图也很明显。

其他可能性是通用集合,例如List<Employee>Set<Employee>,具体取决于您的需求。

如果您真的必须使用Object 数组,并调用getSalary()方法,则必须数组元素强制转换为类或方法getSalary()所属的接口。

例如,如果此类被称为Employee

Employee employee = (Employee) array[i];
employee.getSalary();

cast 的作用是获取对象类型为Employee的引用。该对象仍然相同,但现在您可以在此对象上调用Employee的方法。

但是这个解决方案有很多警告。首先,它更加冗长,需要两行来制作本来只需要一行的内容。其次,更重要的是,由于你有一个Object数组,你不能确定你真的有Employee类型的对象,如果不是这样,那么操作就会抛出一个ClassCastException。解决方法是首先检查对象是否真的是所需的类型:

Object object = array[i];
if (object instanceof Employee) {
    Employee employee = (Employee) object;
    employee.getSalary();
}
else {
    System.err.println("Object is not an Employee: we can not call getSalary()!");
}

但是你会发现它变得更加冗长,如果你将它乘以你必须调用这些对象的方法的次数,那么代码将变得无法管理。

答案 1 :(得分:0)

object[]内的所有对象是否都使用getSalary()方法?

  • 如果没有,那么你很明显可以看到为什么编译器不允许你这样做。如果你最终遇到这种情况,代码中的某个地方会发生一些有趣的事情。

  • 如果是,是同一个类层次结构中同一个方法的相同getSalary()方法还是多个动态绑定实现?

    • 如果两者都没有,你应该制作一个接口IHasSalary(蹩脚的名字,我知道)公开这样的方法,使所有这些对象实现该接口,然后将数组声明为{{1} }。

    • 如果是,请找到最专业的共同祖先,说它是班级IHasSalary[],并将数组声明为Employee