ホームページ >Java >&#&チュートリアル >Java 改良章 (11)-----コード ブロック

Java 改良章 (11)-----コード ブロック

黄舟
黄舟オリジナル
2017-02-10 11:20:121161ブラウズ

public class Test {
    {
        ////
    }
}


中括弧 ({}) を使用して複数行のコードを一緒にカプセル化し、特定の実装用の独立したデータ本体を形成します。アルゴリズム。一般に、コード ブロックは単独で実行することはできず、実行本体が必要です。 Java には主に 4 つのタイプのコード ブロックがあります。

1. 通常のコード ブロック

通常のコード ブロックは、メソッド名の後に {} 括弧を使用します。 。通常のコード ブロックは単独で存在することはできず、メソッド名の後に続く必要があります。また、メソッド名を使用して呼び出す必要があります。

public class Test {
    public void test(){
        System.out.println("普通代码块");
    }
}


2. 静的コードブロック

静的というと、静的コードブロックは、静的で変更された {} で囲まれたコードセグメントを思い浮かべます。その主な目的は、静的プロパティを初期化することです。

public class Test {
    static{
        System.out.println("静态代码块");
    }
}


3. 同期されたコードブロック

「{}」で囲まれた同期されたキーワードとコードスニペットで変更されており、同時にスレッドが 1 つだけ存在できることを意味しますこのメソッド ブロックに入るのは、マルチスレッド保護メカニズムです。

4. 構築コードブロック

修飾子、接頭辞、接尾辞なしでクラス内で直接定義されたコードブロックは構築コードブロックです。クラスには、オブジェクトの作成時に呼び出されるコンストラクターが少なくとも 1 つ必要であることを理解しています。コンストラクターと同様に、コンストラクション コード ブロックもオブジェクトの生成時に呼び出されます。では、コンストラクション コードはいつ呼び出されるのでしょうか。なんと呼びますか?次のコードを見てください:

public class Test {
    /**
     * 构造代码
     */
    {
        System.out.println("执行构造代码块...");
    }
    
    /**
     * 无参构造函数
     */
    public Test(){
        System.out.println("执行无参构造函数...");
    }
    
    /**
     * 有参构造函数
     * @param id  id
     */
    public Test(String id){
        System.out.println("执行有参构造函数...");
    }
}


非常に単純なクラスが上で定義されており、これには引数のないコンストラクター、パラメーター化されたコンストラクター、および構築コード ブロックが含まれており、これも上で説明されていますコード ブロックでは、コンパイラはコード ブロックの構築をどのように処理するのでしょうか。コンパイラは、コード ブロックをその順序で (複数のコード ブロックがある場合) すべてのコンストラクターの先頭に挿入します。これにより、どのコンストラクターが呼び出されても、構築されたすべてのコード ブロックが確実に実行されます。上記のコードは、次の形式と同等です:

public class Test {
    /**
     * 无参构造函数
     */
    public Test(){
        System.out.println("执行构造代码块...");
        System.out.println("执行无参构造函数...");
    }
    
    /**
     * 有参构造函数
     * @param id  id
     */
    public Test(String id){
        System.out.println("执行构造代码块...");
        System.out.println("执行有参构造函数...");
    }

}

       运行结果

public static void main(String[] args) {
        new Test();
        System.out.println("----------------");
        new Test("1");
    }
------------
Output:
执行构造代码块...
执行无参构造函数...
----------------
执行构造代码块...
执行有参构造函数...


上記の実行結果から、オブジェクトを新規作成する場合、常に構築コードが最初に実行され、次にコンストラクターが実行されますが、注意すべき点が 1 つあります。コンストラクター コードはコンストラクターの前に実行されるのではなく、コンストラクターに基づいて実行されることに注意してください。構築コード ブロックが次のシナリオでよく使用されるのは、まさにこのような特性があるためです:

1. インスタンス変数の初期化 クラス内に複数のコンストラクターがある場合、これらコンストラクター 関数はインスタンス変数を初期化する必要があります。コンストラクター内で直接インスタンスを作成すると、大量の繰り返しコードが生成されるため、煩雑で可読性も低くなります。ここでは、構築されたコード ブロックを最大限に活用してこれを実現できます。これは、コンパイラが構築コードのブロックを各コンストラクターに追加するという事実を利用しています。

2. インスタンス環境を初期化します

       一个对象必须在适当的场景下才能存在,如果没有适当的场景,则就需要在创建对象时创建此场景。我们可以利用构造代码块来创建此场景,尤其是该场景的创建过程较为复杂。构造代码会在构造函数之前执行。

       上面两个常用场景都充分利用构造代码块的特性,能够很好的解决在实例化对象时构造函数比较难解决的问题,利用构造代码不仅可以减少代码量,同时也是程序的可读性增强了。特别是当一个对象的创建过程比较复杂,需要实现一些复杂逻辑,这个时候如果在构造函数中实现逻辑,这是不推荐的,因为我们提倡构造函数要尽可能的简单易懂,所以我们可以使用构造代码封装这些逻辑实现部分。

       五、 静态代码块、构造代码块、构造函数执行顺序

       从词面上我们就可以看出他们的区别。静态代码块,静态,其作用级别为类,构造代码块、构造函数,构造,其作用级别为对象。

       1、 静态代码块,它是随着类的加载而被执行,只要类被加载了就会执行,而且只会加载一次,主要用于给类进行初始化。

       2、 构造代码块,每创建一个对象时就会执行一次,且优先于构造函数,主要用于初始化不同对象共性的初始化内容和初始化实例环境。

       3、 构造函数,每创建一个对象时就会执行一次。同时构造函数是给特定对象进行初始化,而构造代码是给所有对象进行初始化,作用区域不同。

       通过上面的分析,他们三者的执行顺序应该为:静态代码块 > 构造代码块 > 构造函数。


public class Test {
    /**
     * 静态代码块
     */
    static{
        System.out.println("执行静态代码块...");
    }
    
    /**
     * 构造代码块
     */
    {
        System.out.println("执行构造代码块...");
    }
    
    /**
     * 无参构造函数
     */
    public Test(){
        System.out.println("执行无参构造函数...");
    }
    
    /**
     * 有参构造函数
     * @param id
     */
    public Test(String id){
        System.out.println("执行有参构造函数...");
    }
    
    public static void main(String[] args) {
        System.out.println("----------------------");
        new Test();
        System.out.println("----------------------");
        new Test("1");
    }
}
-----------
Output:
执行静态代码块...
----------------------
执行构造代码块...
执行无参构造函数...
----------------------
执行构造代码块...
执行有参构造函数...


以上就是java提高篇(十一)-----代码块的内容,更多相关内容请关注PHP中文网(www.php.cn)!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。