概要:静的コードブロックは常に最初に実行されます。
関係するオブジェクトと非静的メソッドのようなコードの非静的ブロック、。コンストラクタの前に、コードの非静的ブロックのみ。
非静的ブロック親、コンストラクタは、それがコードブロックと非静的コンストラクタサブクラスの実行を開始(親クラスオブジェクトの初期化が完了した対応する)が終了します。
================================================== ==============================
同じポイント:すべてのコンストラクタとJVMロードクラスの実行が複数のクラスに定義することができる前に、
コードブロックの割り当てでは通常、いくつかの静的変数。
異なる点:コードブロック非静的前に、コードの静的ブロック
(コードの静的ブロック- >非静的ブロック- >コンストラクタ)。
コードの静的ブロックは、最初のクラスローダは、一度ロードされ、その後、静的コードブロックが一度たびに新しい実行されるのではなく、実行されていないときにのみ実行されます。静的ブロックなく、非静的ブロックは、定義された(しかし、ほとんど効果)従来の方法でもよいです。
JVMは、静的ローディング・クラス・コード・ブロックを実行静的ブロックが複数、JVM順次、それらがクラスに表示される順序でそれらを実行した場合、各コードブロックは、一度だけ実行されます。
例1:
-
パブリッククラスPuTong {
-
パブリックPuTong(){
-
。システム out.print("デフォルトコンストラクタ- >!");
-
}
-
-
//非静的ブロック
-
{
-
。システム Out.print("非静的ブロック- >!");
-
}
-
-
//静的コードブロック
-
静的{
-
。システム Out.print("コードの静的ブロック- >!");
-
}
-
-
パブリック静的ボイド試験(){
-
{
-
。システム out.printlnを(「コードブロックの従来の方法!」);
-
}
-
}
-
}
-
-
//テストクラス
-
パブリッククラスTestClassを{
-
-
/ **
-
*ブロックの2つの新しい静的および非静的な実装の違い
-
* /
-
パブリック静的ボイドメイン(文字列[]引数){
-
PuTong C1 = 新しいPuTong();
-
c1.test();
-
-
PuTong C2 = 新しいPuTong();
-
c2.test();
-
}
-
}
-
-
/ *
-
実行出力は次のようになります。
-
静的コードブロック! - >コードの非staticブロック! - >デフォルトコンストラクタ! - >コードブロックの従来の方法!
-
コードの非静的ブロック! - >デフォルトコンストラクタ! - >コードブロックの従来の方法!
-
* /
二つの主なポイントがあります。
1、親クラス、非静的初期化ブロックのサブクラス?
最後に実行され、オーバーライドされたメソッドを呼び出すときに2、親クラスのメソッドはありますか?
例2:
-
パッケージタグ;
-
-
パブリッククラスの子は、拡張父を{
-
-
静的{
-
システム。 out.printlnを("子- >静的");
-
}
-
-
プライベートint型のn = 20;
-
-
{
-
システム。 out.printlnを(「児童非静的」);
-
N = 30。
-
}
-
-
公共int型のx = 200;
-
-
公共の子供(){
-
この(「他のコンストラクタ」);
-
システム。 out.printlnを("子コンストラクタ本体:" + n)は、
-
}
-
-
公共子(文字列s){
-
システム。 out.printlnを(S)。
-
}
-
-
公共ボイド年齢(){
-
システム。 out.printlnを("年齢=" + n)は、
-
}
-
-
公共のボイドprintX(){
-
システム。 out.printlnを("x =" + X)。
-
}
-
-
パブリック静的ボイドメイン(文字列[]引数){
-
。新しい子()printX();
-
}
-
}
-
-
クラスの父{
-
-
静的{
-
//System.out.println("n+"+n);
-
// nは以下に定義されている場合は、それが定義される前に、フィールドを参照することはできませんプロンプトが表示されます
-
//を移動しなければならないN個の出力ができ、上記で定義した通りであります
-
システム。 out.printlnを("スーパー- >静的");
-
}
-
-
パブリック静的INT N = 10。
-
公共int型のx = 100;
-
-
パブリック父(){
-
システム。 out.printlnを("スーパーのx =" + x)は、
-
年齢();
-
}
-
-
{
-
システム。 out.printlnを(「父非静的」);
-
}
-
-
公共ボイド年齢(){
-
システム。 out.printlnを("何");
-
}
-
}
結果:
超 - >静的
子 - >静的
父非静的
スーパーのx = 100
年齢= 0
児童非静的
他のコンストラクタ
子コンストラクタ本体:30
X = 200
コードの親クラスの静的ブロック - >サブクラスの静的コードブロック
- >親クラス非静的ブロック - >親クラスのコンストラクタ
- >非静的ブロックサブクラス - >サブクラスのコンストラクタ
new演算子を使用しているときJavaは、クラスのインスタンス、およびデフォルト値に初期化されたメンバ変数を開始割り当てられたスペースを作成するには時間が、これはこれだけに、変数は変数定義で初期値に初期化されることに注意するという意味ではありません0、この別のC ++に割り当てられたヌル文字列を割り当て整形(student.name =ヌル、student.age = 0)
そして、クラスのコンストラクタを入力してください。
コンストラクタ関数では、我々が最初にこのまたはスーパーコールかどうかを確認する必要があり、この呼び出しは現在のクラスのコンストラクタ自体の間で通話を終了し、スーパーコールは、親クラスを介して呼び出されます。どちらも、一つだけ、とだけコンストラクタの発生として現れることができます。呼び出されたこのコンストラクタやスーパーのコンストラクタを実行する代わりに、このスーパーを呼び出すときにプログラムを実現するためにジャンプして。
この完成したスーパーでは、代わりに実行する変数の初期化プログラムは、クラス定義に着手仕事します。
これは、コンストラクタは、コードの残りの部分で実行され、終了します。