-2

我需要写一些代码,但 MPL 说错了?无法弄清楚出了什么问题?

编写一个 Counter 类的定义,其中包含:

  • 一个名为 counter 的 int 类型的实例变量。
  • 一个名为 limit 的 int 类型的实例变量。
  • 一个名为 nCounters 的静态 int 变量,初始化为 0 。
  • 构造函数采用两个 int 参数,将第一个分配给 counter ,将第二个分配给 limit 。它还将静态变量 nCounters 加一。
  • 一个名为 increment 的方法。它不带参数或返回值;如果实例变量 counter 小于 limit,则 increment 只会将实例变量 counter 加一。
  • 一个名为 decrement 的方法,它也不接受参数或返回值;如果 counter 大于零,它只是从 counter 中减一。
  • 一个名为 getValue 的方法,它返回实例变量 counter 的值。
  • 一个名为 getNCounters 的静态方法,它返回静态变量 nCounters 的值。

我写的代码:

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 书籍和/或教程。

“构造函数”是作为创建类(对象)实例的一部分自动调用的函数。(“实例”是一个特定的内存对象。)例如,当你这样做时

Counter c = new Counter(1, 10);

...您正在调用该类的构造函数Counter来创建该类的实例。Java 中的构造函数的定义很像方法的定义,但没有返回值,所以我上面引用的是Counter类的构造函数。

“实例字段”(或“实例数据成员”)实际上是与特定对象相关的变量。您的班级中有两个:counterlimit,您已这样声明:

private int counter;
private int limit;

您还有一个名为的类(或“静态”)字段nCounters

private static int nCounters = 0;

构造函数的“参数”是您在构造函数定义中放在括号中的内容,因此您的counterand limit. 即使它们与您的实例字段具有相同的名称(在您的示例中),但它们与它们没有任何关系。你可以打电话给他们cl如果你喜欢的话。

MPL 告诉您的是,您没有counter在构造函数中为 ("initialized") 设置初始值。它应该告诉你同样的事情limit。它们将具有 Java 的默认字段初始值int,即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 Crowder 已经给出了解释

他的意思是:像这样修改你的构造函数:

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

}

在您的代码中,您的构造函数没有初始化那些实例变量

于 2013-02-16T14:04:02.663 回答