0
class Test {
    public static void main(String[] args) {
        Animal a = new Dog();
        Dog d = new Dog();

        d.makeNoise();  // output "Sub"
        a.makeNoise();  // output "Sub"  then what is use of calling this. why not call d.makeNoise() only.

    }
}

abstract class Animal {
    public void makeNoise() {
        System.out.println("Super");
    }
}

class Dog extends Animal {
    @Override
    public void makeNoise() {
        System.out.println("Sub");
    }
}

このトピックについて 15 分間のディスカッションを行いました (15 分は長すぎると思います) を使用して動的ポリモーフィズムがどのように達成されるかについてインタビュアーに説明しましたa.makeNoise(); が、それでも彼女は両方が同じ出力を与えると言いました。
a.makeNoise();「Sub」を出力し、これを呼び出すのは何ですか。d.makeNoise() だけ
を呼び出さないのはなぜですか? インターフェイスにも行きましたが、サブクラス参照が同じ出力を提供している場合、なぜスーパークラス参照を使用するのかという疑問がありました。

インタビュアーの質問は、違いa.makeNoise();は何ですか?d.makeNoise();両方が同じ出力を出している場合にのみ呼び出さないのはなぜですか?

可能な正解は何ですか?

4

8 に答える 8

2

以下の例は、動的ポリモーフィズムを示しています。a と d はどちらも動物として宣言されていますが、d は実際には犬です。

Animal d に対して makeNoise を呼び出すと、java は d が実際には犬であり、単なる動物ではないことを認識することに注意してください。

class Test {
    public static void main(String[] args) {
        Animal a = new Animal();
        Animal d = new Dog();

        d.makeNoise();  // output "Bark"  - d is an animal that barks
        a.makeNoise();  // output "Squawk"  - a is an animal that squawks

    }
}

class Animal {
    public void makeNoise() {
        System.out.println("Squawk");
    }
}

class Dog extends Animal {
    @Override
    public void makeNoise() {
        System.out.println("Bark");
    }
}
于 2013-04-03T07:39:04.690 に答える
2
Animal a = new Dog();    // this animal is a dog
Dog d = new Dog();       // this dog is a dog

犬は犬ですが、あなたはそれを宣言しました。

a.getClass()等しい。d.getClass()_Dog.class

一方で:

Animal a = new Animal(); // this animal is an animal
a.makeNoise();           // prints "Super"
于 2013-04-03T07:39:37.240 に答える
1

3つのクラスがあると考えてください

  1. 動物
  2. cat cat と dog は animal のサブクラスです。

class Test {
    public static void main(String[] args) {
        Animal a = new Animal();
       
    int user_input=userinput();  //returns 1 for cat and 2for dog
    switch(user_input)
    {
    case 1:Animal d=new Cat();
    break;
    case 2: Animal d=new Dog();
    break;
    }
        d.makeNoise();  // output "Bark"/"meow"  as per user input(dynamic linking)
        a.makeNoise();  // output "Squawk"  - a is an animal that squawks
    }
    } 
    class Animal {
    public void makeNoise() {
        System.out.println("Squawk");
    }
    } 
    class Cat extends Animal {
    @Override
    public void makeNoise() {
        System.out.println("meow");
    }
    }
    class Dog extends Animal {
    @Override
    public void makeNoise() {
        System.out.println("Bark");
    }
    }

于 2016-12-25T19:54:49.857 に答える
1

これがまさにその理由だ-

Animal a = new Dog();

動物は犬なので、騒音は同じです:)

その方法で別の動物、たとえば猫を作成し、動物を猫に向けると、別のノイズが発生するはずです。

于 2013-04-03T07:35:43.427 に答える
0
Animal a = new Dog();

a は型Animalの aa 参照ですが、型Dogのオブジェクトを参照しています。

ここでDogはAnimalクラスのmakeNoise()メソッドをオーバーライドします。

class Animal {
    public void makeNoise() {
        System.out.println("Squawk");
    }
}

class Dog extends Animal {
    @Override
    public void makeNoise() {
        System.out.println("Bark");
    }
}

オブジェクトはDogクラスであるため、JVM はDogクラスのmakeNoise()メソッドをオブジェクトにバインドし、バインドは実行時に行われます。

の出力

a.makeNoise();

になります

サブ

于 2014-05-19T17:33:46.427 に答える
0
class Account {
    public static void main(String[] args) {
        Animal a = new Dog();
        Dog d = new Dog();
        d.makeNoise();
        a.makeNoise();
        a = new Cat();
        a.makeNoise();
    }
}

abstract class Animal {
    public void makeNoise() {
        System.out.println("Super");
    }
}

class Dog extends Animal {
    public void makeNoise() {
        System.out.println("Sub");
    }
}

class Cat extends Animal {

}

上記の変更例と観察結果を参照してください

  1. makeNoise の実装を持つ抽象クラス Animal があります (ここではデフォルトの実装としましょう)。
  2. 動物型ですが、カスタマイズされた makeNoise メソッドを持つ Dog クラスがあります。
  3. タイプ animal の Cat クラスがありますが、カスタマイズされた makeNoise メソッドはありません。Animal タイプのデフォルトの makeNoise を使用します。
  4. Animal a = new Dog() と a.makeNoise() を使用すると、他のクラスに変更を加えることなく、いつでも Dog クラスから makenoise メソッドを削除できます。それでもエラーなしでコンパイルおよび実行されます。
  5. Dog d = new Dog() と d.makeNoise() を使用すると、いつでも Dog クラスから makenoise メソッドを削除できません。その場合は、アプリケーションをコンパイルするためのメイン クラスも変更する必要があります。
于 2013-04-03T08:42:56.020 に答える