3

AP cs の本を読んでいて、3 種類の変数について説明していました。

•インスタンス変数

•ローカル変数

•パラメーター

インスタンス変数はクラス全体で表示されます。パラメーターはメソッド内でのみ使用でき、ローカル変数も同様です。. .

したがって、私の質問は、同じスコープが含まれている場合、パラメーターとローカル変数を異なるカテゴリの変数として分類する理由です。. . それらのさまざまな用途にもかかわらず。

4

3 に答える 3

3

Java 言語仕様では、7 種類の変数が識別されます。それらの説明は

クラス変数は、クラス宣言内で static キーワードを使用して宣言されたフィールド (§8.3.1.1)、またはインターフェイス宣言内で static キーワードの有無にかかわらず宣言されたフィールドです (§9.3)。

クラス変数は、そのクラスまたはインターフェイスが準備されたときに作成され (§12.3.2)、デフォルト値に初期化されます (§4.12.5)。クラス変数は、そのクラスまたはインターフェイスがアンロードされると、事実上存在しなくなります (§12.7)。

インスタンス変数は、キーワード static (§8.3.1.1) を使用せずにクラス宣言内で宣言されたフィールドです。

クラス T にインスタンス変数であるフィールド a がある場合、新しいインスタンス変数 a が作成され、クラス T または任意のクラスの新しく作成されたオブジェクトの一部としてデフォルト値 (§4.12.5) に初期化されます。 T のサブクラス (§8.1.4)。インスタンス変数は、オブジェクトの必要なファイナライズ (§12.6) が完了した後、フィールドであるオブジェクトが参照されなくなると、事実上存在しなくなります。

配列コンポーネントは、配列である新しいオブジェクトが作成されるたびに作成され、デフォルト値に初期化される名前のない変数です (§4.12.5) (§10、§15.10)。配列が参照されなくなると、配列コンポーネントは実質的に存在しなくなります。

メソッド パラメーター(§8.4.1) メソッドに渡される名前引数の値。

メソッド宣言で宣言されたすべてのパラメーターについて、そのメソッドが呼び出されるたびに新しいパラメーター変数が作成されます (§15.12)。新しい変数は、メソッド呼び出しからの対応する引数値で初期化されます。メソッド本体の実行が完了すると、メソッド パラメータは事実上存在しなくなります。

コンストラクター パラメーター(§8.8.1) は、コンストラクターに渡される引数の値に名前を付けます。

コンストラクター宣言で宣言されたすべてのパラメーターについて、クラス インスタンス作成式 (§15.9) または明示的なコンストラクター呼び出し (§8.8.7) がそのコンストラクターを呼び出すたびに、新しいパラメーター変数が作成されます。新しい変数は、作成式またはコンストラクター呼び出しからの対応する引数値で初期化されます。コンストラクターの本体の実行が完了すると、コンストラクター パラメーターは実質的に存在しなくなります。

例外パラメーターは、例外が try ステートメントの catch 句によってキャッチされるたびに作成されます (§14.20)。

新しい変数は、例外に関連付けられた実際のオブジェクトで初期化されます (§11.3、§14.18)。catch 句に関連付けられたブロックの実行が完了すると、例外パラメーターは実質的に存在しなくなります。

ローカル変数は、ローカル変数宣言ステートメント (§14.4) によって宣言されます。

制御フローがブロック (§14.2) または for ステートメント (§14.14) に入るたびに、そのブロックまたは for ステートメント内に直接含まれるローカル変数宣言ステートメントで宣言された各ローカル変数に対して、新しい変数が作成されます。

また、名前付きエンティティをアプリケーション内で使用できる場所を説明するvariable scopeについても読む必要があります。

したがって、私の質問は、同じスコープが含まれている場合、パラメーターとローカル変数を異なるカテゴリの変数として分類する理由です。

上記の説明からわかるように、これらには同じスコープが含まれていないため、区別する必要があります。

于 2013-10-07T20:20:41.450 に答える
3

必ずしも同じスコープを持つとは限らないためです。

この場合を考えてみましょう:

// this is garbage code
public void doSomething(int foo) {
    int meh = 0;
    while (true) {
         // can access foo and meh
         int blah = meh++;
         if (blah == foo) {
             break;
         }
    }
    // won't compile, can't access blah anymore
    System.out.println(blah);
    // will compile
    System.out.println(foo);
    // will compile as well
    System.out.println(meh);
}
于 2013-10-07T20:21:09.577 に答える
0

ローカル変数はメソッドで初期化され、パラメーターはメソッドに渡されます。

    public void method(int abc) //parameter
        int xyz = 0; //local variable
于 2013-10-07T20:20:33.177 に答える