Javaのインタビュー、多くの場合、テストコードがロードされ、コードブロックベースのシーケンシャル静的

転送:   https://blog.csdn.net/harryptter/article/details/87875399

 

 https://blog.csdn.net/harryptter/article/details/87875399
インタビュー大企業では、あなたが頻繁にコードブロックとコードのロードシーケンスに遭遇したペンの質問に書かれた大規模な国有企業または大規模なプライベートインターネットを、発生した場合。ここで要約するだけでなく、私たちの小さなパートナーの利便んではない乗り物酔いをすることができません。

ソースgithubのアドレスします。https://github.com/harrypitter/JavaBase.git

します。https://blog.csdn.net/a724888/article/details/80069472より転載パート

ディレクトリ

簡単な紹介

部分ブロック

コンフィギュレーションコードブロック

静的コードブロック

ペンの質問

はじめに
このホワイトペーパーでは、機能について説明し、コードブロックの3種類を使用しています。

コードのブロック:コード} {によって取り囲ま

コードブロック内のその位置は4分割されたJava。

部分ブロック
位置:ローカル(内部メソッド)の位置
効果:ライフサイクル定義された変数、初期のリリースは、メモリを節約するために
実行したときにそのメソッド呼び出しを:コール

パブリッククラス部分ブロック{
@Test
公共ボイド試験(){
    B B B =新しい新しい();
    b.go();
}
}
クラスB {
    B(){}
    公共ボイドゴー(){
        //ローカルプロセスコードブロック、通常は1回の呼び出しは、次の呼び出し時に占領スタック領域を避けるために、完成した空間の即時解放を呼び出し
        スタックメモリスペースが限られているので、メソッド呼び出しは、ローカル変数の多くを生成することがあります//不足スタックメモリにつながります。
        //ローカル使用のコードブロックを発生し、このような状況を回避します。
        {
            のInt I = 1;
            のArrayList <整数> =新しい新規リストのArrayList <>();
            一方、(Iは10 <){
                List.add(I ++);
            }
            (整数J:リスト)のために{
                System.out.printlnは( J);
            }
            のSystem.out.println( "GOGOGO")。
        }
        のSystem.out.println( "こんにちは");
    }
}
出力:


構成コードブロック
場所:クラスメンバーの位置は、クラスメソッドの外側の位置で
抽出されたコンフィギュレーション方法の複数の共通部分が、共通コード・ブロックが設定:アクション
を呼び出すために:各コンストラクタメソッドが優先的に実行されるコンストラクタで呼び出されます、自動的に新しいオブジェクトは、オブジェクトを初期化されるたびに呼び出されます

オブジェクト、一度回実行インスタンス化されたそれぞれの実装例。

{クラス
    のint I = 1;
    INT initValue; //コードの完全なブロックにメンバ変数を初期化する
    {
        //コードブロックの役割はこれに反映:変数が初期化されている部材にコードの一部によって、コンストラクタを呼び出す前に。
        //代わりに、その後、コンストラクタが呼び出されたとき。典型的には、コンストラクタの同じ部分を抽出するために使用されます。
        //
        {(; Iは、100 <I ++はI = 0の整数)ため
            initValue + = I;
        }
    }
    {
        のSystem.out.println(initValue)
        のSystem.out.println(I); //プリント今回1
        INT I = 2;競合せず//ブロック内の変数とメンバ変数が、可変優先コードブロック使用
        するSystem.out.println(i)を; //プリント2
        //System.out.println( J); //プロンプト違法後方参照、Jの初期化はまだ始まっていないので。
        //
    }
    {
        するSystem.out.println( "コードブロックを実行");
    }
    = 2 INT J;
    {
        のSystem.out.println(J)
        のSystem.out.println(I); //自動的にコードブロック変数の後に放出され、コードブロック以外のコードに影響しない
    }
    Aを(){
        System.out.println( "ランコンストラクタ");
    }
}
publicクラスの構成ブロック{
    @Test
    公共ボイド試験(){
        A = A新しい新しいA();
    }
}
 結果:


静的ブロックの
 位置:クラスメンバーの位置、修飾された静的ブロックによって

 役割:一度だけクラスロードいくつかの初期化、新しい複数のオブジェクト、最初の静的コードブロックの呼び出し、静的コードブロックがクラスに属しているため、すべてのオブジェクトを共有します

 コール:新しいオブジェクトがあるときに自動的に呼び出されます 

パブリッククラスの静的コードブロック{
 
@Test
公共ボイド試験(){
    C = C1新しい新しいC();
    C C2 = C新しい新しい();
    //結果のすべてのオブジェクト、一度だけ呼び出されるコードの静的ブロックは、クラスコードブロックを共有
    //一般的なクラスのグローバルな情報を初期化する
    静的コードブロック呼び出しは//
    //コードブロックを呼び出し
    //コンストラクタメソッド呼び出し
    //コードブロックを呼び出し
    //コンストラクタコール
}
 
}
クラスC {
    C(){
        するSystem.out.printlnを( "コンストラクタコール");
    }
    {
        のSystem.out.println( "コードブロック呼び出し");
    }
    静的{
        するSystem.out.println( "静的コードブロック呼び出し");
    }
}
コール結果:


 

静的コードブロックの実行順序 - >ブロックを構成--->コンストラクタ

ペンが質問
実際の面接の質問:

次のプログラム出力を書きます:

パブリッククラスHelloA {
    パブリックHelloA(){
        System.out.printlnは( "HelloA")。
    }
    {
        のSystem.out.println(「私はクラスです」)。
    }
 
    静的{
        するSystem.out.println( "静的A")。
    }
}
 
publicクラスのHelloBはHelloA {延び
    パブリックHelloB(){
        System.out.printlnは( "HelloB")。
    }
    {
        のSystem.out.println( "私はBクラスです")。
    }
 
    静的{
        するSystem.out.println( "静的B")。
    }
 
    パブリック静的無効メイン(文字列[] args){
        新しいHelloB()。


 

分析:静的コードブロックを知って最初にすることが構築ブロックや建設方法は、オブジェクトの作成がロードされている、クラスおよび負荷がロードされています

1、最初に実行した後、何も言うことはありませんHelloBクラス、コード実行のHelloBクラスの静的ブロックを、ロードされたHelloAクラス、静的コードブロックのHelloAの種類をロードするためにHelloB.java、原因HelloB継承HelloAをコンパイルするとき

2、その後、HelloBオブジェクトを作成し、我々はすべてのコンストラクタに優先して建設コードブロックの実行が、質問があり、この時間は、その後、クラスのコンストラクタのHelloBを見なければならないことを知って、HelloBクラスのコンストラクタメソッドは、暗黙的にスーパーがあります(は)のでHelloAクラスコンストラクタを見つける、最初に実行、およびコンストラクタHelloAクラスは、(暗黙超を有する)、実行(コンストラクタは、オブジェクト・クラスを呼び出し)、およびNO結果が返されない、次のになっています方法HelloAクラスのコンストラクタは、前駆ブロックHelloAクラス(I、クラスだ)の構成の実行前に実行され、その後、HelloAクラスのコンストラクタその方法を実行する(すなわち、ハローA)、そして最終的に戻ってクラス構造HelloBに方法は、時間HelloBクラススーパー()メソッド本体HelloBクラス(IはBクラスです)の前に実行されるコードブロックHelloBクラスのコンストラクタを実行するように構成され、実行を終了した後、クラスのコンストラクタが実行される紫本体(HellB)。

継承の初期化シーケンスいいえ:

継承初期化シーケンス:

 次に、ペンアリの質問を見てみましょう。

Bクラス公開
{
    パブリック静的新しい新B = B T1();
    パブリック静的新しい新B = B T2();
    {
        のSystem.out.println( "ビルディングブロック");
 
    }
    静的
    {
        するSystem.out.println( "静的ブロック" );
 
    }
 
    公共の静的な無効メイン(文字列[] args)
    {
 
        B T新しい新B =();
 
    }
}
実行結果は次のとおりです。

なぜ:

静的ブロック

ビルディングブロック

ビルディングブロック

ビルディングブロック

 

その理由は次のとおりです。

静的なブロックは:静的断言実行一度だけでクラスをロードするJVMを実行します

ビルディングブロック:各々が直接オブジェクトを作成し、{}で定義されたクラスを実行します

実行の優先順位:静的ブロック>メイン()>ビルディングブロック>コンストラクタ

静的ステートメント酒T1ため、T2は、静的ブロックが同じ優先度であると、オブジェクトを構築するために同じ優先順位を取る最初に、静的な位置まで上昇、オブジェクトが構築され、静的ブロック

 

 

 

 

 


 
--------------------- 
著者:harryptterの 
出典:CSDN 
オリジナルます。https://blog.csdn.net/harryptter/article/details/87875399 
免責事項:この記事ブロガーのオリジナルの記事、複製など、ボーエンのリンクを添付してください!

おすすめ

転載: blog.csdn.net/qq_36688928/article/details/91418903