この記事では、Java のメンバー変数とローカル変数の違いを例とともに分析します。皆さんの参考に共有してください。具体的な分析は次のとおりです。
メンバ変数: このクラスで定義されたプライベート変数は、このクラスに属します。
メンバー変数を作成して使用してコードをコピーします。コードは次のとおりです。
文字列名。
ストリングセックス。
年齢;
倍の高さ;
public static void main(String arges[])
{
人 p=新しい人();
p.name="シャオファン";
p.性別="男性";
ページ数=20;
p.高さ=1.7;
System.out.println("名前:"+p.name+",性別"+p.Sex+",年齢:"+p.age+",年齢:"+p.Height);
}
}
メンバ変数の初期化処理
1. クラスの初期化
クラスの初期化の場合: クラスの初期化は通常 1 回だけ初期化され、主に静的メンバー変数が初期化されます。
クラスのコンパイルによって、クラスの初期化プロセスが決まります。
コンパイラによって生成されたクラス ファイルは、ソース ファイルで定義されているクラスに主に次の変更を加えます。
1) まずクラス内で静的メンバ変数の定義順にメンバ変数を宣言します。
2) 元の Java クラスのメンバ変数の初期化順序に従って初期化します。
Java クラスとコンパイルされたクラス間の対応する変換は次のとおりです。
ソースファイル:
次のようにコードをコピーします。 public class Person{
public static String name="張三";
public static int age;
静的{
年齢=20;
System.out.println("初期化経過時間");
}
パブリック静的文字列アドレス。
静的{
address="北京";
年齢=34;
}
public static void main(String[] args) {
System.out.println(名前);
System.out.println(age);
System.out.println(アドレス);
}
}
Java ソース コードがクラス ファイルに変換されると、次のようなコードに変換されます。
次のようにコードをコピーします。 public class Person{
public static 文字列名。
public static int age;
パブリック静的文字列アドレス。
静的{
名前 = "張三";
年齢=20;
System.out.println("初期化経過時間");
address="北京";
年齢=34;
}
public static void main(String[] args) {
System.out.println(名前);
System.out.println(age);
System.out.println(アドレス);
}
}
初期化シーケンスは、変換後の対応するクラス メンバー変数の初期化シーケンスに従って順次実行されるため、すべての静的メンバー変数は最初に宣言されてから割り当てられ、割り当ての順序も静的メンバー変数の順序に基づきます。注: メンバー変数を定義して直接初期化することは、ソース コードで定義されている順序において、静的コード ブロックで初期化することと同じです。
ローカル変数
ローカル変数: メソッド本体内で作成され、メソッド本体の外部からこの変数にアクセスすることはできません。
ローカル変数の作成と使用 (ローカル変数には値を割り当てる必要がありますが、メンバー変数には値を割り当てることはできません)
次のようにコードをコピーします。 public class Person {
public static void main(String arges[])
{
文字列名 = "シャオファン";
文字列性別 = "男性";
整数年齢=20;
倍の高さ=1.70;
System.out.println("名前:"+名前+",性別"+性別+",年齢:"+年齢+",年齢:"+身長);
}
}
例を参照してコードをコピーします。コードは次のとおりです。 public class PassTest {
public static void main(String args[]) {
StringBuffer a = new StringBuffer("a");
StringBuffer b = new StringBuffer("b");
a(a, b);
System.out.println(a);
System.out.println(b);
PassTest p = new PassTest();
pc();
}
static void a(StringBuffer a, StringBuffer b) {
a = a.append(b);
b = a;
}
}
ローカル変数の使用範囲によれば、結果は ab になるはずですが、実際の出力は ab b になるのはなぜでしょうか。
パラメータ参照を渡す問題は、それが参照である場合、渡されるのは同じ参照のコピーである必要があります。
メソッド a の b=a は、コピー b 参照を =a に変更しますが、メインの b には影響しません。
a = a.append(b); 主に a.append(b); この文は、main の a も同じオブジェクトを指しているため、出力は ab b になります。
a = a.append(b); を a = new StringBuffer("ab"); に変更すると出力されます。
次の 2 つのプログラムを見てください。
手順 1:
次のようにコードをコピーします。 public class Variable
{
int i;
ボイドテスト()
{
int j=8;
if(j==i)
System.out.println("等しい");
それ以外
System.out.println("等しくない");
}
public static void main(String[] args)
{
変数 v=新しい変数();
v.test();
}
}
手順 2:
次のようにコードをコピーします。 public class Variable
{
ボイドテスト()
{
int i;
int j=8;
if(j==i)
System.out.println("等しい");
それ以外
System.out.println("等しくない");
}
public static void main(String[] args)
{
変数 v=新しい変数();
v.test();
}
}
最初のプログラムは正常で、エラーなしでコンパイルされます。 2 番目のプログラムをコンパイルすると、次のエラーが表示されます。
D:プログラムjavatest>javac変数.java
Variable.java:9: 変数 i はまだ初期化されていない可能性があります
if(j==i)
^
間違い
このようなエラーが発生する理由は次のとおりです。メンバー変数にはデフォルト値があり (static ではなく、final によって変更された変数は明示的に割り当てる必要があります)、ローカル変数は自動的に割り当てられません。
クラス本体は 2 つの部分に分かれています。変数定義部で定義した変数をクラスのメンバ変数と呼び、メソッド本体やメソッドのパラメータに定義した変数をローカル変数と呼びます。
ローカル変数とメンバー変数の違い
ローカル変数はメソッド本体の属性を記述し、メンバー変数はオブジェクトの属性を記述します。
メンバー変数は、public、protected、default、private、static、final 修飾子によって変更できますが、ローカル変数は、final 修飾子によってのみ変更できます。
メンバー変数はヒープ上に作成され、ローカル変数はスタック上に作成されます。
ローカル変数にはシステムのデフォルト値があります。ローカル変数にはシステムのデフォルト値がないため、手動で割り当てる必要があります。
この記事が皆さんの Java プログラミングに役立つことを願っています。