3

非常に簡単な質問ですが、とにかく:次のようなデフォルトのコンストラクターをオーバーライドする理由はありますか?

public SomeObject(){
}

公開されています。ロジックはありません。それで、必要ですか?全体像が見えませんでしたか?

すべてのあなたの助けに感謝します。

4

4 に答える 4

10

の引数なしコンストラクターを定義する理由の 1 つは、デフォルト以外のコンストラクターあり、引数なしコンストラクターにアクセスできるようにする (パブリックまたは保護) ことが必要な場合です。

これは、[その他の] コンストラクターの定義によって、デフォルトの引数なしコンストラクターの自動追加が妨げられるためです。

コンパイラーは、コンストラクターのない任意のクラスに対して、[public] 引数なしのデフォルト コンストラクターを自動的に提供します。

(そのリンクの次のビットも参照してください。ここでは、呼び出されるデフォルトのスーパー コンストラクターについて説明しています。)

引数のないコンストラクターが手動で使用されていない場合でも、 Serializableなど、他のものにとって重要になる可能性があります。

逆シリアル化中に、シリアル化できないクラスのフィールドは、クラスのパブリックまたは保護された引数なしのコンストラクターを使用して初期化されます。引数なしのコンストラクターは、シリアル化可能なサブクラスにアクセスできる必要があります。シリアライズ可能なサブクラスのフィールドは、ストリームから復元されます。

于 2012-08-07T16:12:13.557 に答える
4

唯一の理由は、パラメーターを持つコンストラクターがあり、パラメーターを渡さずにオブジェクトを作成できるようにしたい場合があります (デフォルトのコンストラクターを呼び出すことによって)。

コンストラクターが定義されている場合、arg コンストラクターは使用できないため、クラスに明示的に追加する必要があります。

于 2012-08-07T16:13:24.097 に答える
1

初期化ロジックがない限り、デフォルトのコンストラクターをオーバーライドする必要はありません。

于 2012-08-07T16:12:05.737 に答える
1

正確な理由は、そうしないと、クラスの拡張中に問題が発生することです

class A{
    int a;
    public A(int a){
        this.a=a;
    }
    // public A()
    //{
        // here super(); will be called again, calling Object class's constructor thus initializing any uninitialized variables
    //}
}

class B extends A{
    int b;
    public B(int b){
        // here automatically, "super();" will be executed. if it is not present, error!
        this.b=b;
    }
}

私が言おうとしていたことを理解するために、これこれを読んでください。

編集:ご覧のとおり、オーバーロードされたスーパーコンストラクターを引数で明示的に呼び出さない限り、クラスを拡張するときに引数なしの親コンストラクターを定義することが必須であるため、一部の答えは実際には間違っています。

于 2012-08-07T16:29:18.130 に答える