1. ローカル変数

変数についてもっと真剣な話をしましょう。ただし、今回はその内部構造については説明しません。代わりに、変数が配置されているコードとどのように対話するかに焦点を当てます。

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

簡単にするために、例を考えてみましょう。

コード 可変可視性
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


2. パラメータ

前に述べたように、各メソッドはパラメーターと呼ばれる変数を持つことができます。可視性と寿命についてはどうですか?

それはすべて簡単です。パラメータは、実行がメソッドにステップインするとき (つまり、メソッドのコードが実行を開始するとき) に作成されます。これらはメソッドが終了すると削除されます。これらはメソッドの本体全体で表示されます。

例:

コード 可変可視性
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は文字列の配列型を持つ単なる変数です。すべてのパラメーターと同様に、メソッド本体内のどこでも使用できます。とはいえ、例では通常それを無視します。



3. クラス内の変数

レベル 1 のレッスンで、クラスにはメソッドと変数を含めることができることを思い出してください。メソッドは、インスタンス メソッド、および変数 (インスタンス変数またはフィールド) と呼ばれることもあります。これらは実際には Java では同義語です。

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

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

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

例:

コード 可変可視性
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()メソッドはsumおよびcountインスタンス変数を増加させ、メソッドは および変数remove()を減少させます。どちらのメソッドも共有インスタンス変数に対して機能します。sumcount

ローカル変数は、メソッドの実行中に存在します。クラスのインスタンス変数は、クラスのオブジェクトが存在する限り、そのオブジェクト内に存在します。次のレベルでは、クラスのオブジェクトについて詳しく学習します。


4. 静的変数

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

レベル 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

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