1

私は一般的にJAVAとOOPに不慣れです。この非常に単純なコードで、スーパークラスからonCreateメソッドを呼び出さなければならないのはなぜですか?スーパークラスから受け継がれていませんか?コンストラクターメソッドは子クラスに継承されないことを知っています。コンストラクターを呼び出したい場合は、スーパークラスを呼び出す必要があります。super.onCreateはコンストラクター呼び出しですか?コンストラクター名はクラス名と同じである必要はありませんか?私はこれがばかげた質問であることを知っています、そしてあなたの応答に感謝します。

import android.app.Activity;

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}
4

7 に答える 7

11

スーパークラスからonCreateメソッドを呼び出さなければならないのはなぜですか?スーパークラスから受け継がれていませんか?

実装は継承されますが、オーバーライドしています。元の動作を置き換えるだけでなく、スーパークラスからその動作を実行してから追加のコードを実行することを示す必要があります。

これはコンストラクター呼び出しではありません。スーパークラス実装を明示的に呼び出さない限り、そのコードは単に実行されません。また、コンストラクターとは異なり、スーパークラスの実装呼び出しはメソッドの最初のステートメントである必要はありません。スーパークラスの実装は、何度でも好きな場所で呼び出すことができます。

これは、スーパーメソッドを呼び出すことと呼び出さないことの違いを示す短いが完全なサンプルプログラムです。

class Super {
    void method1() {
        System.out.println("Super.method1");
    }

    void method2() {
        System.out.println("Super.method2");
    }
}

class Sub extends Super {
    @Override void method1() {
        // No explicit super call
        System.out.println("Sub.method1");
    }

    @Override void method2() {
        super.method2();
        System.out.println("Sub.method2");
    }
}

public class Test {
    public static void main (String[] args) {
        Super x = new Sub();
        x.method1(); // Prints just Sub.method1
        x.method2(); // Prints Super.method2 and Sub.method2
    }    
}

Sub.method1(ちなみに、呼び出すことは完全に実行可能です。サブクラスから任意のsuper.method2()メソッドのスーパークラス実装を呼び出すことができます。)

于 2012-11-19T23:06:59.287 に答える
7

それがAndroidチームがアクティビティを設計した方法だからです。アクティビティのonCreate()メソッドは、作成されたすべてのアクティビティに対して実行する必要があることを実行します。呼び出さない場合、super.onCreate()これらの必須の操作はバイパスされます。

onCreate()コンストラクターではありません。それは方法です。メソッドをオーバーライドして呼び出しない場合はsuper.onCreate()、メソッドの機能を再定義onCreate()します。呼び出すsuper.onCreate()と、onCreate()メソッドは基本メソッドと同じことを実行しonCreate()、さらに独自のアクティビティに固有の他のことを実行します。

このメソッドのドキュメントについては、http://developer.android.com/reference/android/app/Activity.html#onCreate%28android.os.Bundle%29を参照してください。

于 2012-11-19T23:06:49.607 に答える
2

はい、同じメソッド名なので、ActivityからonCreateメソッドをオーバーライドしています。MainActivityでそのメソッドを再度呼び出さない場合は、setContentView(R.layout.main);を実行するだけです。

于 2012-11-19T23:09:56.757 に答える
1

これは、実際にはコンストラクターとは関係ありません(さらに、コンストラクターが呼び出されないというステートメントは、デフォルトのコンストラクターの場合には当てはまりません)。

「OOP」のような理由は、クラス内のonCreateメソッドに、サブクラスの実装によって呼び出される必要Activityのある特定のコードが含まれている可能性があるためです。ただし、(Java言語に関する限り)呼び出す必要はありません

スーパークラスの実装をメソッドで呼び出す必要があるかどうかを知るには、スーパークラスの実装のドキュメントを参照してください。ここには正しいことも悪いこともありません。間違いなくケースバイケースです。

于 2012-11-19T23:07:15.580 に答える
1

スーパークラスのメソッドは、サブクラスで使用できるという意味で継承されますが、自動的には呼び出されません。サブクラスでは、スーパークラスのメソッドを呼び出して、スーパークラスが実行できることをすべて実行できるようにします。その後、メソッドは追加の作業を実行します(例のように)。

詳細情報を提供するリファレンスは次のとおりです。

http://docs.oracle.com/javase/tutorial/java/concepts/

于 2012-11-19T23:09:07.527 に答える
1

スーパークラスメソッドをオーバーライドします-それを置き換える場合と同じです。スーパークラスメソッドを呼び出すオプションがありますが、呼び出す必要はありません。それはすべてあなたが達成しようとしていることに依存します。一部のシナリオでは、サブクラスのロジックが必要なため、スーパークラスメソッドを呼び出します。これに追加するperharpsです。その他の場合は、動作を完全に置き換えることができます。

于 2012-11-19T23:09:27.320 に答える
1

元のonCreate()メソッドはyesを継承しますが、その正確なメソッドはこのコードが行うことではありません。このコードには元のメソッドが必要であり、も呼び出す必要がありますsetContentView(R.layout.main);。ここでスーパークラスからすべてのコードをコピーする代わりに、単に呼び出しsuper.onCreate()てから新しいものを追加します。

于 2012-11-19T23:09:50.113 に答える