であるにもかかわらずInteger、ObjectでObjectはないため、 のメソッドはなく、 のメソッドしかIntegerありません。IntegerObject
操作を実行できるかどうかは、参照されるオブジェクトのタイプではなく、参照のタイプによって決まります。
つまり、参照されるオブジェクトにはより多くの機能が含まれていても、参照のタイプがオブジェクトのタイプと異なる場合、参照のタイプの機能のみが利用可能になります。
以下では:
Object aThing = new Integer(25);
の型はaThingとして宣言されていObjectます。実装にはそれ以上のものが含まれていますが、変数の型Integerが ではなく であるため、実装に含まれているものはすべて表示されなくなりましたObject。との両方ObjectにInteger共通のメソッドがありますが、今後は によって提供されるものにしかアクセスできませObjectん。IntegerObject
2 番目の例では、 と の両方に共通のメソッドがありますが、いずれかのメソッドを呼び出すと、実際の型のメソッドが呼び出されることを意味しObjectますInteger。したがって、この場合、toString()onを呼び出すと、 ではなくのメソッドaThingが呼び出されます。したがって、これはアクセスの問題にすぎません。として宣言するという事実は、のメソッドが呼び出しに応答することを意味するのではなく、 に存在するメソッドと存在しないメソッドが利用できないことを意味するだけです。IntegertoString()ObjectObjectObjectIntegerObject
例:
class Computer {
public int getInstalledOperatingSystems() { return 3; }
}
class Desktop extends Computer {
public String getShapeOfCase() { ... }
}
class Notebook extends Computer {
public int getInstalledOperatingSystems() { return 1; }
public String getBrand() { ... }
public void closeLid() { ... }
}
を作成しましょうNotebook:
Notebook n = new Notebook();
次のメソッドがあるとします。
public String showStatistics(Computer computer) {
result = "Operating systems: " + computer.getInstalledOperatingSystems();
return result;
}
Notebook上記で定義した でこのメソッドを呼び出すと、次のようになります。
showStatistics(n);
aはであるNotebookため、メソッドは を受け取ります。のメソッドを呼び出すことができます。それを呼び出すと、の実装をオーバーライドするため、結果として受け取ります。ただし、 が渡されていることを認識していないため、提供する他のメソッドを呼び出すことはできません。とにかく、 があり、 が持っていない他のメソッドを知りません。NotebookComputerNotebookgetInstalledOperatingSystems()Computer1NotebookComputershowStatistics()NotebookNotebookComputerComputer
代わりにを送信することもできますし、Desktop明日にはを拡張する やGamingComputerを拡張DesktopするServerクラスを作成することもできますComputer。それも送れます。しかし、は を参照していることを認識していないため、 の特定の特殊なメソッドにshowStatistics()はアクセスできません。が書かれたとき、それは発明されていませんでした。ServershowStatistics()ServershowStatistics()
Serverこれは、 aが常に aであっても、 a が必ずしも a ではないというステートメントと一致してComputerいComputerますServer。
でも確認できます。したがって、コンピューターだけでなくで渡される可能性があることがわかっNotebookている場合は、それを探すことができ、Notebookのメソッドを呼び出すこともできますが、 を見ていることを確認する必要がありますNotebook。
if (computer instanceof Notebook) {
// this is definitely a Notebook, so you can assure the compiler
// of that explicitly, by using a cast
Notebook notebook = (Notebook) computer;
result += "This isn't just a generic computer, it's actually a notebook! ";
// now that you have a variable of type Notebook, you can call
// whatever Notebook provides
result += "It's produced by: " + notebook.getBrand();
}