「オブジェクトが犬であるかどうかを確認しているので、2 と言いました。犬は樹皮メソッドを含むクラスであるため、そうであれば、それを呼び出して :s を出力します」
あなたの論理的根拠は正しいですが、それはそれが機能する方法ではありません。
Java は静的型付き言語です。つまり、オブジェクトが応答する可能性のあるメソッドの有効性は、コンパイル時に検証されます。
あなたは小切手を考えるかもしれません:
if( a instanceof Dog )
しますが、実際にはそうではありません。コンパイラが行うことは、宣言された型 (この場合は Animal ) の「インターフェイス」に対してチェックすることです。「インターフェース」は、Animal クラスで宣言されたメソッドで構成されます。
スーパークラスAnimalでbark()メソッドが定義されていない場合、コンパイラは次のように言います。
コーディング中に「時々」タイプミスをするため、これは役に立ちます (たとえば、代わりに barck() と入力します)。
コンパイラがこれについて警告しない場合は、「実行時」にそれを見つける必要があり、常に明確なメッセージがあるとは限りません (たとえば、IE の javascript は「予期しないオブジェクト」のようなことを言います)。
それでも、Java のような静的型付け言語を使用すると、呼び出しを強制できます。この場合、「キャスト」演算子 () を使用しています。
このような
1. Animal a = new Dog();
2. if (a instanceof Dog){
3. Dog imADog = ( Dog ) a;
4. imADog.bark();
5. }
3 行目では、Dog 型に「キャスト」しているため、コンパイラは bark が有効なメッセージかどうかを確認できます。
これは、「私はここのプログラマーです。私が何をしているのか知っています」というコンパイラーへの指示です。そして、コンパイラ、チェック、Ok、dog、メッセージ bark() を受け取ることができます。続行します。ただし、実行時に動物が犬でない場合は、実行時例外が発生します。
キャストは、次のように短縮することもできます。
if( a instanceof Dog ) {
((Dog)a).bark();
}
それは実行されます。
したがって、正解は4 です。「bark の呼び出しにより、コンパイル時エラーが発生します」
これが役立つことを願っています。