子类型多态性和数组

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对象引用,我会得到什么样的类型或错误

由于这个问题专门询问了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 

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

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

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

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

例如,

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

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

 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实现的function。

这些function实现的一个例子:

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

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

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

因此,如果你有

 Notebook[] labComputers = new Notebook[10]; 

您将无法Computer实例放置在arrays中,因为并非每台Computer都是Notebook – 并且您的arrays只能容纳Notebook