问题在于我的第二个开关案例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]。)并让我的方法显示给那个特定的类。
答案 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}}”等,而不是“String
和Collection
s”,所以无论任何内部的实际类型,所有编译器都知道您将从集合中获取的对象类型是该集合的类型。
例如,假设我有Integer
。所有编译器都知道内容是Double
s。它不知道第一个元素是List<Number> list = new ArrayList<Number>();
,Number
,Integer
等。它只是Double
。因此,您不能使用Long
之类的Number
特定方法,因为编译器无法保证第一个元素是Long
。它只知道list.get(0).longValue()
返回Integer
,而list.get(0)
没有Number
方法。
那你怎么解决这个问题呢?
您有几个选择。
Number
运算符测试longValue()
的实际类型,然后根据需要进行投射并执行所需的方法。这更尴尬,但如果必须只有一个数组,那么你真的没有多少选择。考虑到你需要做的任务,似乎多个数组不是一个选项,因为指令指定了一个数组,所以你可能需要进行测试和转换。这是一般的想法:
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 Integer
和x instanceof Number
都将返回true
。
希望这足以让你入门。随意提出任何问题。