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を拡張する同じメソッド)内で等しいメソッドを再定義して、メソッドが動作するオブジェクトと別の「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を作成すると、カウントは2になります。「カウント」は、すべての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

2番目の質問については、はい、その通りです。countは、コンストラクターの呼び出しをカウントしています。呼び出しごとに増加します。はい、それはオブジェクトの呼び出しではありません。

于 2012-09-02T08:02:01.367 に答える
0

4行目は、単にクラスの静的メソッドを呼び出していることを意味します。静的フィールドまたはメソッドには、アクセスするクラスのインスタンスは必要ありません。代わりに、クラス名を使用して直接アクセスできます。intカウントも静的フィールドであり、静的メソッドは静的フィールドとメソッドにのみアクセスできることに注意してください。また、静的フィールドであるため、オブジェクトが開始されるたびに、変数の数が増加します。静的フィールドは共有フィールドです。

于 2012-09-02T08:18:12.377 に答える