4

メソッドの外部で変数に値を割り当てることと、コンストラクター内でこれらの値を割り当てることには違いがありますか?

OracleのJavaチュートリアルを見ると、次のようになっています。

public class Bicycle {

   int cadence = 0;
   int speed = 0;
   int gear = 1;

   void changeCadence(int newValue) {
      cadence = newValue;
   }

これは言うこととは何か違うのですか/なぜ彼らはただ言わなかったのですか?

Bicycle(){
    int cadence = 0;
 } 
4

8 に答える 8

6

コンストラクターで変数を宣言すると、その変数はコンストラクターに対してローカルになり、クラスの他の場所には表示されなくなります。

于 2013-03-25T22:14:31.403 に答える
4

コンストラクターで変数を定義する場合、それはコンストラクターに対してローカルです。ただし、クラス内の変数はクラスの状態の一部です。

しかし、あなたが意味するなら:

class A {
    int i = 1;
    ...
}

vs

class B {
    int i;

    B() {
        i = 1;
    }
    ...
}

違いは次のとおりです。最初のケースではi、すべてのインスタンスでデフォルト値は1ですが、2番目のケースでiは、表示されているコンストラクターが呼び出された場合のデフォルト値は1です。他のコンストラクターでは、他のデフォルト値は別のもの(または0)です。に何も割り当てられていない場合i)。

于 2013-03-25T22:20:01.610 に答える
3

variable内部を宣言した場合constructor、この変数にはアクセスできますinside this constructor。ただし、に変数を作成し、またはclassにアクセスすることはできます。constructormethod

于 2013-03-25T22:14:56.467 に答える
2

オブジェクトインスタンスを作成すると、グローバル変数が初期化されます。コンストラクターでそれらの一部を変更できます(ただし、変更する必要はありません)。

私はあなたが意味すると思います

Bicycle() { 
   cadence = 0; 
} 
于 2013-03-25T22:17:34.300 に答える
1

コンストラクター内:ローカル変数になります

Javaには、次のタイプの変数が含まれています。

インスタンス変数(非静的フィールド):オブジェクト指向プログラミングでは、オブジェクトは、staticキーワードなしで宣言された「非静的フィールド」に個々の状態を格納します。クラスの各オブジェクトには、これらの非静的変数の独自の値のセットがあるため、これらはオブジェクト(クラスのインスタンス)に関連していると言えます。したがって、これらの変数はインスタンス変数とも呼ばれます。これらの変数は、初期化されていない場合、デフォルト値を取ります。

クラス変数(静的フィールド):これらは集合的にクラスに関連しており、どのオブジェクトもそれらを個人事業主と主張することはできません。staticキーワードで定義された変数は、すべてのオブジェクトで共有されます。ここで、オブジェクトは個々の値を格納しませんが、オブジェクト間でそれを共有することを余儀なくされます。これらの変数は、staticキーワードを使用して「静的フィールド」として宣言されます。常に同じ値のセットが、同じクラスの異なるオブジェクト間で共有されます。したがって、これらの変数は、クラスのすべてのオブジェクトで同じであるグローバル変数のようなものです。これらの変数は、初期化されていない場合、デフォルト値を取ります。

ローカル変数:メソッドまたはコードのブロックで定義された変数は、ローカル変数と呼ばれます。これらの変数には、メソッドまたはコードブロック内でのみアクセスできます。これらの変数は、初期化されていない場合、デフォルト値を取りません。これらの値は、使用する前に初期化する必要があります。

パラメータ:パラメータまたは引数は、メソッド宣言で使用される変数です。

于 2013-03-25T22:18:39.457 に答える
1

コンストラクターは他のメソッドと同じです。内部で宣言されている変数は、その内部でのみ使用可能であり、スコープ外になると破棄されます。

于 2013-03-25T22:18:46.293 に答える
1

この場合の違いは、コンストラクターで変数を割り当てるだけではないことです(2番目の場合)。あなたもそこでそれを宣言しています。したがって、変数はコンストラクターに対してローカルであり、外部からは見えません。

于 2013-03-25T22:19:14.363 に答える
0

あなたの質問は、(クラスの)変数にデフォルト値を直接与えることができるのなら、なぜ代わりにコンストラクター内でそれを与えるのかということだと思います。それが問題だとしたら、オブジェクトが初期化されていなくても変数の値が使用可能になるためだと思います。これは健全な方法ではなく、あまり意味がありません。代わりに、コンストラクター内で値を指定すると、非表示になるだけでなく、Javaのoopsルールにも従うことになります。

于 2021-06-28T22:08:52.320 に答える