Javaのオブジェクト指向の初期化ブロック

Javaのオブジェクト指向の初期化ブロック

プログラミングでは、そのデータフィールドが正しく初期化を実行することを不朽の真理となっています。
だから、それはデータフィールドを初期化することの意味:

  • コンストラクタで値を設定します。
  • 文の割り当て。
  • 使用ブロックの初期化

Javaの初期化ブロック上の点に議論Benpianの注意:Javaの初期化中にブロックがJavaオブジェクトの作成で、それは単に暗黙の、クラスのメンバーであるが、名前もロゴもない、呼び出すことはできません初期化を行います。

一般的な初期化ブロック

  • 一般的な初期化ブロックは、非静的修正。
  • 声明の中括弧ときに{}コード包まれたが、初期化コードが収容され、初期化がブロック全体です。
  • そこに多くの初期化ブロックすることができ、すべてが順番に実行されているので、分離する必要が、一緒に逃げるん。
  • インスタンス変数を宣言するときにデフォルト値を指定し、通常の初期化ブロックは、オブジェクトの初期化コードは順序に従って実行されていると見ることができます。

  • 初期化ブロックは、常にコンストラクタの前に呼び出されます
  • コンストラクタの複数が同じオーバーロードし、着信独立パラメータ文を持っている場合は一緒に初期化ブロックに入れることができます。

public class NormalBlock {
    int a = 5;
    {
//        a = 6;
        System.out.println("初始化块之后的a为"+a);
    }
//    {
//        int a = 8;
//        System.out.println("初始化块中重新定义了一个a?"+a);
//    }
    NormalBlock(){

        System.out.println("构造器中赋a的值为"+a);
    }
}
class NormalTest{
    public static void main(String[] args) {
        new NormalBlock();
    }
}
  • 声明上記の注意として、次のとおりです。
初始化块之后的a为5
构造器中赋a的值为5

インスタンス変数の宣言は、デフォルト値も初期化コードと考え、順次実行されるコンストラクタを最初の初期化ブロックを指定し、この例で見ることができます。(あなたはカザフスタン検証彼らの位置を交換しようとすることができます)

  • 上記のコメント文の持ち上げた後、私は結果を思っていました。
初始化块之后的a为6
初始化块中重新定义了一个a?8
构造器中赋a的值为6

私は、初期化コード、コンストラクタの実装、コールの後、私は2番目のコードブロック内に定義することを考え始めと同じ名前の変数は(まだ)前に同じである問題はないので、その点を疑いますA、呼び出しが、それは、そう、疑問を持っている以上、私を助けるためにできる小さなパートナーを知りたいであることを、その後の時間

  • 私も会っ試験した場合、ilegal forward reference以下のように、すなわち前方に、誤って引用。
    {
        age = 50;
        if(age>40) System.out.println("Father类的初始化块且age>40");
        System.out.println("Father类的第一个初始化块");
    }
    int age =20;

理由:変数がまだ定義されていないとき、あなたはそれを引用しているため、そうな間違いを避けるために、初期化ブロックのメンバ変数の宣言の後に可能な限り。

静的初期化ブロック

これは正常であり、対応する静的初期化ブロックは、それ、即ちA 静的変形、とも呼ばれるクラスの初期化ブロック名前による分析は、クラスの初期化ブロックが初期化されるクラスを担当し、一般的な初期化ブロック初期化されたオブジェクトを実装するための責任があります。

  • ではstatic{}サラウンドフォーマットのクラス変数の初期化。
  • クラスを担当する静的な初期化ブロックおよび関連するクラスは、初期化されるので、これは常に通常の初期化ブロックよりも実行する必要があります。
  • 典型的には、インスタンス変数が初期化処理できない、クラス初期化プロセス変数を実行するために使用されます。
  • 静的初期化ブロックは、静的クラスメンバーに属し、静的メンバは、非アクセス静的メンバーのルールに従うことができない。すなわちないアクセス非静的メンバ(インスタンス変数とインスタンスメソッド)
  • 同様に、静的な初期化ブロック指定し、初期値は、静的メンバ変数宣言クラス初期化コードの時間を。

初期化ブロックのコンストラクタ

上の呼び出しシーケンスの初期ブロックコンストラクタと有し、結合コードを一度に理解されるべきです。

package com.my.pac17;

/**
 * @auther Summerday
 */
public class A {
    {
        System.out.println("A.instance initializer");
    }
    static {
        System.out.println("A.static initializer");
    }
    public A() {
        System.out.println("A.A");
    }
}
class B extends A {
    {
        System.out.println("B.instance initializer");
    }
    static {
        System.out.println("B.static initializer");
    }
    public B() {
        System.out.println("B.B");
    }
    public B(String m) {
        this();
        System.out.println("B.B," + m);
    }
}
class C extends B {
    {
        System.out.println("C.instance initializer");
    }
    static {
        System.out.println("C.static initializer");
    }
    public C() {
        super("ccc");
        System.out.println("C.C");
    }
}
class BTest {
    public static void main(String[] args) {
        new C();
        System.out.println("*******");
        new C();
    }
}
/*测试结果*/
A.static initializer
B.static initializer
C.static initializer
/*类初始化阶段,限制性最顶层父类的静态初始化块
然后依次向下,直到执行当前类的静态初始化块*/
A.instance initializer
A.A
B.instance initializer
B.B//调用B的无参构造器
B.B,ccc//调用B的带参构造器
C.instance initializer//最后执行C
C.C
/*对象初始化阶段,先执行最顶层父类的初始化块,
最顶层父类的构造器,然后依次向下,直到执行当前
类的初始化块、当前类的构造器*/
*******
//不用执行静态初始化语句
A.instance initializer
A.A
B.instance initializer
B.B
B.B,ccc
C.instance initializer
C.C
  • 静的初期化ブロックの静的な変更は、常に最初に呼び出されると、継承に、静的初期化ブロック最古の親クラスが最初に実行します。
  • あなたは、サブクラスのオブジェクト秒の時間を作成する際に、初期化されているため、もはや行い、静的な初期化ブロックが存在しない、見ることができる三つのクラスが正常にロードされていますが
  • 最も初期から現在のクラスへの通常の初期化ブロックのコンストラクタを実行する前に共通の初期化ブロックの実行順序とするように構成されているが、親クラスを有しています。

おすすめ

転載: www.cnblogs.com/summerday152/p/12075028.html