であるにもかかわらずInteger
、Object
でObject
はないため、 のメソッドはなく、 のメソッドしかInteger
ありません。Integer
Object
操作を実行できるかどうかは、参照されるオブジェクトのタイプではなく、参照のタイプによって決まります。
つまり、参照されるオブジェクトにはより多くの機能が含まれていても、参照のタイプがオブジェクトのタイプと異なる場合、参照のタイプの機能のみが利用可能になります。
以下では:
Object aThing = new Integer(25);
の型はaThing
として宣言されていObject
ます。実装にはそれ以上のものが含まれていますが、変数の型Integer
が ではなく であるため、実装に含まれているものはすべて表示されなくなりましたObject
。との両方Object
にInteger
共通のメソッドがありますが、今後は によって提供されるものにしかアクセスできませObject
ん。Integer
Object
2 番目の例では、 と の両方に共通のメソッドがありますが、いずれかのメソッドを呼び出すと、実際の型のメソッドが呼び出されることを意味しObject
ますInteger
。したがって、この場合、toString()
onを呼び出すと、 ではなくのメソッドaThing
が呼び出されます。したがって、これはアクセスの問題にすぎません。として宣言するという事実は、のメソッドが呼び出しに応答することを意味するのではなく、 に存在するメソッドと存在しないメソッドが利用できないことを意味するだけです。Integer
toString()
Object
Object
Object
Integer
Object
例:
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
ため、メソッドは を受け取ります。のメソッドを呼び出すことができます。それを呼び出すと、の実装をオーバーライドするため、結果として受け取ります。ただし、 が渡されていることを認識していないため、提供する他のメソッドを呼び出すことはできません。とにかく、 があり、 が持っていない他のメソッドを知りません。Notebook
Computer
Notebook
getInstalledOperatingSystems()
Computer
1
Notebook
Computer
showStatistics()
Notebook
Notebook
Computer
Computer
代わりにを送信することもできますし、Desktop
明日にはを拡張する やGamingComputer
を拡張Desktop
するServer
クラスを作成することもできますComputer
。それも送れます。しかし、は を参照していることを認識していないため、 の特定の特殊なメソッドにshowStatistics()
はアクセスできません。が書かれたとき、それは発明されていませんでした。Server
showStatistics()
Server
showStatistics()
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();
}