JAvaでのstaticの詳細

2667 ワード

『javaプログラミング思想』:
通常、クラスを作成するときに、そのクラスのオブジェクトの外観と動作を指摘します.newでそのクラスのオブジェクトを作成しない限り、実際には何も得られません.newが実行されている場合にのみ、データストレージスペースが正式に生成され、対応するメソッドが使用されます.
しかし、2つの特殊な場合、上記の方法は役に立たない.1つのケースでは、特定のデータを1つのストレージ領域で保存したいだけです.複数のオブジェクトを作成しても、オブジェクトは作成されません.もう1つの状況は、このクラスのオブジェクトに関連付けられていない特殊な方法が必要です.すなわち,オブジェクトを作成しなくても呼び出せる方法が必要である.
この2つの要件を満たすためにstatic(静的)キーワードを使用します.何かをstaticに設定すると、データやメソッドはそのクラスのオブジェクトインスタンスに関連付けられません.したがって、そのクラスのオブジェクトは作成されていませんが、staticメソッドを呼び出したり、staticデータにアクセスしたりすることができます.その前に、static以外のデータとメソッドでは、オブジェクトを作成し、そのオブジェクトでデータまたはメソッドにアクセスする必要があります.これは、static以外のデータとメソッドが動作する特定のオブジェクトを知らなければならないためです.
注意:staticを分析するときは、ストレージの特徴を把握します.
(1)静的方法
ソース:http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796209.html
Javaでは、オブジェクトを作成する必要のない方法を定義できます.この方法は静的方法です.このような効果を実現するには、クラスで定義されたメソッドの前にstaticキーを付けるだけです.例:
  public static int maximum(int n1,int n2)
クラスの静的メソッドを使用する場合、aは静的メソッドではクラス内の他の静的メンバー(変数やメソッドを含む)のみを直接呼び出すことができ、クラス内の非静的メンバーに直接アクセスすることはできません.これは、非静的メソッドと変数の場合、クラスのインスタンスオブジェクトを作成してから使用する必要があり、静的メソッドは使用前にオブジェクトを作成する必要がないためです.(またはストレージ領域の問題)
b静的メソッドは、静的メソッドが使用される前にインスタンスオブジェクトを作成する必要がなく、静的メソッドが呼び出されると、thisが参照するオブジェクトはまったく生成されないため、thisおよびsuperキーワードを任意の方法で参照することはできません.
 静的変数は、オブジェクトではなくクラス全体に属する変数です.注意:fun(){static int i=0;//不正など、メソッド内の変数を静的に宣言することはできません.
(2)静的コードブロック
ソース:http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796209.html
1つのクラスは、任意のメソッドボディに含まれない静的コードブロックを使用することができ、クラスがロードされると、静的コードブロックが実行され、1回のみ実行され、静的ブロックはクラス属性の初期化を実行するためによく使用される.例:static{}
クラスマウントステップJavaでは、クラスマウントは1つのクラスをJava仮想マシンにマウントし、マウント、リンク、初期化の3つのステップを経て完了します.リンクは検証、準備、解析の3つのステップに分けることができます.解析のほか、他のステップは厳格に順序に従って完了します.各ステップの主な仕事は以下の通りです.
マウント:クラスまたはインタフェースのバイナリデータの検索とインポート;リンク:次の検証、準備、および解析ステップを実行します.ここで、解析ステップは選択できます.検証:インポートクラスまたはインタフェースのバイナリデータの正確性を確認します.準備:クラスの静的変数にストレージスペースを割り当てて初期化します.解析:シンボル参照を直接参照に変換します.≪初期化|Initialization|emdw≫:クラスの静的変数の初期化Javaコードと静的Javaコードブロックをアクティブにします.初期化クラスのプロパティは静的コードブロックの一般的な用途ですが、一度しか使用できません.
(3)コード分析
  
package org.jilichuan.www;



public class test {

	{

		System.out.println("NoStatic Block");

	}

	static{

		System.out.println("Static Code Block");

	}

	public static void main(String args[])

	{

		System.out.println("Main Function");

		test t = new test();

		System.out.println("End");

	}



}


次のように印刷します.
  
Static Code Block

Main Function

NoStatic Block

End


プロジェクトを開始すると、クラスが読み込まれ、「Static Code Block」が発生します.
main関数を起動すると、「Main Function」と印刷されます.
クラスを呼び出すと、オブジェクトが作成され、各オブジェクトにある「NoStatic Block」が表示されます.
      最後に「End」を印刷