2013-04-27 3 views
10

인터페이스가 java/lang/Object으로 확장되지 않더라도 JVM 사양에 super_classjava/lang/Object이 있어야한다고하는 이유는 무엇입니까?인터페이스가 클래스 파일 형식에 따라 Object를 확장하는 이유는 무엇입니까?

내가 특별히 그것을 말한다 JVM 스펙의 §4.1 말하는 겁니다 :

을 인터페이스의 경우는 super_class 항목의 값은 항상있는 constant_pool 테이블에 유효한 인덱스해야합니다. 해당 인덱스의 constant_pool 항목은 Object 클래스를 나타내는 CONSTANT_Class_info 구조 여야합니다.

아직 JLS의 §9.2에는 인터페이스가 객체를 확장하지 않는다고합니다. 인터페이스는 직접적인 슈퍼가 없습니다

경우, 인터페이스가 암시 적으로 서명 S, 반환 형식의 연구와 공공 추상적 인 멤버 메소드의 m은 선언 대신 암시 적으로 생성 된 추상 메소드는 Object 클래스의 각 공용 방법을 일치하는 선언 , 동일한 서명, 동일한 반환 유형 및 호환 가능한 throws 절을 가진 메소드가 명시 적으로 선언되지 않는 한, 서명 s, 반환 유형 r 및 객체에 선언 된 throws 절을 사용하여 각 공용 인스턴스 메소드 m에 해당하는 절 t를 throw합니다. 인터페이스.

답변

7

§9.2에서 언급 한 바와 같이 : 인터페이스는 직접적인 슈퍼, 다음 인터페이스 암시 서명 의, 반환 형식의 연구와 공공 추상적 인 멤버 방법 m를 선언이 없으며, 절 t를 던졌습니다

경우 각 공용에 해당하는 서명이있는 인스턴스 메서드 m, 반환 형식 r 및 throws 절 t 이 동일한 서명, 동일한 반환 형식 및 호환 가능한 throws 절이있는 메서드가에 의해 명시 적으로 선언되어 있지 않으면3210 인터페이스. 따라서

, 우리는 인터페이스가 직접 슈퍼가없는 있지만 않습니다 명시 적으로 Object 확장하지 않는 것을 볼 수 있지만이 같은 서명과 추상적 인 방법을 삽입하는 컴파일러에 의해 사용되는 여전히 내부적으로 Object 클래스 링크가 인터페이스 내에서 Object 클래스의 공용 메소드의 반환 유형 및 throws 절을 반환합니다. 그래서 인터페이스의 경우 super_class 항목의 값은 항상 constant_pool 테이블에 대한 유효한 인덱스 여야합니다. 해당 인덱스의 constant_pool 항목은 오브젝트 클래스를 나타내는 CONSTANT_Class_info 구조 여야합니다. 이것이 인터페이스 참조 변수가 toString() 메서드 (예 : Object)와 같은 public 인스턴스 메서드를 성공적으로 호출 할 수있는 이유입니다. 예를 들어, 코드는 아래에 주어진 고려 :

interface MyInterface 
{} 
public class InterfaceTest implements MyInterface 
{ 
    public static void main(String[] args) 
    { 
     MyInterface mInterface = new InterfaceTest(); 
     System.out.println(mInterface.toString());//Compiles successfully. Although toString() is not declared within MyInterface 
    } 
} 

위의 코드는 MyInterface 내에서 선언되지 않았습니다 (Object의 방법입니다) 성공적으로 비록 toString() 방법을 컴파일합니다. 위의 코드는 내 시스템에서 다음 출력을 제공합니다.

[email protected] 

출력은 시스템마다 다를 수 있습니다.

0

JVM 사양에서 볼 수있는 것은 기본적으로 클래스가 인터페이스를 구현하고 구현 세부 사항을 갖고있는 것처럼 JLS에서 지정된 동작의 구체적인 구현입니다.

관련 문제