Javaベースメンバー変数とローカル変数
5519 ワード
Javaでは、変数の位置を定義することによって、メンバー変数とローカル変数の2つのクラスに変数を分けることができます.一、メンバー変数とローカルメンバー変数とは、クラスで定義された変数、すなわち前述のfieldを指す.ローカル変数とは、メソッドで定義された変数を指します.
メンバー変数はクラス変数とインスタンス変数の2つに分けられます.メンバー変数を定義するときにstatic修飾がないのがインスタンス変数であり、static修飾があるのがクラス変数である.クラス変数は、システムがこのクラスを完全に破棄するまで、クラスの準備段階から存在し、クラス変数の役割ドメインはこのクラスの生存範囲と同じである.インスタンス変数は、システムがインスタンス変数を完全に破棄する役割ドメインが対応するインスタンスの生存範囲と同じになるまで、クラスのインスタンス変数が作成され始めます.
このため,クラス変数とインスタンス変数をメンバー変数と総称することができる.クラス変数はクラスメンバー変数として理解でき、クラス自体のメンバーとしてクラス自体と共存する.インスタンス変数は、インスタンス変数メンバーとして理解され、インスタンスのメンバーとしてインスタンスと共有されます.
クラスが存在する限り、プログラムはクラスのクラス変数にアクセスできます.プログラムにアクセスするクラス変数は、クラスという構文を用いる.クラス変数
インスタンスが存在する限り、プログラムはインスタンスのインスタンス変数にアクセスできます.プログラムでインスタンスにアクセスする変数は、次の構文:インスタンス.インスタンス変数
もちろん、クラス変数はそのクラスのインスタンスにアクセスするもよく、インスタンスによってクラス変数にアクセスする構文は以下の通りである.クラス変数
しかし、このインスタンスはこのクラス変数を持つわけではないため、このインスタンスの変数ではなく、クラスのクラス変数にアクセスします.
クラス変数の役割ドメインはインスタンス変数の役割ドメインよりも大きい:インスタンス変数はインスタンスの存在に伴って存在し、クラス変数はクラスの存在に伴って存在し、インスタンスはクラス変数にもアクセスでき、同じクラスのすべてのインスタンスがクラス変数にアクセスする場合、実際にはそのクラス自体の同じ変数にアクセスする.つまり、同じメモリ領域にアクセスしました.
ローカル変数は定義形式によって異なります.次の3つに分けられます.①パラメータ:メソッド署名を定義するときに定義される変数で、パラメータの役割ドメインはメソッド全体で有効です.
②メソッドローカル変数:メソッド内で定義されたローカル変数で、その役割ドメインはその変数を定義した場所から有効になります.このメソッドの終了時に失効します.
③コードブロックローカル変数:コードに定義されたローカル変数であり、このローカル変数の役割ドメインは、その変数を定義した場所から有効となり、そのコードブロックの終了時に失効する.
次のコードは、コードブロックのローカル変数を定義するインスタンスプログラムです.
以上から,コードブロックの局所変数が存在するコードブロックを離れると,この局所変数は直ちに破棄され,非可視になることが分かる.
二、メンバー変数の初期化とメモリ内の実行メカニズムシステムシステムがクラスをロードするか、クラスのインスタンスを作成すると、システムは自動的にメンバー変数にメモリ空間を割り当て、メモリ空間を割り当てた後、自動的にメンバー変数に初期値を指定する.
1行目のコードPerson=new Person()を指す場合.この行のコードがPersonクラスを初めて使用する場合、システムは通常、Personクラスを初めて使用するときにこのクラスをロードし、このクラスを初期化します.クラスの準備フェーズでは、クラスのクラス変数にメモリ領域を割り当て、デフォルトの初期値を指定します.
Personクラスの初期化が完了すると、システムはヒープメモリ領域にPersonクラスのメモリを割り当て(Personクラスの初期化が完了すると、Personクラスのクラスオブジェクトが作成されます)、eyeNumクラス変数のメモリを保存し、eyeNumのデフォルトの初期値:0を設定します.
システムは次にPersonオブジェクトを作成し、このPersonオブジェクトをp 1変数に割り当てます.Personオブジェクトにはnameというインスタンス変数が含まれています.インスタンス変数はインスタンス変数を作成するときにああメモリ空間を指定し、初期値を指定します.
eyeNumクラス変数はPersonオブジェクトではなく、Personクラスに属しているため、Personオブジェクトを作成するときにeyeNumクラス変数にメモリを割り当てる必要はありません.システムはnameインスタンス変数にメモリ領域を割り当て、デフォルト値:nullを指定します.
プログラムがp 1を実行する.name=「張三」;コードの場合、p 1のnameインスタンス変数に値を割り当てます.つまり、スタックメモリのnameを「張三」に指します.
nameインスタンス変数は単一Personインスタンスに属するため、最初のPersonオブジェクトのnameインスタンス変数を変更するときはそのオブジェクトのみに関係し、Personクラスや他のPersonオブジェクトとは何の関係もありません.
p 1でクラス変数にアクセスする場合,実際にアクセスするのはPersonクラスのeyeNumクラス変数である.実際、すべてのPersonインスタンスがeyeNumクラス変数にアクセスすると、PersonクラスのeyeNumクラス変数にアクセスします.すなわち、eyeNumクラス変数にどのPersonインスタンスでアクセスしても、本質はPersonクラスでeyeNumクラス変数にアクセスし、同じメモリにアクセスします.
この理由に基づいて、プログラムがクラス変数にアクセスする必要がある場合、できるだけクラスをプライマリコールとして使用し、オブジェクトをプライマリコールとして使用しないようにすることで、曖昧さを回避し、プログラムの可読性を高めることができる.
三、局部変数の初期化とメモリ中の運行メカニズム
ローカル変数を定義した後、明示的に初期化してから使用する必要があります.ローカル変数の初期化は実行されません.これは、ローカル変数を定義した後、プログラムがこの変数に初期化値を割り当てるまで、システムがローカル変数にメモリを割り当て、初期化値をこのメモリに保存するまで、システムがこの変数にメモリ空間を割り当てていないことを意味します.
メンバー変数とは異なり、ローカル変数はクラスまたはインスタンスに属しないため、メソッドのスタックメモリに常に保存されます.ローカル変数が基本タイプの変数である場合、この変数の値を直接その変数に対応するメモリに保存します.ローカル変数の場合、タイプの変数を参照すると、この変数にはアドレスが格納され、その変数が実際に参照しているオブジェクトや配列に参照されます.
スタックメモリの変数は、システムゴミ回収を必要とせず、メソッドまたはコードブロックの実行が終了するにつれて終了することが多い.したがって、ローカル変数の役割ドメインは、メソッドまたはコードブロックの実行が完了するまで、変数の初期化から開始する.ローカル変数は基本タイプの値またはオブジェクトの参照のみを保存するため、ローカル変数が占めるメモリ領域は通常小さい.
四、変数の使用規則は以下のいくつかの場合、メンバー変数の使用を考慮すべきである.①特定の変数を定義するときに、クラスまたはオブジェクト固有の情報、例えば人間の身長、体重などの情報を記述するために使用される場合、それらは人間オブジェクト固有の情報であり、各オブジェクトはこれらの情報を有する.この変数はメンバー変数として定義する必要があります.このような情報がこのクラスのすべてのインスタンスに対して完全に同じである場合、またはそれがクラスに関連している場合、例えば人の目の数、すべての人の目の数は2であり、このようなクラスに関連する情報はクラス変数として定義されるべきである.この情報がインスタンスに関連している場合、例えば人間の身長、体重が互いに異なる場合、この情報はインスタンスに関連している場合、インスタンス変数として定義されるべきである.
②あるクラスにおいて、そのクラスまたはインスタンスの実行時の状態情報、例えば、五子棋プログラムの碁盤配列を変数で保存する必要がある場合、五子棋インスタンスの実行時の状態情報を保存するために使用される.クラスまたはクラスインスタンスのステータス情報を勇敢に保存する変数は、通常、メンバー変数を使用する必要があります.
③ある情報をクラスの複数のメソッド間で共有する必要がある場合、この情報はメンバー変数を使用して保存する必要があります.
プログラムでローカル変数を使用しても、できるだけローカル変数の作用範囲を縮小する必要があります.ローカル変数の作用範囲が小さいほど、メモリに滞留する時間が短くなり、プログラムの実行性能もよくなります.
メンバー変数はクラス変数とインスタンス変数の2つに分けられます.メンバー変数を定義するときにstatic修飾がないのがインスタンス変数であり、static修飾があるのがクラス変数である.クラス変数は、システムがこのクラスを完全に破棄するまで、クラスの準備段階から存在し、クラス変数の役割ドメインはこのクラスの生存範囲と同じである.インスタンス変数は、システムがインスタンス変数を完全に破棄する役割ドメインが対応するインスタンスの生存範囲と同じになるまで、クラスのインスタンス変数が作成され始めます.
このため,クラス変数とインスタンス変数をメンバー変数と総称することができる.クラス変数はクラスメンバー変数として理解でき、クラス自体のメンバーとしてクラス自体と共存する.インスタンス変数は、インスタンス変数メンバーとして理解され、インスタンスのメンバーとしてインスタンスと共有されます.
クラスが存在する限り、プログラムはクラスのクラス変数にアクセスできます.プログラムにアクセスするクラス変数は、クラスという構文を用いる.クラス変数
インスタンスが存在する限り、プログラムはインスタンスのインスタンス変数にアクセスできます.プログラムでインスタンスにアクセスする変数は、次の構文:インスタンス.インスタンス変数
もちろん、クラス変数はそのクラスのインスタンスにアクセスするもよく、インスタンスによってクラス変数にアクセスする構文は以下の通りである.クラス変数
しかし、このインスタンスはこのクラス変数を持つわけではないため、このインスタンスの変数ではなく、クラスのクラス変数にアクセスします.
クラス変数の役割ドメインはインスタンス変数の役割ドメインよりも大きい:インスタンス変数はインスタンスの存在に伴って存在し、クラス変数はクラスの存在に伴って存在し、インスタンスはクラス変数にもアクセスでき、同じクラスのすべてのインスタンスがクラス変数にアクセスする場合、実際にはそのクラス自体の同じ変数にアクセスする.つまり、同じメモリ領域にアクセスしました.
ローカル変数は定義形式によって異なります.次の3つに分けられます.①パラメータ:メソッド署名を定義するときに定義される変数で、パラメータの役割ドメインはメソッド全体で有効です.
②メソッドローカル変数:メソッド内で定義されたローカル変数で、その役割ドメインはその変数を定義した場所から有効になります.このメソッドの終了時に失効します.
③コードブロックローカル変数:コードに定義されたローカル変数であり、このローカル変数の役割ドメインは、その変数を定義した場所から有効となり、そのコードブロックの終了時に失効する.
次のコードは、コードブロックのローカル変数を定義するインスタンスプログラムです.
public class BlockTest
{
public static void main(String[] args)
{
{
// a
int a;
// , a
//System.out.println(" a :" + a);
// a ,
a = 5;
System.out.println(" a :" + a);
}
// a
//System.out.println(a);
}
}
以上から,コードブロックの局所変数が存在するコードブロックを離れると,この局所変数は直ちに破棄され,非可視になることが分かる.
二、メンバー変数の初期化とメモリ内の実行メカニズムシステムシステムがクラスをロードするか、クラスのインスタンスを作成すると、システムは自動的にメンバー変数にメモリ空間を割り当て、メモリ空間を割り当てた後、自動的にメンバー変数に初期値を指定する.
// Person
Person p1 = new Person();
// Person
Person p2 = new Person();
// Person name
p1.name = " ";
p1.name = " ";
// Person eyeNum
p1.eyeNum = 2;
p2.eyeNum = 2;
1行目のコードPerson=new Person()を指す場合.この行のコードがPersonクラスを初めて使用する場合、システムは通常、Personクラスを初めて使用するときにこのクラスをロードし、このクラスを初期化します.クラスの準備フェーズでは、クラスのクラス変数にメモリ領域を割り当て、デフォルトの初期値を指定します.
Personクラスの初期化が完了すると、システムはヒープメモリ領域にPersonクラスのメモリを割り当て(Personクラスの初期化が完了すると、Personクラスのクラスオブジェクトが作成されます)、eyeNumクラス変数のメモリを保存し、eyeNumのデフォルトの初期値:0を設定します.
システムは次にPersonオブジェクトを作成し、このPersonオブジェクトをp 1変数に割り当てます.Personオブジェクトにはnameというインスタンス変数が含まれています.インスタンス変数はインスタンス変数を作成するときにああメモリ空間を指定し、初期値を指定します.
eyeNumクラス変数はPersonオブジェクトではなく、Personクラスに属しているため、Personオブジェクトを作成するときにeyeNumクラス変数にメモリを割り当てる必要はありません.システムはnameインスタンス変数にメモリ領域を割り当て、デフォルト値:nullを指定します.
プログラムがp 1を実行する.name=「張三」;コードの場合、p 1のnameインスタンス変数に値を割り当てます.つまり、スタックメモリのnameを「張三」に指します.
nameインスタンス変数は単一Personインスタンスに属するため、最初のPersonオブジェクトのnameインスタンス変数を変更するときはそのオブジェクトのみに関係し、Personクラスや他のPersonオブジェクトとは何の関係もありません.
p 1でクラス変数にアクセスする場合,実際にアクセスするのはPersonクラスのeyeNumクラス変数である.実際、すべてのPersonインスタンスがeyeNumクラス変数にアクセスすると、PersonクラスのeyeNumクラス変数にアクセスします.すなわち、eyeNumクラス変数にどのPersonインスタンスでアクセスしても、本質はPersonクラスでeyeNumクラス変数にアクセスし、同じメモリにアクセスします.
この理由に基づいて、プログラムがクラス変数にアクセスする必要がある場合、できるだけクラスをプライマリコールとして使用し、オブジェクトをプライマリコールとして使用しないようにすることで、曖昧さを回避し、プログラムの可読性を高めることができる.
三、局部変数の初期化とメモリ中の運行メカニズム
ローカル変数を定義した後、明示的に初期化してから使用する必要があります.ローカル変数の初期化は実行されません.これは、ローカル変数を定義した後、プログラムがこの変数に初期化値を割り当てるまで、システムがローカル変数にメモリを割り当て、初期化値をこのメモリに保存するまで、システムがこの変数にメモリ空間を割り当てていないことを意味します.
メンバー変数とは異なり、ローカル変数はクラスまたはインスタンスに属しないため、メソッドのスタックメモリに常に保存されます.ローカル変数が基本タイプの変数である場合、この変数の値を直接その変数に対応するメモリに保存します.ローカル変数の場合、タイプの変数を参照すると、この変数にはアドレスが格納され、その変数が実際に参照しているオブジェクトや配列に参照されます.
スタックメモリの変数は、システムゴミ回収を必要とせず、メソッドまたはコードブロックの実行が終了するにつれて終了することが多い.したがって、ローカル変数の役割ドメインは、メソッドまたはコードブロックの実行が完了するまで、変数の初期化から開始する.ローカル変数は基本タイプの値またはオブジェクトの参照のみを保存するため、ローカル変数が占めるメモリ領域は通常小さい.
四、変数の使用規則は以下のいくつかの場合、メンバー変数の使用を考慮すべきである.①特定の変数を定義するときに、クラスまたはオブジェクト固有の情報、例えば人間の身長、体重などの情報を記述するために使用される場合、それらは人間オブジェクト固有の情報であり、各オブジェクトはこれらの情報を有する.この変数はメンバー変数として定義する必要があります.このような情報がこのクラスのすべてのインスタンスに対して完全に同じである場合、またはそれがクラスに関連している場合、例えば人の目の数、すべての人の目の数は2であり、このようなクラスに関連する情報はクラス変数として定義されるべきである.この情報がインスタンスに関連している場合、例えば人間の身長、体重が互いに異なる場合、この情報はインスタンスに関連している場合、インスタンス変数として定義されるべきである.
②あるクラスにおいて、そのクラスまたはインスタンスの実行時の状態情報、例えば、五子棋プログラムの碁盤配列を変数で保存する必要がある場合、五子棋インスタンスの実行時の状態情報を保存するために使用される.クラスまたはクラスインスタンスのステータス情報を勇敢に保存する変数は、通常、メンバー変数を使用する必要があります.
③ある情報をクラスの複数のメソッド間で共有する必要がある場合、この情報はメンバー変数を使用して保存する必要があります.
プログラムでローカル変数を使用しても、できるだけローカル変数の作用範囲を縮小する必要があります.ローカル変数の作用範囲が小さいほど、メモリに滞留する時間が短くなり、プログラムの実行性能もよくなります.