1

EclipseビルドID:20120614-1722を使用しています。

「TOY1」というオブジェクトクラスとその中に関数toString()があります。私が電話するとき、私は以前にそれを知っています

System.out.println(TOY1); 

アドレスを返す必要があります。ただし、何らかの理由で、@ Override表記を指定せずに、オブジェクトに対して宣言されたtoString()を返しています。

そのように保つのは安全ですか?それとも、これは私が持っている特定のビルドに実装された新機能ですか。

ありがとう

編集

尋ねられたように、これは私のコードの一部です:

public class TOY1 {

//irrelevant declarations

public String toString() {
String data;
data="Manufacturer=";
data+=manufact;
data+="DOP:";
data+=date_of_production;
return data;
}
}

TOY1のTOY1_instanceを宣言し、System.out.printIn(TOY1_instance)

ジャンクアドレスではなく、実際のデータを取得しています。

私の質問は、どこでオーバーライドしたのかということです。警告は表示されず、拡張機能はこのクラスをオーバーライドしません。

4

6 に答える 6

7

System.out.println(obj);obj.toString()内部で呼び出しています。のデフォルトの実装はtoString()、オーバーライドしない場合、アドレスのような値を返すことがあります。

@Override注釈は省略できますが、使用する方が安全です。署名のわずかな違いのために、オーバーライドしていないときにオーバーライドしていると思う場合に特に便利です。例えば:

@Override
public String tostring() //...

コンパイルされません。さらに一般的な間違いは間違っていequals()ます:

@Override
public boolean equals(TOY1 obj) //...

理由がわかりますか?それがなければ@Override、そのような途方もないバグを見逃すのは非常に簡単です。

于 2012-10-22T18:38:59.727 に答える
2

@Override注釈はオプションですが、

コードは、それがあってもなくても同じように機能します。

しかし、それを使うのは良い味の問題です。これは、何が起こっているかを明確に示しています。つまり、スーパークラスからメソッドを再定義するか、インターフェイスからメソッドを実装します。

そして、Tamaszが述べたように、実際には何もオーバーライドしていない@Overrideメソッドでアノテーションを付けることは不可能です。だからそれは時々あなたを救うことができます。

于 2012-10-22T18:37:54.707 に答える
1

@Overrideが指定されていない場合でも、常に最も近いtoString()インスタンスメソッドを実行します。より安全にするため、または迅速かつ効率的にコンパイルするには、上部に@Overrideを含める必要があります

于 2012-10-22T18:39:43.083 に答える
0

@Overrideアノテーションはコンパイラ専用であり、JVMはそれを気にしません。

Overrideここで注釈の定義を参照してください:

@Target(value=METHOD)
@Retention(value=SOURCE)
public @interface Override 

宣言からわかるように、ソースにのみ保持され、クラスファイルには保持されません。

于 2012-10-22T18:39:48.497 に答える
0

わかりました。はっきりさせておきます。したがって、オーバーライドされた関数は引き続き呼び出されますが、問題は、@overrideが使用されていない場合でもなぜ呼び出されるのかということです。その場合、このアノテーションは、コンパイラが実際に関数をオーバーライドしたかどうかを確認するためのものです。プログラム自体のロジックに影響を与えるべきではありません。また、具体的な回答が必要な場合は、コードを投稿してください。

于 2012-10-22T18:42:56.577 に答える
0

実際、System.out.println()はいくつかのタイプのパラメーターを処理でき、そのうちの1つは文字列への参照です。

このURLを参照してください

于 2012-10-22T18:43:51.767 に答える