Java 类本身上的静态方法?

Java 类本身上的静态方法?,java,static-methods,static-members,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 construc

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

我们有以下课程:

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
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行这样的行是什么意思?它是对类本身而不是对象进行操作的方法吗

另一个问题是,在第B部分中,我们需要在“First”类(扩展对象的同一个方法)中重新定义方法equals,以便她能够在方法操作的对象和另一个“First”类型的对象之间进行比较。如果num1和num2都相等,则该方法返回true

我想到了这样的事情:

First constructor2
First constructor1
First constructor2
sum1 = 20
public class First {
...
...
.
.
.

    public boolean equals (First anotherObj){
        if ((First.num1 == anotherObj.num1) && (First.num2 == anotherObj.num2))
            return true;
        return false;
    } // equals
} // 'First' class

我说得对吗?

第二个问题,是的,你说得对。 计数就是计算你对构造函数的调用。每次调用它都会增加。是的,它不是对对象的调用。

是的,getCount()首先是类的静态方法,可以在不实例化任何具体对象的情况下调用它。因此,在您的示例中,通过使用此方法,您可以读取静态变量计数,每当调用构造函数时,静态变量计数将增加1。所以,一旦创建f1和f2,计数将为2。“count”是所有第一个实例共享的变量

您的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()的示例:

}


(5和31是素数,您也可以使用Eclipse自动生成此方法)。

第4行表示您只需调用该类的静态方法。静态字段或方法不需要访问类的实例,相反,可以使用类名直接访问它。
注意,int计数也是一个静态字段,静态方法只能访问静态字段和方法。此外,每次启动对象时,变量计数都会增加,因为它是一个静态字段。静态字段是共享字段。

1。你能解释一下你写的equals方法吗?2.为什么我还需要重写hashCode()?此处解释了equals()和hashCode()的关系:equals方法返回指定条件为true时的true。为了在方法参数上调用getter,必须将其强制转换为您的类型,例如,First。您覆盖的方法只将对象定义为参数,而对象不知道您的特定方法/Getter。因此,我们将当前对象(包含equals方法)的num1与方法中给定对象的getNum1()值进行比较。num1==num1&&num2==num2==true。您不需要在方法中使用“if”,因为表达式已经返回true/false我能做什么:public boolean equals(Object obj){if(obj==null){return false;}if(obj==this){return true;}return true;}public int hashCode{return 0;}我认为是时候让您开发一个Java IDE和一个调试器,并找出正在发生的事情了。:)那么第4行之后屏幕上应该打印什么呢?它将打印3,因为f1调用第一个构造函数,在其中调用第二个构造函数;对于f2,只调用第二个构造函数。是的,您知道,计数增量只与构造函数调用关联,并且构造函数只在初始化时被调用。计数仅在从其类初始化新对象时增加。即使重新初始化,也可以说f1为,f1=新的第一个(20,10);然后它又增加了计数。