2017-01-16 3 views
0

私は次のコード例があります。スーパークラスのメソッドをオーバーライドする理由は何ですか?

出力すべき
class Primate { 
    public void sayType() { 
     System.out.println("I'm a Primate"); 
    } 
} 

class Human extends Primate { 
    public void sayType() { 
     System.out.println("I'm a Human!"); 
    } 
} 
public class TalkingPrimates { 

    public static void main(String args[]) { 
     Primate a = new Primate(); 
     Primate b = new Human(); 

     a.sayType(); 
     b.sayType(); 
    } 
} 

 
I'm a Primate 
I'm a Human! 

は、なぜ私はちょうど例えばhumanHellosayType方法に名前を付け、@Overrideいじり、後で混乱を避けることができません?私は初心者で、この例を別の場所に持ってきたので、あなたが私に見せるより複雑な使い方があるかもしれません。

(別の行 - Primate b = new Human()、これは動的メソッドディスパッチですか?

+6

これは「多型」と呼ばれます。あなたはそれについて読むべきです。これはオブジェクト指向プログラミングの重要な機能の1つです。 – RealSkeptic

+6

この種の[多型](https://en.wikipedia.org/wiki/Polymorphism_(computer_science))の有用性は、 'primate.sayType()'を呼び出すコードを実行時の型を知らなくても書くことができることですその関数の正しい実装を取得します。 – khelwood

+0

ポリモーフィズムに興味がない場合にJavaを使用する理由 – GhostCat

答えて

4

あなたが言うようにすれば、多態性を利用できません。

for(Primate p : primateList){ 
    p.sayType(); // 
} 

これで、オブジェクトに事前定義されたメソッド名の実装をさせ​​、常に同じ名前にすることができます。

+0

ありがとう!私は初心者だと言いましたが(多態性については考えていませんでしたが)、あなたがそれを言及したので、私はいくつかのチュートリアルを見てきました。 – comparter

1

これは可能ですが、Primate b = new Human(); b.sayType();は「私は霊長類です」と出力します。さらに、Primateへの参照を介してhumanHelloにアクセスすることはできません。参考文献がHumanインスタンスを参照していない場合は失敗します。

オーバーライドは、霊長類(人間、テントウムシなど)への参照のコンテナがあり、特定の参照によって正しいメソッドにアクセスしたい場合に便利です。

関連する問題