我需要写下一些代码,但MPL说这是错的?无法弄清楚出了什么问题?
写出包含以下内容的类Counter的定义:
我写的代码:
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说:
说明:
⇒您的构造函数未正确初始化计数器
⇒您的代码在执行期间出错检测到的问题:
⇒计数器的值不正确
答案 0 :(得分:4)
当然至少MPL的第一句“评论”非常明确? (它应该对limit
说同样的事情。)它说你的构造函数永远不会初始化counter
。事实上,事实并非如此。你的构造函数是:
public Counter(int counter, int limit) {
nCounters++;
}
在此范围内,您希望将实例变量this.counter
和this.limit
设置为某些内容(可能您希望将它们设置为具有相同名称的参数的值)。
重新评论:
如果我知道你在说什么,我可以自己解决。也许关于this.counter部分的更多解释?
如果您不理解上述内容(我们曾经是新手一次!!),我建议您退一步,学习一本优秀的基础Java书籍和/或教程。
“构造函数”是在创建类(对象)实例时自动调用的函数。 (“实例”是一个特定的内存中对象。)例如,当你执行
时Counter c = new Counter(1, 10);
...您正在调用Counter
类的构造函数来创建该类的实例。 Java中的构造函数定义很像定义的方法,但没有返回值,所以我上面引用的是Counter
类的构造函数。
“实例字段”(或“实例数据成员”)实际上是与特定内容相关的变量。您的班级中有两个:counter
和limit
,您已声明如此:
private int counter;
private int limit;
您还有一个名为nCounters
的类(或“静态”)字段:
private static int nCounters = 0;
构造函数的“参数”是您在构造函数定义中放在括号中的内容,因此您的counter
和limit
。即使它们与您的实例字段具有相同的名称(在您的示例中),它们也不会以任何方式与它们相关。如果您愿意,可以给他们c
和l
打电话。
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)
他的意思是:
像这样修改你的构造函数:
public Counter(int counter, int limit) {
this.counter = counter;
this.limit = limit;
nCounters++;
}
在你的代码中你的构造函数没有初始化那些实例变量