0

我有一个旧测试中的问题,我需要知道练习的答案。

我们有以下课程:

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”类(扩展 Object 的相同方法)中重新定义方法 equals,以便她能够在该方法操作的对象和另一个“First”类型之间进行比较目的。如果 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

我对吗?

4

3 回答 3

1

是的,getCount() 是 First 类的静态方法,可以在不实例化任何具体对象的情况下调用它。因此,在您的示例中,通过使用此方法,您可以读取静态变量计数,每当调用构造函数时,计数都会增加 1。因此,如果您创建了 f1 和 f2,count 将为 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 来自动生成此方法)。

于 2012-09-02T08:11:48.943 回答
0

对于第二个问题,是的,你是对的。count 正在计算您对构造函数的调用。每次调用它都会增加。是的,它不是调用对象。

于 2012-09-02T08:02:01.367 回答
0

第 4 行意味着您只是在调用类的静态方法。静态字段或方法不需要访问类的实例,而是可以直接使用类名访问。注意,你的 int count 也是静态字段,静态方法只能访问静态字段和方法。此外,随着每个对象的启动,变量计数会增加,因为它是一个静态字段。静态字段是共享字段。

于 2012-09-02T08:18:12.377 回答