2012-05-14 2 views
0

자바에서 인터페이스와 추상 클래스 간의 차이점을 묻는 것은 매우 기본적인 고전적이며 간단한 질문입니다. 그러나이 질문은 조금 다릅니다.다중 상속에 대한 제한이 제거되면 Java에서 인터페이스와 Abstract 클래스의 차이점은 무엇입니까?

나는 Java가 다이아몬드 문제를 피하기 위해 여러 클래스로부터 상속하는 것을 지원하지 않기 때문에 다중 상속의 종류를 용이하게하는 대체 방법으로 인터페이스 개념을 생각해 냈습니다. 하지만 이것이 인터페이스가 존재하는 유일한 이유입니까?

어떤 이유로 새로운 버전의 Java Guys가이 제한을 극복하고 여러 클래스에서 상속을 허용한다고 가정하면 추상 클래스와 인터페이스의 차이점은 무엇입니까? 그것들은 단순히 동의어일까요? 인터페이스가 여전히 존재할 이유가 있거나 중복 될 수 있습니까?

+0

을 대체 할 수 여러 * 완전 * 추상 클래스? (예 : * 오직 * 추상적 인 메소드를 가진 클래스) – aioobe

+0

m 자바가 너무 늦어서 많은 코드가 이미 오래된 규칙으로 쓰여졌 고 호환성 문제가 많이 발생했을 것입니다. – WickeD

+0

You 추상적 인 클래스의 개념과 인터페이스에 대해 토론 할 수는 없습니다. 당신은 프로그래밍상의 문제들만을 물을 수 있습니다. 그리고 여기에 순수한 추상 클래스가 인터페이스와 동일하다고 말할 수 없습니다. 예. 추상 클래스에서 여러 클래스를 상속받을 수 있습니까? 그렇지 않습니다. 인터페이스가 있어야합니다. –

답변

3

클래스는 하나의 추상 메소드가있는 경우 "추상"입니다. 다른 메소드가 abstract 클래스에서 구현 될 수 있습니다. 인터페이스는 그렇게 할 수 없습니다. 그들은 순전히 추상입니다.

public interface Iface { 
    void foo() { 
     System.out.println("Foo"); 
    } 
} 
$ javac Iface.java 
Iface.java:2: interface methods cannot have body 
    void foo() { 
      ^
1 error

그러나 당신은 완전히 추상 클래스 당신은 내가 즉시 실제 남아있는 차이를 보이지 않아요 다중 상속을 가정하는 경우 모든 방법이   — 다음 추상적이다   —에 대해 이야기하는 경우 , 아니. 위의 질문에 대한 내 댓글에 다시


는 :

그러나 오히려 그 자바는 여러 클래스에서 상속하여 허용했다 이해하려고, 그것의 언어 사양의 실체와 같은 인터페이스를했을 것이다.

Java가 1 일째부터 다중 상속을 받았을 경우, 추상 클래스가 작업을 완료 했으므로 불가능합니다.

+1

하지만 모든 추상 메소드가 인터페이스처럼 잘 작동하는 순수 추상 클래스를 가질 수 있습니다. 그렇다면 인터페이스가 왜 필요합니까? – Drona

+0

@VikasNalwar : 개념적으로 차이가 있지만 더 중요한 것은 Java가 실제로는 (단일 상속), 인터페이스를 사용하면 다중 인터페이스를 구현하여 다중 상속을 "라이트"로 가질 수 있다는 것입니다. –

+1

'Foo'라는 속성을 가진'Interface1'이'Derived1'과'Derived2' 인터페이스에 의해 상속되는 경우, 둘다'Subderived1','Subderived1'에 의해 상속되는 두 메소드는'Foo'라는 하나의 메소드만을 가질 수 있습니다 오버라이드는 4 개의 인터페이스 모두에서 공유됩니다. 추상 클래스를 사용하면 상황이 더 어두워 질 수 있습니다. – supercat

2

단순히 동의어입니까? 인터페이스가 여전히 존재할 이유가 있거나 중복 될 수 있습니까?

(당신은 인터페이스와 추상 클래스를 비교하는 공통의 문제라는 사실을 인식하는 것 때문에, 나는 당신이 인터페이스는 상태도 기본 메소드 구현이 없을 수 있다는 것을 알고 가정합니다.)

클래스가 인 추상 메소드가 인 인터페이스와 같기 때문에 인터페이스에서는 인터페이스가 단지 구문 설탕이 될 것입니다.

코드에서

,

interface Foo { 
    void method(); 
} 

class MyClass extends MyBaseClass implements Foo { 
    public void method() { ... } 
} 

는 가설

abstract class Foo { 
    public abstract void method(); 
} 

class MyClass extends MyBaseClass, Foo { 
    public void method() { ... } 
} 

관련 질문 (거의 DUP에 상응하는 말 것입니다!) :

+0

나는 논리적 인 추론에 완전히 동의하는 것 같다. 그래서, 우리는 인터페이스를 전혀 필요로하지 않을 것입니다. – Drona

+0

맞습니다.하지만 추상 클래스가 없어도 가능합니다. :-) 처음부터 언어에 통합 된 이유는 아마도 구현과 인터페이스 간의 개념적으로 명확한 분리를 제공하기 때문일 것입니다. – aioobe

+0

인터페이스 메서드는 항상 public입니다. 하지만 오케이, 우리는 그것이 이상한 일이며 아무 쓸모가 없다고 말할 수 있습니다. – dube

0

아직도 내가 difference.Interface 구현 당신에 속하는 만하는 계약은 다중 상속에 제한이 removed.In 자바, 당신이 할 수있는 경우에도, 거기라고 생각합니다 인터페이스를 사용하여 다중 상속 동작을 파생하지만 실제 다중 상속의 모든 기능을 가져올 수는 없습니다 (예 : 수퍼 클래스 호출 등). 이는 단지 기술의 일종입니다.

추상 클래스는 부분적인 개체 엔터티입니다. 전체 구현도 포함 할 수 있습니다. 여러 클래스를 확장 할 수 있다고하더라도 인터페이스로 수행하는 작업은 다릅니다. 다중 상속 및 추상 클래스와 인터페이스는 다릅니다. Java에서.

+0

하지만 인터페이스를 사용하지 않고 순수한 클래스를 사용하여 계약을 시행 할 수 있다고 생각하지 않습니까? – Drona

+0

그런 경우 자바 용어의 관점에서 우리는 그것을 계약으로 부르지 않을 것입니다, 우리는 그것을 "오버 라이딩"하거나 기존의 행동을 변경합니다. 그렇지 않습니까? – UVM

+0

그러나 인터페이스가있는 경우처럼 순수 추상 클래스에서 동작을 구현하지는 않습니다. 그래서, 우리는 아무것도 무시하지 않을 것입니다. C++에서와 같은 방식으로; 우리는 순수 추상 클래스를 통해 계약을 시행 할 수 있습니다. – Drona

0

인터페이스는 이미 공개 추상 메소드 만 허용하는 특수 추상 클래스 유형입니다.

이것은 다이아몬드가 허용되지 않는 계약을 준수하도록 강요하는 패턴입니다. 당신이 그것을에 어떤 구현을 가지고 있지위한 추상 클래스를 확인하실 수 있습니다 컴파일러를 만들 경우

그래서, 당신은 허용 클래스에서 상속 할 경우 의미 (이 계약을 준수) 추상 클래스와 모든 인터페이스

관련 문제