子类型多态性和数组

2022-09-04 06:32:58
Computer[] labComputers = new Computer[10];

public class Computer {
...
     void toString(){
     // print computer specs
     }
}
public class Notebook extends Computer{
...
     void toString(){
     // print computer specs + laptop color
     }
}

每个下标变量都可以引用对象或对象,因为它是 的子类。对于方法调用,多态性确保调用正确的方法。labComputers[i]ComputerNotebookNotebookComputerlabComputers[i].toString()toString

我想知道如果我们这样做会怎么样

Notebook[] labComputers = new Notebook[10];

如果我引用对象和对象,我会得到什么类型或错误ComputerNotebook


答案 1

由于问题专门询问,我将通过以下场景进行解释kind of error

如果您执行以下操作

Notebook[] labComputers = new Notebook[10];

现在,您只能在阵列中设置笔记本对象。

labComputers[0]  = new Notebook(); // Fine
labComputers[1]  = new Computer(); // Compilation error 

现在,如果您这样做

Computer[] notebooks = new Notebook[10];
notebooks[0] = new Notebook();
notebooks[1] = new Computer(); // <--- ArrayStoreException

因为数组在本质上是 ,即。如果 是 的子类型,则数组类型是 的子类型,并且数组在运行时强制执行其元素类型,这将导致 ArrayStoreExceptioncovarantreifiedSubSuperSub[]Super[]

您可以阅读有关多态性的oracle文档,以了解更多信息它的工作原理。


答案 2

我认为你必须了解多态性是如何工作的。

多态性是一种功能,它允许多个数据类型通过公共接口以相同的方式运行。

例如

      Computer  // Base class
       |    |
 Notebook   Desktop    // Both inherits of Computer

多态性将允许您管理计算机数组,无论它们是笔记本电脑还是台式机。

Computer[] computerArray = new Computer[2];

computerArray[0] = new Notebook();
computerArray[1] = new Desktop();

这样做的好处是,您不必知道您正在使用哪种子类型的计算机。它们将表现为计算机。

现在出现了很大的不同,在你的计算机课上,你可以有:

public Class Computer 
{
    abstract void MoveMouse();
}

这将使您有机会在笔记本电脑和台式机中以不同的方式重新定义此方法。MoveMouse() 现在可用于计算Array,因为我们在Computer中定义了它。

如果这样做:

computerArray[0].MoveMouse(); // which contains a Notebook

computerArray[1].MoveMouse(); // which contains a Desktop

将调用 在 或 中实现的函数。NotebookDesktop

这些函数实现的示例:

public Class Notebook extends Computer
{
    void MoveMouse();
    {
         MousePad.Move();
    }
}

public Class Desktop extends Computer
{
    void MoveMouse();
    {
         USBMouse.Move();
    }
}