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]いずれかを参照できます。メソッド呼び出しの場合、ポリモーフィズムにより、正しいメソッドが呼び出されることが保証されます。 ComputerNotebookNotebookComputerlabComputers[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 が発生します。

ポリモーフィズムに関するオラクルのドキュメントを読んで、それがどのように機能するかを知ることができます。

于 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();
}

これにより、ノートブックとデスクトップでこの方法を異なる方法で再定義する機会が得られます。MoveMouse()は、Computerで定義したため、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();
    }
}
于 2012-10-14T02:58:35.940 に答える
6

添字付きの各変数は、オブジェクトまたはオブジェクトのlabComputers[i]いずれかを参照できます。ComputerNotebook

これは技術的には正しいですが、everyNotebookComputerオブジェクトであり、 everyが ではないことに注意する必要があります。ComputerNotebook

したがって、あなたが持っていた場合

Notebook[] labComputers = new Notebook[10];

すべてが a であるとは限らず、配列に sしか保持できないため、インスタンスを配列に配置することはできませComputerComputerNotebookNotebook

于 2012-10-14T02:52:14.163 に答える