修飾子finalとstaticの浅い分析


一般に解析を行う場合、クラス、メソッド(構築メソッド、メンバーメソッド)、変数(メンバー変数(静的変数、インスタンス変数)、ローカル変数の3つの側面から解析が行われます.
一、static修飾子:
staticによって修飾された変数および方法、クラスのすべてのインスタンス .クラスをロードするときにメモリが1回しか割り当てられません.
  • 静的変数:Person.aに直接クラス名でアクセスできます.
  • 静的メソッド:Person.say()に直接クラス名でアクセスできます.静的メソッド内では、静的変数にアクセスすることができるが、 this および は、すべてのインスタンスに共有するため、どのインスタンスオブジェクトに属するか判断できない
  • である.
  • 静的コードブロック:java仮想マシンはクラスのロード時にコードブロック
  • を実行する.
    二、final修飾子:
    final修飾表示 ( )の意味があります.
  • finalクラス:継承できない(すなわち、サブクラスがない).
  • finalメソッド:布団クラスのメソッドオーバーライドはできません(finalは構造メソッドを修飾するために使用されず、親クラスと子クラスの間の構造メソッドはオーバーライド関係が存在せず、final修飾は意味がありません).
  • final修飾変数:すなわち定数であり、定数は一度しか与えられず、その後は変更できない. (final static int a=2*3;コンパイル時に具体的な値を算出できる)に属し、コンパイル時にこの値を定数プールに入れ、aがアクセスされるとクラスは初期化されない(これは ).クラスの静的変数または静的メソッドにアクセスすると、クラスが初期化されます(これは です). はクラスが初期化されたときにのみ付与されます).詳細については、“ ”---ロード(ヒープ領域、メソッド領域)--接続(検証、準備(静的変数割り当てメモリ、デフォルト初期値0の設定)、解析(シンボル参照を直接参照、すなわちメソッド領域へのポインタのメモリ位置に置き換える)--初期化(プログラム対クラスまたはインタフェース の場合にのみ初期化されます.
  • を参照してください.
    三、クラスの初期化タイミング: 、すなわちjava仮想マシンがクラスのstatic に初期値を付与します(これは、準備フェーズのデフォルト初期値が0に設定されているのとは異なります).クラスの のみです.
    1.クラスのアクティブな使用(6種類):
  • クラスのインスタンスを作成する:new文でインスタンスPersonps=new Person()を作成する;
  • 呼び出しクラスの静的変数または静的変数に値を割り当てる:
    public class Person{ 
    static int a=2*3;  //  final static int a=2*3;     
    static{  //Java                   ,       。System.out.println()       println   ,                    。     static   
        System.out.println("init Person"); //static        ,                        。              。
    } 
    } 
    呼び出し時書く:
    System.out.println("a="+Person.a); //       new  Person      ,    Person  。
  • 呼び出しクラスの静的メソッド
  • java APIでの反射方法を呼び出す:Class.forName(「Person」);
  • サブクラスを初期化するときに親を初期化する(ただし、「親」がインタフェースである場合、実装インタフェースを先に初期化することはなく、プログラムがインタフェースの静的変数を使用する場合にのみ静的インタフェースを初期化する)
  • .
  • java仮想マシン起動時に起動クラスと表記するクラス
  • 2.クラスの受動使用:
  • finalタイプの静的変数は、コンパイル時に値を算出することができる(すなわち 、コンパイル時にこの値を定数プールに入れた):注:finalタイプの静的変数は、コンパイル時に変数の値を算出できない(すなわち )場合に初期化される
      final static int a=2*3;                 //  a      
      final static int a=(int)Math.random();  //  a        (      )
  • である.
  • 「親」がインタフェースである場合、実装インタフェースを先に初期化することはなく、プログラムがインタフェースの静的変数を使用する場合にのみ静的インタフェースを
  • 初期化する.
  • ClassLoaderクラスのloadClass(「Person」)メソッドの場合、クラスへのロードのみで初期化ではありません.Class.forName(「Person」)は、
  • 初期化されます.