【问题标题】:Proper way of creating an array of Objects holding objects from superclass and subclass创建包含来自超类和子类的对象的对象数组的正确方法
【发布时间】:2014-08-09 12:49:08
【问题描述】:

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

我得到了这些指示:

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

我的实际代码

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].),并让我的方法出现在那个特定的类中。

【问题讨论】:

  • 您对previous question 的回答有什么问题?它没有解释什么吗?如果您尝试了某事但没有成功,请详细说明您尝试了什么以及出了什么问题。
  • 我之前的问题生成了数组,但它不适用于超类和子类,因为这两个类都有默认构造函数和重载构造函数。所以我相信我必须制作如上所示的对象。
  • 你能扩展“没有与超类和子类一起工作”吗? 确切地显示您尝试了什么,并具体描述出了什么问题。从我可以阅读的内容来看,上一个答案应该有效。
  • 我添加了我创建的类,问题出在我的第二个开关案例 1:我将放置“arrayEmployees[0]”。但它没有在超类 PersonData 或子类 personLocation 中看到我的方法
  • 究竟是什么问题?你提供的细节越多,你就越有可能得到读者的好评。你快到了。

标签: java arrays object inheritance polymorphism


【解决方案1】:
Object[] arrayEmployees = new Object[4];
arrayEmployees[0] = personLocation;
arrayEmployees[1] = personLocationOverLoaded;
arrayEmployees[2] = personData;
arrayEmployees[3] = personDataOverloaded;

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

但是,正如您所注意到的,这样做会丢失一些信息。

当您创建Object[] 时,您是在告诉编译器“这是Objects 的数组”。因此,当您检索此数组的元素时,编译器只知道“此数组包含Objects”。它不知道前两个元素是PersonLocation 实例,也不知道后两个元素是personData 元素。它只知道数组包含Objects。


这是 Java 中集合的一般工作方式的一个基本限制。 Java 中的集合具有一个“整体”类型,因为您总是有一个“Collection of Numbers”、“array of PersonDatas”、“ArrayList of Strings" 等等,而不是 "Collection of Integers 和 Doubles`" 所以无论里面的任何 实际 类型,所有编译器都知道您将从集合中取出的对象的类型就是该集合的类型。

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


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

你有几个选择。

  1. 使用instanceof 运算符测试arrayEmployees[0] 的实际类型,然后根据需要进行转换并执行所需的方法。这更尴尬,但如果你必须只有一个数组,你真的别无选择。
  2. 为每个类使用单独的数组,因此不会丢失任何信息。

鉴于您需要进行的分配,似乎不能选择多个数组,因为说明指定了一个数组,因此您可能需要进行测试和转换。大致思路如下:

<variable> instanceof <type>

测试variable 是否为&lt;type&gt;。例如:

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 被声明为 Integer x = 1;x instanceof Integerx instanceof Number 都将返回 true


希望这足以让您入门。欢迎随时提出任何问题。

【讨论】:

  • 我不明白你的意思 - 请注意 - instanceOf 也将匹配子类。因此,如果 x 被声明为 Integer x = 1,x instanceof Integer 和 x instanceof Number 都将返回 true;这听起来也很愚蠢,但我在这里看不到超类和子类的重要性。
  • 也谢谢你,我相信 if 语句的实例肯定会帮助我朝着正确的方向前进。 :)
  • @user3754645 假设您有 Dog 作为超类,Poodle 作为子类。如果您声明Dog d,那么d instanceof Dogd instanceof Poodle 将分别返回truefalse。但是,如果您声明 Poodle pp instanceof Dogd instanceof Poodleboth 返回 true。因此,如果您正在测试一个包含超类对象和子类对象的数组,请首先测试更具体的(即子类)对象。在此示例中,先测试对象是否为Poodle,然后再测试它是否为Dog,因为如果您先测试Dogs,您将永远不会测试Poodles。
  • @user3754645 我提到了超类和子类,因为您提到该数组将包含这两者。 instanceof 测试的顺序很重要,所以我认为提及会有所帮助。很高兴听到这有帮助!
  • 非常有帮助,我很感激,我也很感激你没有给我的问题打分,哈哈,在接下来的几天里,我可能会多次阅读这篇文章,试图以很好的理解来学习这个一个小时正在杀死我的大脑xD
猜你喜欢
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 2021-08-15
相关资源
最近更新 更多