CodeGym /Java Course /Java の構文 /変数スコープの詳細

変数スコープの詳細

Java の構文
レベル 4 , レッスン 1
使用可能

「教授はマンネリから抜け出せない。講義に慣れた年老いた教師はいつもこんな感じだ。本で見つけられない教授の教えは何一つない。聞いて泳ぎ方を学ぶことはできない」 「水泳の講義まで。講義は、その主題に精通していて、教授とほぼ同じくらいの知識がある場合にのみ役に立ちます。」

「それでも、彼の教訓は役に立ちます。」

「そうです。つまり、そうであることを願っています。その主題についてより多くの視点を聞けば聞くほど、真実に近づくことができます。たった一つの話を聞いたとき、できることはそれを信じるか信じないかだけです。OK、しましょうビジネスに戻りなさい。」

「前に見せた写真を見てみましょう。」


public class Variables

{
   private static String TEXT = "The end.";
  ┗━━━━━━━━━━━━━━━━━━━┛
   public static void main (String[] args)
                          ┗━━━━━━━┛
  {
     System.out.println("Hi");
     String s = "Hi!";
   ┏┗━━━━┛
    System.out.println(s);
    if (args != NULL)
    {
       String s2 = s;
      ┗━━━━┛
   
      System.out.println(s2);
     
    }
    Variables variables = new Variables();
    System.out.println(variables.instanceVariable);
    System.out.println(TEXT);
   
  }
 
   public String instanceVariable;
  ┗━━━━━━━━━━━━━━━┛
   public Variables()
   {
      instanceVariable = "Instance variable test.";
   }
}

1. メソッド内で宣言された変数は、宣言の開始からメソッドの終了まで存在します (表示されます)。

2. コードブロック内で宣言された変数は、コードブロックの終わりまで存在します。

3. メソッドのパラメータは、メソッドが戻るまで存在します。

4. オブジェクト内の変数は、それを含むオブジェクトの存続期間全体にわたって存在します。それらの可視性は、特別なアクセス修飾子によっても制御されます。

5. 静的 (クラス) 変数は、プログラムの実行中ずっと存在します。それらの可視性はアクセス修飾子によっても定義されます。」

「そうです。この写真を覚えています。」

「わかりました。重要なポイントをいくつか思い出させてください。」

「メソッド内で宣言されたすべての変数は、宣言された時点からメソッドの終了まで存在します (表示されます) (例 1)。」

「変数がコード ブロック内で宣言されている場合、その変数はコード ブロックの終わりまで存在します (例 2)。」

「変数がメソッドのパラメータである場合、その変数はメソッドの本体全体に存在します (表示されます) (例 3)。」

「変数がインスタンス変数の場合 (例 4)、変数は特定のオブジェクトにリンクされ、そのオブジェクトが存在する限り存在します。オブジェクトが存在しない場合、変数のインスタンスは存在しません。変数にアクセスできます (つまり 、変数は、その前に宣言されたか後に宣言されたかに関係なく、クラスのすべてのメソッドから参照できます。新しい変数はオブジェクトごとに作成されます。他のオブジェクトから独立しています。静的メソッドからインスタンス変数にアクセスすることはでき ませ ん。

「変数が静的として宣言されている場合、つまり、キーワードstaticでマークされている場合、その変数はそのクラスが存在する限り存在します。通常、JVM は最初の使用時にクラスをメモリにロードします。静的変数が初期化されるのもこの時です。」

変数スコープの詳細 - 1

「上の例では、Cat クラスを宣言しています。このクラスには、a、b、s (非静的変数)、および count (静的変数) という 4 つの変数があります。このクラスのオブジェクトを複数 (たとえば 3 つ) 作成すると、それぞれこれらには、クラスの非静的変数の独自のインスタンスが含まれます。 静的変数は、クラスのすべてのオブジェクトによって共有されます。技術的に言えば、Cat オブジェクトが作成される前から存在していたので、静的変数はこれらのオブジェクトの内部にさえありません。

「変数を static として宣言すると、次のようになりますs。」

変数スコープの詳細 - 2

「わかりました。分かったと思います。」

「同じ名前の変数を宣言できますか?」

「メソッド内ではありません。メソッド内で宣言されたすべての変数には一意の名前が必要です。メソッドの引数もローカル変数とみなされます。」

「メンバー変数はどうなるのでしょうか?」

「メンバー変数もクラスごとに一意である必要があります。」

"ただし、例外があります。ローカル変数とメンバー変数の名前は同じであっても構いません。 "

「そのような変数を変更すると、同じ名前の 2 つの変数のうちどちらが変更されますか?」

「コード内に複数の可視 (アクセス可能な) 変数 (インスタンス変数とローカル変数など) がある場合、ローカル変数がアクセスされます。」

2 つのカウント変数を使用した例
class Main
{
    public int count = 0;     // Declare an instance variable

    public void run()
    {
        count = 15;           // Access the instance variable
        int count = 10;       // Declare a local method variable
        count++;             // Access the method variable
    }
}

「このコードは 2 つのカウント変数を宣言しています。3 行目はインスタンス変数、8 行目はローカル変数を宣言しています。」

「run メソッドが実行されると何が起こるかは次のとおりです。」

「7 行目で、インスタンス変数にアクセスし、値 15 をそれに割り当てます。」

「8 行目で、新しいローカル変数を宣言 (作成) します。countこれにより、インスタンス変数がマスクされます。ローカル変数は、メソッド内の後続のすべてのコードが参照 (アクセス) するものです。」

"とった。"

「ローカル変数はインスタンス変数をマスクします。つまり、アクセスされるのはローカル変数です。ただし、インスタンス変数にもアクセスできます。アクセスするのが少し複雑なだけです。」

静的 (クラス) 変数
ClassName.variableName

// Here are some examples:
Cat.catsCount
非静的 (インスタンス) 変数
this.variableName

// Here are some examples:
this.catsCount

「静的メソッドと静的変数について他に何か教えてください。」

「静的メソッドと変数は、クラスのオブジェクトにリンクされません。それらはクラス自体にリンクされます。10 個のVariablesオブジェクトを作成すると (このレベルの最初の例を参照)、10 個のinstanceVariable変数 (それぞれに 1 つ)が作成されます。オブジェクト) と 1 つの共有 (静的) 変数TEXTのみです。」

"質問があります。"

「静的メソッドと非静的メソッドの違いは何ですか?」

「非静的メソッドがどのように機能するかを見てみましょう。」

コードはどのようになるか
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
本当に何が起こるのか
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat,17);
Cat.setChildren(cat, cat1, cat2, cat3);

「 <object> dot <method name>を使用してメソッドを呼び出すと、実際にはクラス メソッドを呼び出し、その同じオブジェクトを最初の引数として渡します。メソッド内では、オブジェクトは'this'と呼ばれます。メソッドはこのオブジェクトとそのデータに対して実行されます。」

「わあ!そういうことか!」

「これが静的メソッドの仕組みです。」

コードはどのようになるか
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
本当に何が起こるのか
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);

「静的メソッドを呼び出すと、オブジェクトは渡されません。つまり、'this'はnullに等しいのです。そのため、静的メソッドは非静的変数やメソッドにアクセスできません (渡す' this'がないため)これらのメソッドに)。

「うーん。わかる気がする。少しくらいは」

「そして、ディエゴおじさんがやって来ます...そして彼の任務です。」

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION