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
对象
答案 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
因为数组本质上是covarant
,reified
,即。如果Sub
是Super
的子类型,则数组类型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
将调用Notebook
或Desktop
中实现的函数。
这些功能实现的一个例子:
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}}秒。