2012-09-02 3 views
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 선 후에는 다음과 같이해야한다고 알고 선 # 4와 같은 라인의 의미는 무엇 나이 방해

First constructor2 
First constructor1 
First constructor2 
sum1 = 20 

유일한 것은? 그것은 객체 대신 클래스 자체에서 작동하는 메소드입니까?

또 다른 질문은 부분 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 

내가 맞죠 :

나는 이런 식으로 뭔가에 대해 생각?

답변

1

예, getCount()는 구체적인 객체를 인스턴스화하지 않고 호출 할 수있는 클래스 First의 정적 메서드입니다. 따라서이 메소드를 사용하는 예제에서는 정적 변수 카운트를 읽을 수 있습니다.이 카운트는 생성자가 호출 될 때마다 1 씩 증가합니다. 따라서 일단 f1과 f2를 만들면 count는 2가 될 것입니다. "count"는 모든 First 인스턴스가 공유하는 변수입니다. 당신이 게터가이를 사용할 필요가 있으므로

귀하의 등호() 메소드는 먼저 둘째

public boolean equals(Object obj) 

를 오버라이드 (override) 할 필요가 무엇 때문에 작동하지 않습니다, NUM1 및 num2를 개인 있습니다. 뭔가 같은 :

public boolean equals(Object obj) { 
    return num1 == (First)obj.getNum1() && num2 == (First)obj.getNum2(); 
} 

당신은 대체 당신이 공공 INT의 해시 코드()

해시 코드의 예() 오버라이드 (override) 할 필요가 동일한 경우 :

public int hashCode() { 
    int result = 5; 
    result = 31 * result + num1; 
    result = 31 * result + num2; 
    return result; 

}

(5, 31 (예 : Eclipse를 사용하여이 메소드를 자동으로 생성 할 수도 있습니다).

+0

1. 작성한 equals 메서드에 대해 설명해 주시겠습니까? 2. 왜 hashCode()도 재정의해야합니까? thx – Adam

+0

equals() 및 hashCode()의 관계는 다음에서 설명합니다. http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java – bibac

+0

equals 메서드는 지정된 조건의 true를 반환합니다. 사실이다. method 매개 변수에서 getter를 호출하려면 유형에 유형을 캐스팅해야합니다. 먼저. 재정의하는 메서드는 Object를 매개 변수로 정의하고 Object는 특정 메서드/Getter에 대해 알지 못합니다. 따라서 우리는 현재 객체 (equals 메소드를 포함하고 있습니다)와 메소드에서 주어진 객체의 getNum1() 값을 비교합니다. num1 == num1 && num2 == num2 == true. 표현식이 이미 true/false를 반환하기 때문에 메서드에 "if"가 필요하지 않습니다. – bibac

0

두 번째 질문의 경우 네가 옳습니다. 카운트가 생성자에 대한 호출을 계산 중입니다. 호출 할 때마다 증가합니다. 그리고 네, 그것은 객체에 대한 호출이 아닙니다.

0

4 행은 단순히 클래스의 정적 메서드를 호출한다는 의미입니다. 정적 필드 또는 메소드는 액세스 할 클래스의 인스턴스를 필요로하지 않고 대신 클래스 이름을 사용하여 직접 액세스 할 수 있습니다. int count는 정적 필드이기도하며 정적 메서드는 정적 필드와 메서드에만 액세스 할 수 있습니다. 또한 각 객체 초기화와 함께 정적 필드이기 때문에 변수 수가 증가합니다. 정적 필드는 공유 필드입니다.

+0

그러면 4 행 다음에 화면에 무엇을 인쇄해야합니까? – Adam

+0

f1을 사용하면 첫 번째 생성자를 호출하고 두 번째 생성자도 호출하므로 3을 출력합니다. f2를 사용하면 두 번째 생성자 만 호출됩니다. –

+0

카운트는 라인 6 이후에도 3으로 유지됩니다. 맞습니까? – Adam

관련 문제