2013-09-05 3 views
3
public interface A { 
    class Aclass { 
     int constants = 100; 
     public void display() 
     { 
      System.out.println("Inside A"); 
     } 
    } 
    public void display(); 

} 
public interface B { 
    class Bclass { 
     int constants = 130; 

     public void display() { 
      System.out.println("Inside B"); 
     } 
    } 
    public void display(); 
} 

public class MultipleInheritance implements A, B { 

    @Override 
    public void display() { 
     A.Aclass a = new A.Aclass(); 
     System.out.println(a.constants); 
     B.Bclass b = new B.Bclass(); 
     System.out.println(b.constants); 
    } 

    public static void main(String args[]) { 

     new MultipleInheritance().display(); 
    } 
} 

비록 인터페이스를 통해 이루어 지지만 상속받지 않은 구체적인 클래스를 통해서가 아니라 내부 클래스를 유지하기가 어려울지라도 여전히 코드 재사용은 아니지만 여전히 다중 상속 역할을합니다 가능한 경우 메모리 표현으로 정리하십시오.다중 상속인가? 그렇지 않은 경우?

+5

아무 것도 거기에서 다중 상속하지 않습니다. 그래서 그렇지 않습니다. – Mat

+0

하지만 인터페이스는 여전히 최종 정적 (모든 구문이 다르지만 동작이 동일합니다.) 인 추상 클래스와 같습니다. 이렇게하면 인터뷰 담당자와 매우 뜨거운 질문이 될 수 있습니다. – Prashant

+1

[ "Abstract Classes versus Interfaces"] (http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html) 및 [ "인터페이스 및 다중 상속"] (http : //docs.oracle.com/javase/tutorial/java/IandI/createinterface.html) 섹션을 참조하십시오. – Ben

답변

5

코드에 실제로 무엇이 있는지 살펴 보겠습니다. 여기

public interface B { 
    class Bclass { 
     int constants = 130; 

     public void display() { 
      System.out.println("Inside B"); 
     } 
    } 
    public void display(); 
} 

가 인스턴스화 Aclass :

A.Aclass a = new A.Aclass(); 

그리고 여기 여기

public interface A { 
    class Aclass { 
     int constants = 100; 
     public void display() 
     { 
      System.out.println("Inside A"); 
     } 
    } 
    public void display(); 
} 

당신이 인터페이스 B와 중첩 클래스 Bclass 선언 : 여기 당신은 인터페이스 A와 중첩 클래스 AClass 선언 Bclass을 인스턴스화하면

을 인스턴스화합니다.

이제 AclassBclass은 전혀 관련이없는 두 가지 클래스입니다. 이 두 가지 공유 상위 유형은 Object입니다.

분명히 두 가지 유형을 상속하지 않으려는 경우에도 다중 상속에 대해 말할 수는 없습니다. 여기

두 슈퍼 타입 포함 적어도 시도 할 :

public class MultipleInheritance implements A, B { ... } 

을하지만 당신은 당신의 코드에서 이러한 유형을 포함하지, 그것은 main 방법의 단지 컨테이너입니다.이 유형은 두 인터페이스를 구현하는 동안 두 인터페이스를 상속하지 않으며 두 가지 고유 한 유형 (Aclass, Bclass)을 상속합니다. 이름이 같더라도 다중 상속은 여전히 ​​존재하지 않습니다. 명명 충돌 만 발생합니다.

다중 상속은 정확하게 메서드 구현의 상속에 관한 것이며 명확하게 Java에서이를 구현할 수 없습니다.

0

이것은 다중 상속이 아니지만 동일한 시뮬레이션입니다. 자바에서 다중 상속을 허용하지 뒤에 이유는 당신이를 통해 서브 클래스의 인스턴스를 호출하지 않는 한이 다중 상속하지 않습니다 추가 정보를

0

에 대한 인터페이스 see 이의 경우에는 발생하지 않습니다 다이아몬드의 문제였다 아래 그림과 같이 슈퍼 클래스 :

A a = new MultipleInheritance(); 
a.display(); 

당신은 컴파일러의 유효성을 확인 하지 MulipleInheritance 인 변수의 유형을 찾습니다으로 혼동이 없다, 그렇게하더라도 요구.

두 개의 display() 메서드를 사용하는 데 컴파일러가 불평하지 않는 이유는 둘 다 비어 있기 때문에 어느 것이 사용되는지 (A 또는 B의 값)는 중요하지 않기 때문입니다. 이렇게하면 C++ 에서처럼 A 및 B bean 클래스가 모두 생길 수있는 혼란을 피할 수 있습니다.

관련 문제