JAvaの概要とjavaの迅速な理解(七)


JAvaの修飾子staticは静的を表し、属性、メソッド、コードブロックを修飾することができます.1,staticは属性(インスタンス変数)(クラス変数)を修飾し,この属性はクラス名.属性名でアクセスでき,この属性は本クラスのクラス変数となり,本クラスオブジェクトに共有される.この属性は全クラス公有である.(共有するクラス変数はオブジェクトに関係なく、クラスのみに関係します).例:
public class Test{
private static int testnum;
/*
          static     ,         
*/
……
}

 クラスロードのプロセスは、クラス自体がファイルに保存され(バイトコードファイルはクラスの情報が保存されている)、javaはI/Oストリームを介してクラスのファイル(バイトコードファイル)をJVM(java仮想マシン)に読み込み、このプロセスをクラスのロードと呼ぶ.JVM(java仮想マシン)は、クラスパス(CLASSSPATH)を介してロードするバイトコードファイルを探します.クラス変数は、ロード時に自動的に初期化され、初期化ルールはインスタンス変数と同じです.注意:クラス内のインスタンス変数は、オブジェクトの作成時に初期化され、static修飾のプロパティ、クラス変数は、クラスのロード時に作成され、初期化され、クラスのロードのプロセスは1回のみ行われます.クラス変数は一度だけ作成され、初期化されます.2,static修飾メソッド(静的メソッド)は,このメソッドをクラス全体に共通のメソッドとし,クラス名.メソッド名でアクセスする.例:
public class Test{
private static int testnum;
public int testage;
public static int test(){
testnum++;
Test t=new Test();
t.testage
/*
              ,         
        
*/
}
}

 
注意:1)static修飾の方法は、直接アクセスできない(組合せでアクセスできる)本クラスの非静的(static)メンバー(方法と属性を含む)が、本クラスの非静的(static)メソッドは本クラスの静的メンバー(方法と属性を含む)にアクセスでき、静的メソッドを呼び出すことができる.静的方法は慎重に使用しなければならない.静的メソッドではthisキーワードは表示されません.2)静的メソッドのオーバーライドに関する問題:<1>親クラスでは静的メソッドであり,子クラスでは非静的メソッドとしてオーバーライドすることはできず,オーバーライド規則に合致する前提で,親子クラスでは親クラスでは静的メソッドをクラスでオーバーライドすることができるが,多態ではない.(オブジェクトを使用して静的メソッドを呼び出す場合、コンパイル時のタイプの静的メソッドを呼び出す)<2>親子クラスでは、静的メソッドは静的メソッドのみで上書きされ、親子クラスでは、非静的メソッドは非静的メソッドのみで上書きされます.Javaではmainメソッドをstaticと書く必要があります.クラスのロード時にオブジェクトを作成することはできません.静的メソッドはオブジェクト呼び出しなしでmainメソッドは静的です.クラスのロード時にmainメソッドエントリでプログラムを実行できます.注:コンビネーションでは、静的な制約のみにアクセスできるように、必要なオブジェクトをメソッドに作成し、必要なオブジェクトの内容を呼び出す必要があります.例:
public class Test{
private int a;
public static void main(String[] args){
}
public static void test(){
Test t=new Test();
t.a=20;
}
}

 3,staticは初期コードブロックを修飾し,この初期コードブロックを静的初期コードブロックと呼び,このコードブロックはクラスロード時に一度だけ実行される.静的初期コードブロックを使用してクラスを初期化できます.初期化コードブロックはクラス内のコードブロックであり,メソッドの実装ではない.クラスのプロパティを初期化するために使用できます.例:
public class Test{
private static int testnum;//         
static{//        
testnum=12;
}
}
       ,      “{}”,                   。             。
 :
public class Test{
private static int testnum;//         
{//        
testnum=12;
}
}

 
 
クラスがいつロードされるかは、オブジェクトを構築(作成)すると必ずロードされます.クラス内の静的メソッドを呼び出すか、静的プロパティにアクセスすると、この静的メソッドが実際に存在するクラスもロードされます.親オブジェクトを構築する場合、子クラスの静的メソッドを呼び出したり、静的プロパティにアクセスしたりしないと、子クラスはロードされません.子オブジェクトを作成するときに必ず親がロードされます.クラス・ロードの遅延ロードの原則は、ロードが必要な場合にのみロードされます.単一モードは、このクラスのオブジェクトインスタンスを生成する例です.
public class TestSingleton{
public static void main(String[] args){
}
}
class LaoGong{
/*
     ,                   
          ,              
*/
private static LaoGong lg=null;
private LaoGong(){}
public static LaoGong newInstance(){
if (lg==null) lg=new LaoGong();
return lg;
}
}
class Wife{
/*
        ,                ,  
                      ,     
         
*/
private static Wife w=new Wife();
private Wife(){}//      
public static Wife newInstance(){
return w;
}
}