인터페이스는 Java의 Object 클래스에서 상속받습니다.


157

인터페이스 Object는 Java의 클래스에서 상속 됩니까?

그렇다면 인터페이스 인스턴스에서 객체 클래스의 메소드를 호출하는 방법

public class Test {
    public static void main(String[] args) {
        Employee e = null;
        e.equals(null);
    }
}

interface Employee {
}

56
+1, 훌륭한 질문입니다.
aioobe

@EJP, 기술적으로 말하면 java / io / Serializable.class에 무엇이 포함되어 있는지는 중요하지 않습니다. Java Lang Spec과 JVM 사양을 혼동하고 있다고 생각합니다.
aioobe

@aioobe이 사양 중 하나를 언급하지 않았으므로 귀하의 요점을 이해하지 못합니다. Serializable가장 간단한 인터페이스입니다. javap그것을 실행 하면 그것이 무엇을 상속하는지 알려줍니다. 그리고 그것은 Java Language Specification에 의해 지시됩니다. JVM 스펙이 어딘가에 있다고 생각되면 우리를 계몽하십시오.
Lorne의 후작

2
@ EJP, 질문은 Java 언어 (즉, Java 언어 사양)에 관한 것입니다. java / io / Serializable.class에 포함 된 것은 JVM 스펙의 내용과 관련이 있습니다. 기술적으로 말하면 두 사양의 기능간에 일대일 대응이 있다는 보장은 없습니다.
aioobe

최근 블로그 게시물 에서 이에 대해 자세히 설명했습니다 .
aioobe

답변:


161

인터페이스 Object는 Java의 클래스에서 상속 됩니까?

아닙니다. 그리고 그 문제에 대해 (클래스의 경우와 같이) 모든 인터페이스에 의해 암시 적으로 상속되는 일반적인 "루트"인터페이스는 없습니다. (*)

그렇다면 인터페이스 인스턴스에서 객체 클래스의 메소드를 호출하는 방법

인터페이스는의 각 공개 메소드에 대해 하나의 메소드를 내재적으로 선언했습니다 Object. 따라서 equals메소드는 이미 인터페이스에서 멤버로 암시 적으로 선언됩니다 (이미 슈퍼 인터페이스에서 상속하지 않는 한).

이것은 Java 언어 사양, § 9.2 인터페이스 멤버 에 자세히 설명되어 있습니다.

9.2 인터페이스 멤버

[...]

  • 인터페이스는 직접 슈퍼가없는 경우, 그 인터페이스는 내재적 공용 추상 멤버 메소드 선언 m 시그니처와 리턴 형 R을 한 절 발생 t를 각각 서명 공개 인스턴스 메소드 m에 대응하는 S , 리턴 형 R 및 절 발생 t를 에서 선언 된Object 동일한 서명, 같은 반환 유형과 호환이 절을 던졌습니다있는 방법이 명시 적으로 인터페이스에 의해 선언하지 않는 한,.

[...]


이 게시물은 여기 기사로 다시 작성되었습니다 .


(*)는 존재의 개념주의 의 하위 유형이 일치하지 않는 에서 상속 : 없음 슈퍼 인터페이스 인터페이스는 참의 하위 유형입니다 Object( . § 4.10.2 클래스 및 인터페이스 유형 중 하위 유형 ) 그들은에서 상속하지 않더라도 Object.


1
@aioobe 만약 우리가 어떤 인터페이스를 구현한다면, 그 인터페이스를 구현하고있는 클래스에서 "등호"메소드의 구현을 제공하지 않는 이유는 무엇입니까? 내 개념에 따르면 클래스를 구현할 때 인터페이스의 메소드를 구현해야합니다. 그렇지 않으면 클래스가 추상적입니다.
Vikas Mangal

1
상속 된 메소드를 (다시) 구현할 필요는 없습니다. 이 예제를 살펴보십시오 . 즉, equals는 이미 정의되어 인터페이스를 구현하는 클래스에 상속됩니다.
aioobe

3
여기에 요점이 있습니다. 그러나 하나의 질문-왜 우리가 이것을 필요로합니까? Object클래스 의 메소드가 인터페이스에서 선언되지 않았다면 어떤 차이가 있었 습니까?
Vikas Mangal

2
우리가 이것을 가지고 있지 않다면, 문제의 프로그램은 컴파일되지 않을 것입니다. 인터페이스 에 equals메소드가 Employee있습니다.
aioobe

