13
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对象,因为Notebook它是Computer. 对于方法调用labComputers[i].toString(),多态性确保调用正确的toString方法。

我想知道如果我们这样做

Notebook[] labComputers = new Notebook[10];

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

4

3 回答 3

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

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

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

于 2012-10-14T02:48:11.770 回答
8

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

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

例如,

      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 可用,因为我们在 Computer 中定义了它。

如果你这样做:

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

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

Notebook这将调用在or中实现的函数Desktop

这些功能实现的一个例子:

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

public Class Desktop extends Computer
{
    void MoveMouse();
    {
         USBMouse.Move();
    }
}
于 2012-10-14T02:58:35.940 回答
6

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

这在技术上是正确的,但您必须记住,everyNotebook都是Computer对象,但并非everyComputer都是Notebook.

因此,如果你有

Notebook[] labComputers = new Notebook[10];

您将无法在数组中放置Computer实例,因为并非每个Computer都是Notebook- 并且您的数组只能保存Notebooks。

于 2012-10-14T02:52:14.163 回答