45

メソッドをオーバーライドすると、次のように初めて呼び出されたときに例外が発生することがあります。

05-31 21:32:04.266: E/AndroidRuntime(28471): android.support.v4.app.SuperNotCalledException: 
Fragment AnalFragment{41795860 #1 id=0x7f070002} did not call through to super.onDestroy()

なぜ電話をしなければならないのsuper.method()ですか?親クラスによる義務があることは理にかなっていますが、さらに重要なことは、メソッドがsuperクラッシュするのを待つのではなく、メソッドを呼び出す必要があることをどのように知るのでしょうか?

4

6 に答える 6

46

super.method() を呼び出さなければならないのはなぜですか?

Android SDK を構成するクラスは、非常に複雑になる場合があります。たとえば、アクティビティとフラグメントの両方が適切に機能するためには、多くの操作を実行する必要があります (つまり、ライフサイクルの管理、メモリ使用の最適化、画面へのレイアウトの描画など)。クライアントに基本クラスの呼び出しを要求する (多くの場合、メソッドの開始時に) ことで、これらの操作が引き続き実行され、開発者に妥当なレベルの抽象化が提供されます。

関数 メソッドが呼び出されるには super が必要であることをどのように知ることができますか?

ドキュメントには、これが必要かどうかが記載されています。そうでない場合は、Google でサンプル コードを検索します (または、API のデモを確認してください... または、ソース コードを確認することをお勧めします)。理解するのはそれほど難しくないはずです。

于 2012-06-01T01:49:13.817 に答える
18

これが OP の真の意図ではないことはわかっています。彼はこの質問をしましたが、あまり良い答えが得られたとは思えません。彼らはそれを要求するでしょう、なぜ彼らは私のためにそれをしないのですか!!!」. そんな疑問の答えがこちら……。

基本的に、super() は、呼び出さなければならないものをオーバーライドする場合に呼び出さなければならないものであり、多くの場合、かなり複雑なコードになる可能性があります。さて、彼らがあなたのためにそれを行うだけでなく、あなたの関数の前にそれを呼び出す理由は、主にあなたが制御できるようにするためです! :-D

具体的には、super() を呼び出す IF を制御することはできませんが、WHEN を制御することはできます。たとえば、super() が呼び出される前に実行する必要がある特定のコードがあるとします。コードを実行した後でのみ、super() を自由に呼び出すことができます。または...コードがクラッシュしないように super() が既に実行されている必要があるとしましょう。コードを実行する前に super() を実行するオプションがあるため、すべてがセットアップされていることが保証されます。スーパークラスのハードコアを技術的にオーバーライドし、super() 自体を処理する独自のメソッドをコーディングして、super() を呼び出す必要がないようにすることもできますが、99.9% の場合、正気な人は必要ありません。これをする!:-P

したがって、「なぜ super() を呼び出さなければならないのか」に対する簡単な答えは... 呼び出されるタイミングを制御し、super() が実行される前または後に実行できるようにするためです。:-)

于 2013-12-02T18:50:44.860 に答える
9

superキーワードには主に 2 つの用途があります

1.スーパークラスのコンストラクターを呼び出します。

2.サブクラスのメンバーによって隠されているスーパークラスのメンバーにアクセスします。

では、なぜスーパー キーワードを時々使用する必要があるのでしょうか。答えは、android は 4GL 言語の下にあるということです。これは、多くの機能が用意されていることを意味します。カスタマイズのためにこれらのメソッドをオーバーライドしている間、super キーワードを使用します。

Android での super キーワードの非常に単純な使用法を参照してください (ほとんどの場合そうしています)。

@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    .
    .
    .
}

super() は常に、サブクラスのコンストラクター内で実行される最初のステートメントでなければなりません。サブクラスが super() を呼び出すとき、それは直接のスーパークラスのコンストラクターを呼び出しています。スーパーの 2 番目の形式は、サブクラスのメンバー名がスーパークラス内の同じ名前のメンバーを隠す状況に最も適しています。

于 2012-06-01T02:41:09.207 に答える
4

要件は通常、API ドキュメントで直接指定されています。たとえば、android.widget.ListView.onFinishInflate を参照してください。

protected void onFinishInflate ()

...

サブクラスが onFinishInflate をオーバーライドする場合でも、呼び出されるように、必ずスーパー メソッドを呼び出す必要があります。

残念ながら、私の個人的な経験では、Android ドキュメントの品質にはばらつきがあります。そのため、呼び出しが必要であるが、そのように文書化されていない場合があると思います。

于 2012-06-01T01:43:48.113 に答える