-2

コードを書き留める必要がありますが、MPLはそれが間違っていると言っていますか?何が悪かったのか理解できませんでしたか?

以下を含むクラスCounterの定義を記述します。

  • int型のcounterという名前のインスタンス変数。
  • タイプintのlimitという名前のインスタンス変数。
  • 0に初期化されるnCountersという名前の静的int変数。
  • 最初のパラメーターをcounterに割り当て、2番目のパラメーターをlimitに割り当てる2つのintパラメーターを受け取るコンストラクター。また、静的変数nCountersに1を追加します。
  • インクリメントという名前のメソッド。パラメータを受け取ったり、値を返したりすることはありません。インスタンス変数カウンターが制限よりも小さい場合、インクリメントはインスタンス変数カウンターに1を追加するだけです。
  • デクリメントという名前のメソッドで、パラメーターを受け取ったり値を返したりすることもありません。カウンターがゼロより大きい場合は、カウンターから1を引くだけです。
  • インスタンス変数counterの値を返すgetValueという名前のメソッド。
  • 静的変数nCountersの値を返すgetNCountersという名前の静的メソッド。

私が書いた私のコード:

public class Counter {

    private int counter;
    private int limit;
    private static int nCounters = 0;

    public Counter(int counter, int limit) {
        nCounters++;

    }

    public void increment() {
        if (counter < limit) {
            counter++;
        }
    }

    public void decrement() {
        if (counter > 0) {
            counter--;
        }
    }

    public int getValue() {
        return counter;
    }

    public static int getNCounters(){
        return nCounters;
    }
}

MPLによると:

備考:
     ⇒コンストラクターがカウンターを適切に初期化しません
     ⇒実行中にコードでエラーが発生しました

検出された問題:
     ⇒カウンターの値が正しくありません

4

2 に答える 2

4

確かに、少なくともMPLからの最初の「発言」は非常に明確ですか?(そして、それは同じことを言っているはずですlimit。)それはあなたのコンストラクターが決して初期化しないと言っていますcounter。そして確かに、そうではありません。コンストラクターは次のとおりです。

public Counter(int counter, int limit) {
    nCounters++;

}

その中で、インスタンス変数this.counterthis.limit何かを設定する必要があります(おそらく、同じ名前の引数の値に設定する必要があります)。


コメントを再確認してください。

あなたがどこで話しているのかを知っていれば、自分でそれを理解することができます。たぶん、this.counterの部分についてもう少し説明がありますか?

上記を理解していない場合(そして私たち全員がかつては初心者でした!!)、一歩下がって、優れた基本的なJavaの本やチュートリアルを実行することをお勧めします。

「コンストラクター」は、クラス(オブジェクト)のインスタンスの作成の一部として自動的に呼び出される関数です。(「インスタンス」は、特定のメモリ内オブジェクトの1つです。)たとえば、

Counter c = new Counter(1, 10);

...クラスのコンストラクターを呼び出して、そのクラスのインスタンスCounterを作成しています。Javaのコンストラクターは、メソッドが定義されているのとほとんど同じように定義されていますが、戻り値がないため、上記で引用したのは、クラスのコンストラクターです。Counter

「インスタンスフィールド」(または「インスタンスデータメンバー」)は、事実上、特定の変数に関連する変数です。あなたはあなたのクラスにそれらのうちの2つを持っています:counterそしてlimit、あなたはそのように宣言しました:

private int counter;
private int limit;

また、次のようなクラス(または「静的」)フィールドがありますnCounters

private static int nCounters = 0;

コンストラクターに対する「引数」は、コンストラクター定義の括弧に入れたものであるため、counterとはlimit。それらは(あなたの例では)インスタンスフィールドと同じ名前を持っていますが、それらとはまったく関係がありません。あなたは彼らに電話することができましたc、そしてlあなたが好きなら。

MPLが言っているのはcounter、コンストラクターで( "initialized")の初期値を設定していないということです。それはあなたに同じことを教えてくれるはずですlimitintフィールドのJavaのデフォルトの初期値はです0。しかし、コンストラクターに引数を受け入れているので、おそらくそれらを使用したいと思うでしょう。例えば:

public Counter(int counter, int limit) {
    this.counter = counter;
    this.limit = limit;
    nCounters++;
}

引数がインスタンスフィールドと同じ名前であるという理由this.counter =だけでなく、書く必要がありました。counter =そうでない場合は、this.オプションになります。(私はそれをやめるのが好きではありませんが、多くの人が好きです。)

于 2013-02-16T13:52:06.997 に答える
1

説明は@TJクラウダーによって与えられました

そして彼はこれを意味しました:あなたのコンストラクターをこのように修正してください:

public Counter(int counter, int limit) {
  this.counter = counter;
  this.limit = limit;  
  nCounters++;

}

コードでは、コンストラクターがこれらのインスタンス変数を初期化していませんでした

于 2013-02-16T14:04:02.663 に答える