1
이 질문과 답변은 여전히 ​​경험 후에도 기초를 강하게 만드는 데 집중해야한다는 것을 상기시킵니다.
아난드 j. Kadhi

13

Object 모든 인터페이스의 수퍼 타입이다 [1]

그러나, 인터페이스는하지 않는 implements, extends또는, "상속" Object .

JLS에는 Object인터페이스 에 메소드 를 추가 하기 위한 특별한 절이 있습니다. [2]

[1] http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.10.2

[2] http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.2


가장 정확한 답입니다. 받아 들여 져야합니다. 예를 들어 메소드를 사용하면 java.lang.Object모든 인터페이스 유형에 대한 참조도 허용됩니다. 또한 Object컴파일러 오류없이 인터페이스를 암시 적으로 캐스팅 할 수 있습니다 .
nme 2019

12

실제로 모든 .class파일에는 인터페이스를 나타내는 것을 포함 하여 수퍼 클래스 필드가 있습니다.

인터페이스의 경우 항상을 가리 킵니다 java.lang.Object. 그러나 그것은 아무것도 사용되지 않습니다.

그것을 보는 또 다른 방법은 다음과 같습니다.

interface MyInterface {
    // ...
}

public myMethod(MyInterface param) {
    Object obj = (Object) param;
    // ...
}

여기서 캐스트 (Object) param는 항상 유효하므로 모든 인터페이스 유형이의 하위 유형임을 의미합니다 java.lang.Object.


4
.class 파일은 .java 파일의 결과물입니다. 결과 .class 파일을 보면 왜 Java 언어로 작동하는지 논쟁하는 것은 역 추론입니다.
aioobe

Object obj = (객체) 매개 변수; 컴파일 오류가 발생하지 않습니다. 그러나 MyInterface의 메소드 (공용)는 obj에 표시되지 않습니다. 따라서 MyInterface가 모든 인터페이스 유형이 java.lang.Object의 하위 유형이라고 가정 할 수 없음
sabarinathan u

5

구현employee e = ... 하는 클래스가 있고 variable에 할당되어 있기 때문 입니다. 인터페이스를 구현하는 모든 클래스는 Object를 암시 적으로 확장하므로 사용자가 할 때 언어는의 하위 유형 인 클래스가 있음을 알고 있습니다 . employeeee.equals(null)employee

JVM은 코드에 대한 런타임 검사를 수행합니다 (예 : throw NullPointerException).


답변은 명명 규칙을 준수해야합니다.
Lew Bloch

3

인터페이스는 Object 클래스를 상속받습니다. 인터페이스 유형 참조를 통해 객체 클래스의 메소드에 액세스 할 수있는 방법
No 인터페이스는 Object클래스를 상속하지 않지만 클래스의 모든 메소드에 대한 액세스 가능성을 제공 Object합니다. 인터페이스의 멤버는 다음과 같습니다.

Those members declared in the interface.
Those members inherited from direct superinterfaces.
If an interface has no direct superinterfaces, then the interface implicitly 

Objectclass에 선언 된 각 공개 인스턴스 메소드에 해당하는 공개 추상 멤버 메소드를 선언 합니다.
m이 in으로 선언 된 경우 인터페이스가 이러한 메소드 m을 명시 적으로 선언하면 컴파일 타임 오류 final입니다 Object.

이제 모든 수퍼 인터페이스에에 선언 된 abstractpublic인스턴스 메소드에 해당하는 멤버 메소드 가 있음이 분명합니다 Object.

출처 : http://ohmjavaclasses.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html


0

인터페이스를 구현하는 클래스도 Object정의에 따라 파생 됩니다.


0

" 참조 유형은 모두 java.lang.Object에서 상속됩니다 . 클래스, 열거 형, 배열 및 인터페이스는 모두 참조 유형입니다. "

인용 : http://docs.oracle.com/javase/tutorial/reflect/class/index.html 두 번째 문장은 명확합니다.


Classes, enums, and arrays (which all inherit from java.lang.Object) as well as interfaces are all reference types: 인터페이스가 Object에서 상속한다고 말하지 않습니다. 클래스, 열거 형 및 배열 만
Number945

그들은 그것을 변경 :)
dalvarezmartinez1

"그들이 그것을 바꿨다"(물론 의심 스럽다). 규범적인 참조는 JLS (Java Language Specification)입니다.
Lew Bloch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.