用MPL编写的Java代码说它错了?

时间:2013-02-16 13:49:22

标签: java

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

写出包含以下内容的类Counter的定义:

  • 名为counter的类型为int的实例变量。
  • 名为int的类型的实例变量。
  • 一个名为nCounters的静态int变量,初始化为0。
  • 一个构造函数,它接受两个int参数,将第一个指定给计数器,第二个指定限制。它还为静态变量nCounters添加了一个。
  • 一个名为increment的方法。它不接受参数或返回值;如果实例变量计数器小于限制,则增量只会向实例变量计数器添加一个。
  • 一个名为decrement的方法,它也不接受参数或返回值;如果计数器大于零,它只是从计数器中减去一个。
  • 一个名为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说:

  

说明:
      ⇒您的构造函数未正确初始化计数器
      ⇒您的代码在执行期间出错

     

检测到的问题:
      ⇒计数器的值不正确

2 个答案:

答案 0 :(得分: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;

构造函数的“参数”是您在构造函数定义中放在括号中的内容,因此您的counterlimit。即使它们与您的实例字段具有相同的名称(在您的示例中),它们也不会以任何方式与它们相关。如果您愿意,可以给他们cl打电话。

MPL告诉你的是你没有在构造函数中为(“initialized”)counter设置初始值。它应该告诉你关于limit的同样的事情。它们将具有int字段的Java默认初始值,即0。但是既然你接受了构造函数的参数,你可能想要使用它们。例如:

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

我必须编写this.counter =而不是counter =,因为参数与实例字段的名称相同。如果没有,this.将是可选的。 (我不喜欢把它关掉,但很多人都是。)

答案 1 :(得分:1)

@ T.J已经给出了解释。克劳德

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

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

}

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