このコードを考えてみましょう (完全なクラス、正常に実行されます。簡潔にするために、すべてのクラスを 1 つのクラスにまとめています)。
私の質問は、コード リストの後にあります。
import java.util.LinkedList;
import java.util.List;
class Gadget {
public void switchon() {
System.out.println("Gadget is Switching on!");
}
}
interface switchonable {
void switchon();
}
class Smartphone extends Gadget implements switchonable {
@Override
public void switchon() {
System.out.println("Smartphone is switching on!");
}
}
class DemoPersonnel {
public void demo(Gadget g) {
System.out.println("Demoing a gadget");
}
public void demo(Smartphone s) {
System.out.println("Demoing a smartphone");
}
}
public class DT {
/**
* @param args
*/
public static void main(String[] args) {
List<Gadget> l = new LinkedList<Gadget>();
l.add(new Gadget());
l.add(new Smartphone());
for (Gadget gadget : l) {
gadget.switchon();
}
DemoPersonnel p = new DemoPersonnel();
for (Gadget gadget : l) {
p.demo(gadget);
}
}
}
質問:
コンパイラの観点から、スマートフォンの switchon メソッドの起源は何ですか? 基底クラスのガジェットから継承されていますか? それとも、switchonable インターフェイスによって義務付けられている switchon メソッドの実装ですか? 注釈はここで違いを生みますか?
メイン メソッドの最初のループ: ここでは、ランタイム ポリモーフィズムのケースが見られます。つまり、最初の for ループが実行され、gadget.switchon() が呼び出されると、最初に「Gadget iswitching on」が出力され、次に「スマートフォンの電源が入っています」と表示されます。しかし、2 番目のループでは、このランタイム解決は行われず、demo への両方の呼び出しの出力は「ガジェットのデモ中」ですが、最初の反復で「ガジェットのデモ中」と「スマートフォンのデモ中」が出力されることを期待していました。 2回目。
私は何を間違って理解していますか? ランタイムが最初の for ループで子クラスを解決するのに、2 番目の for ループでは解決しないのはなぜですか?
最後に、Java での実行時/コンパイル時のポリモーフィズムに関する明快なチュートリアルへのリンクを歓迎します。(Java チュートリアル トレイルのリンクを投稿しないでください。細かいニュアンスをかなり深く議論するときに、特に印象的な資料は見つかりませんでした)。