正确创建一个包含超类和子类对象的Object数组的方法

时间:2014-06-19 04:34:08

标签: java arrays object inheritance polymorphism

问题在于我的第二个开关案例1:我将把“arrayEmployees [0]”。但它没有在超类PersonData或子类personLocation中看到我的方法。我对多态性的理解有点阴暗以及内部的“对象”可能性,因为我刚开始学习这些,所以也许我引用它们是错误的。

我得到了这些指示:

  

使用main方法设计一个名为PersonTest的新类,该方法定义PersonData对象和PersonLocation对象(两者都没有参数)和另外两个带参数的对象,并将所有对象存储在Array中以检索和修改实例化对象(即对象数组。)

我的实际代码

package lab5;
import java.util.InputMismatchException;
import java.util.Scanner;

public class PersonTest 
{
    public static void main(String args[])
    {
        Scanner input = new Scanner(System.in);

        PersonLocation personLocation = new PersonLocation();
        PersonData personData = new PersonData();

        PersonLocation personLocationOverLoaded = new PersonLocation("Hamilton");
        PersonData personDataOverloaded = new PersonData("Stirling", "905-567-7656");

        Object[] arrayEmployees = new Object[4];
        arrayEmployees[0] = personLocation;
        arrayEmployees[1] = personLocationOverLoaded;
        arrayEmployees[2] = personData;
        arrayEmployees[3] = personDataOverloaded;

        int user = 0;
        int menu = 0;

        // Get input here, put into variable "user"

        switch(user)
        {
            case 1:
                System.out.print("Printing Object Information With Given Values\n\n\t");

                arrayEmployees[0]. //Issue
        }
    }//End Main Method
}//End Class PersonTest

应该发生什么:我想能够从我的数组中引用如上所示(arrayEmployees [0]。)并让我的方法显示给那个特定的类。

1 个答案:

答案 0 :(得分:0)

Object[] arrayEmployees = new Object[4];
arrayEmployees[0] = personLocation;
arrayEmployees[1] = personLocationOverLoaded;
arrayEmployees[2] = personData;
arrayEmployees[3] = personDataOverloaded;

实际上,这确实完全你想做什么。这是一个包含给定类型及其超类的对象的数组。

然而,通过这样做,您会丢失一些信息,正如您所注意到的那样。

创建Object[]时,您告诉编译器“这是Object s的数组”。因此,当您去检索此数组的元素时,所有编译器都知道“此数组包含Object s”。它不知道前两个元素是PersonLocation个实例,并且不知道最后两个元素是personData个元素。它只知道数组包含Object s。


这是Java中集合如何工作的基本限制。 Java中的集合具有一个“整体”类型,因为您将始终拥有“Collection Number s”,“PersonData s”数组,“ArrayList的{​​{1}}”等,而不是“StringCollection s”,所以无论任何内部的实际类型,所有编译器都知道您将从集合中获取的对象类型是该集合的类型。

例如,假设我有Integer。所有编译器都知道内容是Double s。它不知道第一个元素是List<Number> list = new ArrayList<Number>();NumberInteger等。它只是Double。因此,您不能使用Long之类的Number特定方法,因为编译器无法保证第一个元素是Long。它只知道list.get(0).longValue()返回Integer,而list.get(0)没有Number方法。


那你怎么解决这个问题呢?

您有几个选择。

  1. 使用Number运算符测试longValue()的实际类型,然后根据需要进行投射并执行所需的方法。这更尴尬,但如果必须只有一个数组,那么你真的没有多少选择。
  2. 为每个类使用单独的数组,因此不会丢失任何信息。
  3. 考虑到你需要做的任务,似乎多个数组不是一个选项,因为指令指定了一个数组,所以你可能需要进行测试和转换。这是一般的想法:

    instanceof

    测试arrayEmployees[0]是否为<variable> instanceof <type> 。例如:

    variable

    测试以查看<type>是否为arrayEmployees[0] instanceof PersonLocation

    此测试返回arrayEmployees[0],因此您可以将其用作PersonLocation语句的条件。在boolean语句中,您可以将if转发为临时引用:

    if

    请注意 - arrayEmployees[0]也会匹配子类。因此,如果if (arrayEmployees[0] instanceof PersonLocation) { PersonLocation temp = (PersonLocation) arrayEmployees[0]; // execute whatever you need on temp } 被声明为instanceOf,则x instanceof Integerx instanceof Number都将返回true


    希望这足以让你入门。随意提出任何问题。