ローカル変数

「こんにちは、私の最愛の生徒! 変数についてもう少し真剣に考える時期が来ました。ただし、今回は変数の内部構造については説明しません。代わりに、変数が配置されているコードとどのように相互作用するかに焦点を当てます。

「メソッド内で宣言されたすべての変数は、ローカル変数と呼ばれます。ローカル変数は、それが宣言されたコードのブロック内にのみ存在します。より正確には、宣言された瞬間からブロックの終わりまで存在します。それが宣言されているコードの。」

「明らかに、例が必要です。」

「問題ありません。どうぞ。

コード 可変的な可用性
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     while (true)
     {
       int x = a + b;
       System.out.println(x);
     }
     System.out.println(b);
   }

}


a
a
a
a, b
a, b
a, b
a, b, x
a, b, x
a, b
a, b
a
a

「ローカル変数にアクセスするためのルールをもう一度見てみましょう。これはコードのブロックです。その始まりと終わりを示すものは何ですか?」

「中括弧?」

「正解です。これは、メソッド本体、ループ本体、または条件ステートメントの単なるコード ブロックである可能性があります。コード ブロック内で宣言された変数は、そのコード ブロックが終了するまで存在します。教えてください。どこにあるのか教えてください。」変数がループの本体で宣言されている場合、その変数は存在しますか?」

「ループ本体にのみ存在します。」

「そうです。しかも、ループの繰り返しごとに作成され、破棄されます。」

「つまり、1 つのメソッドで同じ名前の 2 つのローカル変数を宣言することはできません。プログラムはコンパイルされません。ただし、変数が宣言されているコード ブロックが重複していなければ、宣言することは可能です。

「あなたが私のお気に入りであるのには理由があります、アミーゴ。これを頭の中でしっかりと固めるために、もう一つ例を挙げてみましょう。

コード 可変可視性
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     System.out.println(b);
   }

   if (a < 20)
   {
     int b = 20;
     System.out.println(b);
   }
}


a
a
a
a, b
a, b
a
a
a
a
a, b
a, b
a

「名前付きの 2 番目のローカル変数を宣言できたのは、2 番目の変数が宣言されているコード ブロック内でb最初のb変数が表示されないためですb

パラメーター

「前に述べたように、各メソッドはパラメータと呼ばれる変数を持つことができます。それらの可視性と有効期間はどうなるのでしょうか?」

「うーん…困った…」

「ここではすべてが非常に単純です。パラメータは、実行がメソッドにステップインするとき (つまり、メソッドのコードが実行を開始するとき) に作成されます。パラメータはメソッドが終了すると削除されます。」

「言い換えれば、それらはメソッドの本体全体で表示され、そこでのみ表示されるということですか?」

「はい。例:

コード 可変可視性
public static void main(String[] args)
{
   int a = 5;
   if (a < 10)
   {
     int b = 10;
     while (true)
     {
       int x = a + b;
       System.out.println(x);
     }
     System.out.println(b);
   }

}

args
args, a
args, a
args, a
args, a, b
args, a, b
args, a, b
args, a, b, x
args, a, b, x
args, a, b
args, a, b
args, a
args, a

「前に述べたように、argsは文字列の配列型を持つ単なる変数です。そして、すべてのパラメーターと同様に、メソッド本体内のどこでも使用できます。とはいえ、通常、例ではこれを無視します。

クラス内の変数

「レベル 1 のレッスンを思い出してください。クラスにはメソッドと変数を含めることができます。メソッドはインスタンス メソッドと呼ばれたり、変数 (インスタンス変数またはフィールド) と呼ばれたりします。

「クラスの変数 (またはフィールド) とは何ですか?

これらはメソッドではなくクラスで宣言される変数です。」

「それで、彼らは何のためにそこにいるのですか?」

「まず、インスタンス変数は、クラスの任意の (非静的) メソッドからアクセスできます。大まかに言えば、インスタンス変数は、クラスのすべてのメソッドによって共有される変数です。

例:

コード 可変可視性
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     count++;
   }

   public void remove(int data)
   {
     sum = sum - data;
     count--;
   }
}


count
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum
count, sum

add()「この例では、と という2 つのメソッドがありますremove()。メソッドはとインスタンス変数add()を増加させ、メソッドはと変数を減少させます。どちらのメソッドも共有インスタンス変数に対して機能します。」sumcountremove()sumcount

「すべて理解できました。メソッドの実行中にローカル変数が存在します。クラスインスタンス変数は、そのオブジェクトが存在する限り、そのクラスのオブジェクト内に存在します。」

「よくやった、アミーゴ。基礎はできたので、次のレベルでクラスのオブジェクトの詳細を学ぶことになる。

静的変数

「メソッドと同様に、クラス内の変数も静的または非静的にすることができます。静的メソッドは静的変数にのみアクセスできます。

「静的変数についてはまだよく理解できません。」

「ああ、わかっていますが、心配しないでください。とりあえずは、慣れてください。レベル 11 では、静的変数とメソッドの構造を分析し、その理由を理解します。制限。

静的変数(クラス変数)を作成するには、staticその宣言にキーワードを記述する必要があります。

「静的変数は、宣言されているクラスのオブジェクトやインスタンスにバインドされません。代わりに、クラス自体に属します。そのため、クラスのオブジェクトが 1 つも作成されていない場合でも、静的変数は存在します。次のような構成を使用して、他のクラスからそれらを取得します。

ClassName.variableName

例:

コード 可変可視性
public class Solution
{
   public void add(int data)
   {
     Storage.sum = Storage.sum + data;
     Storage.count++;
   }

   public void remove(int data)
   {
     Storage.sum = Storage.sum - data;
     Storage.count--;
   }
}

public class Storage
{
   public static int count = 0;
   public static int sum = 0;
}

Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum, data
Storage.count, Storage.sum



Storage.count, Storage.sum
Storage.count, Storage.sum
Storage.count, Storage.sum

「上記の例では、別のクラスを作成しStoragecountsum変数をその中に移動し、それらをstatic として宣言しました。パブリック静的変数には、プログラム内の任意のメソッドから (メソッドからだけでなく) アクセスできます。」

「よくわかりませんが、これは便利そうです。」

「その通りです。そして、それが必要な場合もあります。静的変数と静的メソッドがなければ、私たちは立ち往生してしまうでしょう。」

「ゆっくりと理解できるようになるといいのですが。」

「はい、もちろんそうしますよ。」