Javaの静的コンストラクタ
である私たちはクラス定義があるとします。
パブリック クラスデータ{ プライベート int型の ID。公共の静的データ(){}}
あなたは、このクラスをコンパイルしようとすると、しますデータ型コンストラクタにと、エラーメッセージが表示され、不正な修飾子。唯一、公共保護とプライベートを許可。
静的オブジェクトのコンストラクタに属して、クラスに属します
私たちは、静的メソッド、静的ブロックまたは変数がこのカテゴリーに入ることを知っています。コンストラクタは、ターゲットに属する、とnew演算子を使用してインスタンスを作成するときに呼び出されます。コンストラクタはクラスの属性ではありませんので、それは、静的なことができないと考えるのが妥当です。
静的ブロック/メソッドは、アクセス非静的変数はできません
私たちは、その静的メソッドがアクセス非静的変数ではないことを知って。だけでなく、静的ブロック。
さて、コンストラクタの主な目的は、オブジェクト変数を初期化することです。私たちは、静的コンストラクタを設定するのであれば、あなたは、オブジェクト変数を初期化することはできません。これは、コンストラクタ関数を使用してオブジェクトを作成するための全体の目的を損なうだろう。そのため、非静的コンストラクタは合理的です。
私たちは、静的メソッドでは、この参照オブジェクト変数を使用できないことに注意してください。:ので、次のコードは、コンパイル・エラーを定義しますが、静的の上でそれを使用することはできません。
公共の静的な無効メイン(文字列引数[]){システム。アウト.println(この.ID);}
静的コンストラクタは、破壊を継承します
Javaでは、すべてのクラスは、暗黙的にObjectクラスを拡張します。我々は、サブクラスのコンストラクタは、スーパークラスのコンストラクタを呼び出すためのクラス階層を定義することができます。これは、呼び出しが完了し、スーパー()メソッドによって達成されます。ほとんどの場合、JVMは自動的にスーパークラスのコンストラクタを呼び出すが、複数のスーパークラスのコンストラクタがある場合は、時々、私たちはそれらを手動で呼び出す必要があります。
スーパー()使用例で見てみましょう。
パッケージ com.journaldev.util;クラスデータ{ データ(){ システム.out.println("データコンストラクタ" )。}} publicクラスDataChildが延びデータ{パブリック DataChild (){ スーパー()。 // JREは、説明のためにここに呼び出し、それを明示的に呼び出す システム.out.println(「DataChildコンストラクタ」); }公共の静的な無効メイン(文字列 引数[]){ DataChild DC = 新しい DataChild ()。}}
上記の手順は、次の出力を生成します。
日付ConstructorDataChildビルダー
あなたはスーパー()メソッドを見れば、それは静的ではありません。静的コンストラクタの変換は、我々はそれを使用しない場合はそのため、これは、Javaの継承を破壊します。
Javaの静的コンストラクタの代替
クラス内の静的変数の数を初期化するために、静的なブロックが使用されてもよいです。私たちは、あなたが静的変数を初期化したいのであれば、静的なブロックにパラメータを渡すことができないことに注意してください、あなたはまた、従来のコンストラクタでこれを行うことができますしてください。
クラスデータ{ パブリック 静的の int型の 数。 静的 { カウント = 0; } データ(int型 C ){ //カウントので推奨されていないクラス変数であり //、クラスのすべてのオブジェクトの間で共有 カウント= C 。}} 总结
我々は、Javaの静的コンストラクタの使用を許可しない理由は説明しています。私たちは、静的変数自体を初期化するために、静的なブロックとコンストラクタを使用することができます