1. しかしそれだけではありません。
クラスに、他の 2 つのメソッドを呼び出すメソッドCow
があるとしますprintAll()
。すると、コードは次のように動作します。
コード | 説明 |
---|---|
|
|
|
画面出力は次のようになります。
|
printAll()
クラス内のメソッドがオブジェクトに対してCow
呼び出される場合、メソッド内のメソッドではなく、クラスのメソッドが使用されることに注意してください。Whale
printName
Whale
Cow
重要なのは、メソッドが記述されているクラスではなく、メソッドが呼び出されるオブジェクトの型 (クラス) です。
継承およびオーバーライドできるのは、非静的メソッドのみです。静的メソッドは継承されないため、オーバーライドできません。
Whale
継承とメソッドのオーバーライドを適用した後のクラスは次のようになります。
|
継承とメソッドのオーバーライドを適用した後のクラスは次のようになります。 古いメソッドWhale についてはわかりません。printName |
2. タイプキャスト
ここにはさらに興味深い点があります。クラスは親クラスのすべてのメソッドとデータを継承するため、子クラスのオブジェクトへの参照は、親クラス(および親の親など)と同じ型の変数に格納 (割り当て) できます。クラスまでずっとObject
)。例:
コード | 説明 |
---|---|
|
画面出力は次のようになります。
|
|
画面出力は次のようになります。
|
|
画面出力は次のようになります。
メソッドはクラス toString() から継承されますObject |
これは非常に貴重なプロパティです。実際にそれを使用する方法は、少し後で理解できるようになります。
3. オブジェクトのメソッドを呼び出す
メソッドが変数に対して呼び出される場合、そのメソッドは実際にはオブジェクトに対して呼び出されます。このメカニズムは、動的メソッド ディスパッチと呼ばれます。
その様子は次のとおりです。
コード | 説明 |
---|---|
|
画面出力は次のようになります。
|
|
画面出力は次のようになります。
|
呼び出されるメソッドの特定の実装printName()
( 内のメソッドCow
またはクラス内のメソッドWhale
)は、変数の型によってではなく、変数が参照するオブジェクトの型によって決定されることに注意してください。
変数Cow
にはオブジェクトへの参照が格納されWhale
、クラスprintName()
で定義されたメソッドWhale
が呼び出されます。
これはあまり明らかではありません。主なルールを覚えておいてください。
変数に対して呼び出すことができるメソッドのセットは、変数の型によって決まります。 そして、呼び出される特定のメソッド実装は、変数によって参照されるオブジェクトの型/クラスによって決まります。
これは常に遭遇することになるため、これを覚えるのは早ければ早いほど良いでしょう。
GO TO FULL VERSION