我有一个问题是在较旧的测试中,我需要知道练习的答案。
我们有以下课程:
public class First{
private int num1 = 0;
private int num2 = 0;
private static int count = 0;
public First(int num){
this(num,num);
count++;
System.out.println("First constructor1");
}
public First(int num1, int num2){
this.num1 = num1;
this.num2 = num2;
count++;
System.out.println("First constructor2");
}
public int sum(){
return num1 + num2;
}
public static int getCount(){
return count;
}
}
现在我们正在执行以下命令:
1. First f1 = new First(10);
2. First f2 = new First(4,7);
3. System.out.println("sum1 = " + f1.sum());
4. System.out.println("count = " + First.getCount());
5. System.out.println("sum2 = " + f2.sum());
6. System.out.println("count = " + First.getCount());
我需要记下6行后将在屏幕上打印的行。 我知道在前3行之后它应该是这样的:
First constructor2
First constructor1
First constructor2
sum1 = 20
唯一让我感到困扰的是,第4行这样的线路是什么意思?它是一个操作类本身而不是对象的方法吗?
另一个问题是,在B部分我们需要在'First'类中重新定义方法equals(扩展Object的方法相同),这样她就可以比较该方法操作的对象和另一个'第一个'类型对象。如果num1,num2都等于。
,则该方法返回true我想到了这样的事情:
public class First {
...
...
.
.
.
public boolean equals (First anotherObj){
if ((First.num1 == anotherObj.num1) && (First.num2 == anotherObj.num2))
return true;
return false;
} // equals
} // 'First' class
我是对的吗?
答案 0 :(得分:1)
是的,getCount()是类First的静态方法,可以在不实例化任何具体对象的情况下调用它。因此,在您的示例中,通过使用此方法,您可以读取静态变量计数,每当调用构造函数时,计数就会增加1。因此,如果您创建f1和f2计数将为2.“count”是所有First实例共享的变量。
你的equals()方法不起作用,因为首先你需要覆盖
public boolean equals(Object obj)
其次,num1和num2是私有的,因此您需要一个Getter才能使它们可用。 类似的东西:
public boolean equals(Object obj) {
return num1 == (First)obj.getNum1() && num2 == (First)obj.getNum2();
}
如果覆盖equals,则还应覆盖public int hashCode()
hashCode()示例:
public int hashCode() {
int result = 5;
result = 31 * result + num1;
result = 31 * result + num2;
return result;
}
(5和31是素数,您也可以使用例如Eclipse自动生成此方法)。
答案 1 :(得分:0)
对于第二个问题,是的,你是对的。 count正在计算你对构造函数的调用。每次调用它都会增加。是的,它不是对象的召唤。
答案 2 :(得分:0)
第4行意味着您只是调用类的静态方法。静态字段或方法不需要要访问的类的实例,而是可以使用类名直接访问它。 请注意,您的int计数也是静态字段,静态方法只能访问静态字段和方法。此外,随着每个对象的启动,变量计数也会增加,因为它是一个静态字段。静态字段是共享字段。