クラスの作成時にJavaコンストラクターが呼び出されますか?オブジェクトが作成されていない場合、「コンストラクターを特定の型に適用できません」エラー

ロナルド

チュートリアルから次のコードを再構築しています。complie it実行すると、次のエラーが発生します。

クラスVierbeinerのコンストラクタVierbeinerは、指定された型には適用できません。必須:java.lang.Stringが見つかりました:引数がありません理由:実際の引数リストと仮引数リストの長さが異なります

私の理解では、このエラーは、親クラスVierbeinerにString引数を必要とするコンストラクターがあり、引数を必要としないコンストラクターがないために発生します。私が理解していないのは、クラスHundのオブジェクトを作成せずにこのエラーが発生する理由です。Hundクラスのオブジェクトを作成していないのに、コンストラクターが呼び出されるのはなぜですか?このエラーについて私が見たすべての既存の質問には、子クラスのオブジェクトの作成が含まれます。

public class Vierbeiner {

    public static void main(String[] args){
         Vierbeiner hund = new Vierbeiner("Bello");
         hund.rennen();
    }

    String vierbeinerName;

    Vierbeiner(String pName) {
        vierbeinerName = pName;
    }

    public void rennen() {
        System.out.println(vierbeinerName+" rennt los!");
    }

}

class Hund extends Vierbeiner {
}

編集:私が得た答えに応えて、私にはまだはっきりしていないのは、次の(ケース1)が問題なくコンパイルされる理由です:

public class Vierbeiner{
    public static void main(String[] args){

         Vierbeiner hund = new Vierbeiner();
         Hund hund2 = new Hund();  
         // Hund hund3 = new Hund("doggy");    
    }

   String vierbeinerName;

   Vierbeiner() {
       vierbeinerName = "test";
   };

   Vierbeiner(String pName){

   }

   }

class Hund extends Vierbeiner{

};

ここでは、Vierbeinerクラスで定義した引数なしのコンストラクターを使用してHundオブジェクトを作成しているようです。

しかし、次のコメントを外すと(ケース2)、コンパイルエラーが発生します。

Hund hund3 = new Hund("doggy");

ケース1の場合、コンパイラーは親クラスVierbeinerを調べて、hund2オブジェクトを作成するための引数なしのコンストラクターを見つけます。ケース2の場合、コンパイラが同じことを行うことを期待します。つまり、親クラスVierbeinerに移動して、hund3オブジェクトを作成するための文字列引数コンストラクタを見つけますが、「super」とを使用しないとそうではないようです。理由がわかりません。

ラン・リフシッツ

実行時にエラーや例外ではなく、コンパイル中にエラーが発生します。

これは、コードが実行されていないため、クラスインスタンスが作成されていないことを意味します。コンストラクターの呼び出しはありません。

コンパイル中に、単一の文字列引数コンストラクターを持つクラスを拡張していることを簡単に検出できます。拡張クラスは、(基になる基本クラスを作成するために)呼び出す必要があります。

コンストラクターを実装すると、基本クラスの自動生成されたパラメーターなしのデフォルトコンストラクター依存できなくなることに注意してください。派生クラスで基本クラスのパラメーター化されたコンストラクターを呼び出す必要があります。

この種の実装はコードに欠けているため、説明したエラーが発生します。

考えられる簡単な解決策は、基本クラスの単一パラメーターコンストラクターを呼び出すデフォルトのコンストラクター実装を提供することです。

class Hund extends Vierbeiner{
    Hund() {
        super("DefaultName");
    }    

};

このコードへの追加により、コンパイル時のエラーが解決されます。

より実用的なアプローチは、派生クラスに文字列パラメーターを持つコンストラクターも含まれていることを確認することです。コンストラクターは、基本クラスのコンストラクターに渡すことができます。

class Hund extends Vierbeiner{
    Hund(String name) {
        super(name);
    }    

};

参照:

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