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