子类型多态性和数组

use*_*466 13 java arrays polymorphism

Computer[] labComputers = new Computer[10];
Run Code Online (Sandbox Code Playgroud)

public class Computer {
...
     void toString(){
     // print computer specs
     }
}
public class Notebook extends Computer{
...
     void toString(){
     // print computer specs + laptop color
     }
}
Run Code Online (Sandbox Code Playgroud)

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

我想知道如果我们做了什么

Notebook[] labComputers = new Notebook[10];
Run Code Online (Sandbox Code Playgroud)

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

Ami*_*nde 17

由于问题具体询问kind of error我将用以下方案解释它们

如果你在下面做

Notebook[] labComputers = new Notebook[10];
Run Code Online (Sandbox Code Playgroud)

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

labComputers[0]  = new Notebook(); // Fine
labComputers[1]  = new Computer(); // Compilation error 
Run Code Online (Sandbox Code Playgroud)

如果你这样做了

Computer[] notebooks = new Notebook[10];
notebooks[0] = new Notebook();
notebooks[1] = new Computer(); // <--- ArrayStoreException
Run Code Online (Sandbox Code Playgroud)

因为数组是covarant,reified在本质上即.if Sub是子类型Super,那么数组类型Sub[]是子类型Super[],并且数组在运行时强制执行它们的元素类型会导致ArrayStoreException

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


For*_*gic 7

我想你必须了解多态如何工作.

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

例如,

      Computer  // Base class
       |    |
 Notebook   Desktop    // Both inherits of Computer
Run Code Online (Sandbox Code Playgroud)

多态性允许您管理计算机阵列,无论它们是笔记本还是桌面.

Computer[] computerArray = new Computer[2];

computerArray[0] = new Notebook();
computerArray[1] = new Desktop();
Run Code Online (Sandbox Code Playgroud)

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

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

public Class Computer 
{
    abstract void MoveMouse();
}
Run Code Online (Sandbox Code Playgroud)

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

如果你这样做:

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

computerArray[1].MoveMouse(); // which contains a Desktop
Run Code Online (Sandbox Code Playgroud)

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

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

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

public Class Desktop extends Computer
{
    void MoveMouse();
    {
         USBMouse.Move();
    }
}
Run Code Online (Sandbox Code Playgroud)


ars*_*jii 6

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

这在技术上是正确的,但你必须记住,每一个Notebook都是一个Computer对象,但不是每个Computer都是一个Notebook.

因此,如果你有

Notebook[] labComputers = new Notebook[10];
Run Code Online (Sandbox Code Playgroud)

你将无法Computer在数组中放置实例,因为不是每个Computer都是Notebook- 并且你的数组只能容纳Notebooks.