인터페이스가 다른 인터페이스를 구현할 수없는 이유는 무엇입니까?


104

내가 말하고 싶은 건:

interface B {...}

interface A extends B {...} // allowed  

interface A implements B {...} // not allowed

나는 그것을 봤는데 이것을 발견 했다 .

implements인터페이스의 메소드에 대한 구현을 정의하는 것을 나타냅니다. 그러나 인터페이스에는 구현이 없으므로 불가능합니다.

그러나 인터페이스는 100 % 추상 클래스이고 추상 클래스는 메서드를 구현하지 않고도 인터페이스 (100 % 추상 클래스)를 구현할 수 있습니다. "인터페이스"로 정의 할 때 문제는 무엇입니까?

세부적으로

interface A {
    void methodA();
}

abstract class B implements A {} // we may not implement methodA() but allowed

class C extends B {
   void methodA(){}
} 

interface B implements A {} // not allowed. 
//however, interface B = %100 abstract class B

답변:


110

implements구현을 interface의미 interface하지 않습니다.

100 % abstract class는 기능적으로는과 동일 interface하지만 원하는 경우 구현할 수도 있습니다 (이 경우 100 %로 유지되지 않음 abstract). 따라서 JVM의 관점에서 보면 서로 다릅니다.

또한 100 % 추상 클래스의 멤버 변수는 모든 액세스 한정자를 가질 수 있으며, 인터페이스에서는 암시 적으로 public static final있습니다.


8
Java 8부터 인터페이스는 기본 메소드를 가질 수 있으므로 그 점에서 추상 클래스와 훨씬 유사합니다.
forresthopkinsa

4
마지막 문장 감사합니다!
Tao Zhang

24

implements동작이 abstract메서드에 대해 정의된다는 것을 의미합니다 (분명히 추상 클래스 제외). 구현을 정의합니다.

extends 행동이 상속됨을 의미합니다.

인터페이스를 사용하면 한 인터페이스가 다른 인터페이스와 동일한 동작을 가져야한다고 말할 수 있으며 실제 구현도 없습니다. 그렇기 때문에 extends구현하는 대신 다른 인터페이스 에 대한 인터페이스가 더 합리적입니다 .


참고로, abstract클래스가 abstract메서드 를 정의 할 수 있다고해도 (인터페이스의 정상적인 방식) 여전히 클래스 이며 상속 (확장)되어야하며 구현되지 않아야합니다.


4

개념적으로 두 개의 "도메인"클래스와 인터페이스가 있습니다. 이러한 도메인 내에서는 항상 확장하고 있으며 클래스 만 "국경을 넘나 드는"인터페이스를 구현합니다. 따라서 기본적으로 인터페이스에 대한 "확장"은 클래스의 동작을 반영합니다. 적어도 나는 이것이 논리라고 생각합니다. 모든 사람들이 이런 종류의 논리에 동의하는 것은 아닌 것 같습니다.


"Y가 X를 확장하고"봉인되지 않은 경우 "Y"를 확장하는 다른 유형 "Z"를 가질 수 있습니다. X가 인터페이스 든 클래스 든 마찬가지입니다. 그러나 "W가 X를 구현"하는 경우 "V가 W를 구현"할 수 없습니다. "확장"이 "체인"및 "구현"이 될 수 있다는 사실은 다른 키워드를 갖는 좋은 이유처럼 보이지 않습니다.
supercat 2013-08-15

2

그러나 인터페이스는 100 % 추상 클래스이고 추상 클래스는 메서드를 구현하지 않고도 인터페이스 (100 % 추상 클래스)를 구현할 수 있습니다. "인터페이스"로 정의 할 때 문제는 무엇입니까?

이것은 단순히 관습의 문제입니다. 자바 언어의 작성자는 "확장"이이 관계를 설명하는 가장 좋은 방법이라고 결정했기 때문에 우리 모두가 사용하는 것입니다.

일반적으로 인터페이스가 "100 % 추상 클래스"라고해도 우리는 그렇게 생각하지 않습니다. 우리는 일반적으로 인터페이스를 파생 할 클래스가 아닌 특정 키 메서드를 구현하기위한 약속으로 생각합니다. 그래서 우리는 클래스보다는 인터페이스에 다른 언어를 사용하는 경향이 있습니다.

다른 사람들이 말했듯이 "구현"보다 "확장"을 선택하는 데에는 좋은 이유가 있습니다.


알겠습니다. 그것은 관습의 문제입니다. 많은 사람들 이 개인적인 관점에서 Sun의 원래 Java 언어 제약을 논리적으로 정당화하려고합니다 . 컴파일러가 "implements"인터페이스를 추가했다면 같은 사람들이 그것을 정당화했을 것입니다. :-)
Little Santi

1

이것이 내가 대학에서 oops (core java)에서 배운 것을 조금이라도 도울 수 있기를 바랍니다.

구현은 인터페이스의 메소드에 대한 구현을 정의하는 것을 나타냅니다. 그러나 인터페이스에는 구현이 없으므로 불가능합니다. 그러나 인터페이스는 다른 인터페이스를 확장 할 수 있습니다. 즉, 더 많은 메서드를 추가하고 해당 유형을 상속 할 수 있습니다.

여기에 아래의 예가 있습니다. 이것은 제가 이해하고 배운 것입니다.

interface ParentInterface{  
        void myMethod();  
}  

interface SubInterface extends ParentInterface{  
        void anotherMethod();  
}  

그리고 하나의 인터페이스는 다른 인터페이스 만 확장 할 수 있으며 일부 클래스에서 기능을 정의하려는 경우 인터페이스 만 구현할 수 있다는 점을 명심하십시오.

public interface Dog
{
    public boolean Barks();

    public boolean isGoldenRetriever();
}

이제 클래스가이 인터페이스를 구현하는 경우 다음과 같습니다.

public class SomeClass implements Dog
{
    public boolean Barks{
    // method definition here

    }

    public boolean isGoldenRetriever{
    // method definition here
    }
}

추상 클래스에 추상 함수 정의 및 선언이 있고 해당 함수를 정의하거나 해당 함수를 구현한다고 말할 수있는 경우 추상 클래스 만 확장 할 수 있기 때문에 해당 클래스를 확장한다고 가정합니다. 여기에 예가 있습니다.

public abstract class MyAbstractClass {

    public abstract void abstractMethod();
}

다음은 MyAbstractClass의 예제 하위 클래스입니다.

public class MySubClass extends MyAbstractClass {

    public void abstractMethod() {
        System.out.println("My method implementation");
    }
}

0

인터페이스는 기능을 제공하지 않는 추상화와 같습니다. 따라서 '구현'하는 것이 아니라 다른 추상화 나 인터페이스를 확장합니다.


-6

Interface는 어떤 객체도 생성 할 수없는 추상 메서드를 포함하는 클래스로, 인터페이스는 객체를 생성 할 수없고 순수한 클래스가 아니므로 구현할 가치가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.