2011-10-02 6 views
3

Java 인터페이스가 java.lang.Object를 암시 적으로 구현합니까? 나는이 인터페이스의 equals 메소드 구현하지 않은 경우에도Java 인터페이스는 Object를 구현합니까?

public static String[] sizeSort(String[] sa) { 

Comparator<String> c = new Comparator<String>() { 
      public int compare(String a, String b) { 
       if (a.length() > b.length()) return 1; 
       else if (a.length() < b.length()) 
        return -1; 
       else 
        return 0; 
       } 
     }; 

// more code 

} 

그것은 잘 작동 : 나는 이런 식으로 뭔가를했을 때

이 질문에

이 일어났다. 답변으로 문제가 해결되었습니다. 그러나 위의 경우 익명의 로컬 내부 클래스 또는 로컬 내부 클래스라는 것을 알 수 있습니까?

+0

이름이 없으므로 익명의 내부 클래스입니다. –

+0

아래에 좋은 답변이 있지만, 이것을 고려해보십시오.'class X {}'- 'equals'을 정의 할 필요가 없습니다. 왜? 명시 적으로 다른 클래스를 암시 적으로 확장하지 않는 * all * 클래스 선언 * * extends * Object (따라서 모든 클래스는 직접 또는 간접적으로 * extends * Object) * 인터페이스를 구현하는 익명 클래스에도 적용됩니다. –

답변

7

일종의. 인터페이스 인터페이스 암시 공공 추상적 멤버 메소드에게 서명의와미터, 반환 r을 입력 선언 직접적인 슈퍼, 다음 이 없으며, 해당 조항 t 를 throw하면

다음 Java Language Specification를 인용 각 공공 예를 방법 서명의와미터, 반환 형식 R,과에 객체에 선언 절 t 를 던져 같은있는 방법하지 않는 한서명, 동일한 반환 유형 및 호환 가능한 throws 절은 인터페이스에서 명시 적으로 입니다. 인터페이스가 명시 적으로 인 경우 인 경우 Object에서 m이 final로 선언 된 경우 m을 선언하면 컴파일 타임 오류가 발생합니다. Object 모든 인터페이스는이 방법을 "상속"최종 및 보호 방법을 가지고 있습니다, 당신은 당신의 "구현하고있는 java.lang에 의해 암시 될 인터페이스에서 그 수정을 (하지 수

참고. 목적").

+0

+1 재미있는 발췌/찾기. 나는 JLS가 Object-contract을 인터페이스에 "승격했다"는 것을 몰랐다. 나는 이것이 그러한 방법의 "쉐도 잉 (shadowing)"에 관해 논의 할 수 있다고 명시 적으로 명시되어 있다고 생각한다. –

+0

+1 흥미 롭습니다. 인터페이스에서도 hashCode를 어떻게 호출 할 수 있습니까? –

6

java.lang.Object는 인터페이스가 아니므로 암시 적으로 인터페이스를 구현하지 않습니다.

그러나 인터페이스를 구현하는 모든 클래스는 모든 클래스가이를 확장해야하기 때문에 Object를 확장합니다. 여러분 (또는 실제로 다른 누구)이 만들 수있는 모든 인스턴스는 java.lang.Object에 정의 된 모든 메소드를 갖게됩니다.

1

엄밀히 말하면 차이점을 어떻게 알 수 있습니까? 인터페이스에 대한 참조는 절대로 사용하지 않으며 항상 실제 인스턴스에 대한 참조가 Object이고 인터페이스를 구현합니다. 즉, 참조의 선언 된 유형이 인터페이스 인 경우에도 참조에서 Object의 메소드를 호출 할 수 있습니다 (물론 null 아님).

+0

그러나 참조의 선언 된 유형은 인터페이스가 될 수 있습니다. 그렇다면 인터페이스에 포함되지 않은 경우 어떻게 equals()를 호출 할 수 있습니까? –

+2

Java는 객체이기도하기 때문에? –

+0

이 질문은 Java가 정확히 "알고있는"방법 인 것으로 보입니다. –

2

Object은 인터페이스가 아닌 클래스이므로 다른 인터페이스에서 "구현"할 수 없습니다.

인터페이스의 요점은 구현 세부 사항이 없다는 것입니다. 인터페이스가 클래스를 확장 할 수있는 경우 해당 클래스의 구현 세부 사항을 상속하므로 해당 사항을 무시합니다.

관련 문제