子类型多态性和数组

时间:2012-10-14 02:44:45

标签: java arrays polymorphism

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]可以引用Computer对象或Notebook对象,因为NotebookComputer的子类。对于方法调用labComputers[i].toString(),多态性可确保调用正确的toString方法。

我想知道如果我们做什么

Notebook[] labComputers = new Notebook[10];

如果我引用Computer对象和Notebook对象

,我会得到什么样的错误?

3 个答案:

答案 0 :(得分:17)

由于问题特别询问kind of error我会用以下方案解释它们

如果你在下面

Notebook[] labComputers = new Notebook[10];

现在您只能在数组中设置Notebook对象。

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

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

您可以阅读有关Polymorphism的oracle文档,了解其工作原理。

答案 1 :(得分:7)

我认为您必须了解多态性的工作原理。

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

例如,

      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();
}

这将使您有机会在Notebook和Desktop中以不同方式重新定义此方法。 MoveMouse()现在可用于computeArray,因为我们在计算机中定义它。

如果你这样做:

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();
    }
}

答案 2 :(得分:6)

  

每个下标变量labComputers[i]都可以引用Computer对象或Notebook对象。

这在技术上是正确的,但您必须记住,每个Notebook都是Computer个对象,但每个Computer都是{{1} }}

因此,如果你有

Notebook

能够在数组中放置Notebook[] labComputers = new Notebook[10]; 个实例,因为不是每个Computer都是Computer - 并且你的数组只能保存{{ 1}}秒。