2011-08-23 10 views
9

は、誰も私に伝えることができます:@Override注釈

public class OvTester { 
    @Override 
    public int hashCode() { 
     return toString().hashCode(); 
    } 
} 

OvTesterクラスのtoStringメソッドはスーパークラスでtoStringメソッドをオーバーライドすることを決定。

これが本当かどうか知りたいのですが、そうであればどうすればいいですか?それは真実ではない場合

、これは本当です:

「そのスーパークラスで同じ名前のメソッドをオーバーライドする必要がありますOvTesterhashCode()方法」?

これは正しくない場合は、何が正しいですか?

+1

あなたのクラスはスーパークラスを持っていないようですので、これは失敗します。 – Sirs

+9

もちろんスーパークラス - java.lang.Object'を持っています – Bozho

答えて

13

オーバーライドが起こります。だからここにあなたがhashCode()をオーバーライドしている

、ないtoString()

@Override注釈は省略可能です(ただし、非常に良いこと)、これをオーバーライドすることが期待されていることを示しています。スペルが間違っているか、間違って型指定されたパラメータを持つと、コンパイラは警告します。

そうです、第二文が真である(この場合のスーパークラスがjava.lang.Objectある)

2

私はこのことが真であるかどうかを知りたいと思いますか?

いいえ、正確には正しくありません。

@Overrides注釈は「このメソッドは、スーパークラスで同じ名前を持つ方法を無効にします」と述べています。

この場合、hashCodeOvTesterは、のhashCodeを上書きします。

、その真ではない場合、これは本当です:OvTesterhashCode()方法は、そのスーパークラスで同じ名前のメソッドをオーバーライドする必要がありますか?

はい。それはまさにその仕組みです。


1つの方法は、別のメソッドを呼び出すよりも、他に何もしない(あなたはあなたの例で得たほとんど何)それは通常delegate methodと呼ばれています。おそらく、これはあなたがこれを混同しているかもしれません。

0

いいえ、これは、hashCode()メソッドがオーバーライドされていることを意味します。コンパイラは、コンパイル時に、hashCode()が実際にオーバーライドされている(そのシグネチャを持つ)メソッドであるかどうかをチェックします。

0

@Overrideは、実装者が実際にメソッドをオーバーライドするかどうかをコンパイル時にチェックするだけです。あなたはsublcassで同じシグネチャを持つメソッドを再定義するときに

@Override 
public void equals(Object ob){ 

} 

を上書きしようとした場合

それがコンパイルに失敗します

1

@Override注釈は何かを「決定」しません。注釈付きメソッドがスーパークラスまたはインターフェイスメソッドをオーバーライドしていない場合、エラーを発生させるようコンパイラに指示するフラグです。これは開発者が自分の健全性を維持するのに役立つツールです。この特定の場合において

、単にOvTesterhashCode()実装はObjectで定義されたhashCode()メソッドをオーバーライドしていることを指摘しています。これは、toString()と何も関係がなく、hashCode()メソッドからスーパークラスのtoString()メソッドを呼び出すことは、toString()をオーバーライドすることと同じではありません。

これは本当ですか? OvTesterのhashCode()メソッドは、スーパークラスの同じ 名前メソッドをオーバーライドする必要がありますか?アノテーションはアノテーション付きメソッドのシグネチャと一致したスーパークラスでオーバーライドhashCode()方法がない場合、コンパイラはエラーを発生させることになりますという意味では、確かに真実である

0

このコードは、ObjectクラスのhashCode()メソッドをオーバーライドします。 toString()メソッドには依然として元の実装があります。

を使用すると、以下の操作を行い、 toString()上書きするには、次の

@Override 
public String toString() { 
    //Your own toString() implememntation here 
} 

限り、子クラスのメソッドは、親クラスのメソッド、方法と同じ名前とシグネチャを持っているとして、親クラスはNOTプライベートです(アノテーションの有無にかかわらず)