类本身的静态方法?

时间:2012-09-02 07:55:03

标签: java static-methods static-members

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

我们有以下课程:

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

我是对的吗?

3 个答案:

答案 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计数也是静态字段,静态方法只能访问静态字段和方法。此外,随着每个对象的启动,变量计数也会增加,因为它是一个静态字段。静态字段是共享字段。