子类型多态性和数组
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
对象引用,我会得到什么样的类型或错误
由于这个问题专门询问了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
,即。 如果Sub
是Super
的子类型,那么数组类型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
这将调用在Notebook
或Desktop
实现的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
。