자바 에 서 는 왜 클래스 다 중 계승 을 허용 하지 않 지만 인터페이스 다 중 계승 을 허용 합 니까?

1910 단어 JAVA
먼저 다음 코드 를 보 세 요.
interface a{
    void b();
}
interface a1 extends a{
    void b();
}
interface a2 extends a{
    void b();
}
interface a12 extends a1,a2{
    void b();
}
public class Main {
    public static void main(String args[]){

    }
}

위의 a1 과 a2 는 모두 인터페이스 a 를 계승 하여 b 방법의 정 의 를 얻 었 다.그리고 a12 는 a1 과 a2 를 다시 물 려 받 았 다.마찬가지 로 a12 는 b 방법의 정 의 를 얻 었 다.
그러나 상기 코드 중의 인터페이스 가 모두 클래스 로 바 뀌 었 다 고 가정 합 니 다.만약 에 a12 가 b 방법 을 덮어 쓰 지 않 았 다 면 a1 대 b 방법 이 실현 되 었 고 a2 도 b 방법 을 실현 했다 면 a12 가 계승 하 는 b 방법 은 도대체 어떤 유형의 b 방법 에서 나 온 것 입 니까?이곳 은 어떤 방법 도 버 리 는 것 이 좋 지 않 은 것 같다.
그래서 다 상속 은 갈등 이 생 길 수 있 습 니 다.
인 터 페 이 스 는 구체 적 으로 실현 되 지 않 았 기 때문에 이런 모순 이 나타 나 지 않 을 것 이다.
실현 되 지 않 으 면 더 물 려 받 을 수 있다 면 추상 류 는 더 물 려 받 을 수 있 느 냐 고 물 을 수도 있다.
정 답 은 안 돼!
구체 적 으로 왜 안 되 는 지 제 블 로그 에 계속 관심 을 가 져 주세요~ 
자,이제 말 하 자.추상 류 와 일반 류 가 많이 계승 되 고 있다 는 것 은 나 쁘 지 않다 고 생각한다.
다음 코드 보기:
abstract class a{
    abstract void b();
    void c(){
        System.out.println("c()");
    }
    abstract void d();
    abstract void e();
    abstract void f();
}

abstract class b extends a{
    abstract void b();
    abstract void d();
    abstract void e();
    void f(){
        System.out.println("f()");
    }
    /*abstract void f();*/
}

abstract class c extends a{
    abstract void b();
    abstract void d();
    abstract void e();
    abstract void f();
}

public class Main {
    public static void main(String args[]){
    }
}

만약 에 우리 가 b 와 c 를 계승 하고 f 방법 을 다시 쓰 지 않 는 다 고 가정 하면 문제 가 생 겼 다.류 d 안의 f 방법 은 누구의 f 방법 을 사용 하 는 것 입 니까?당신 은 클래스 b 가 모두 실현 되 었 다 고 생각 할 수 있 습 니 다.당연히 클래스 b 에서 이미 실현 한 f 방법 이 라 고 생각 할 수 있 습 니까?
네가 이렇게 생각한다 면 자바 컴 파일 러 는 류 c 안의 추상 적 인 방법 f 도 보존 할 만 한 특성 이 라 고 생각 할 것 이다.이때 모순 이 생 겼 다.
하지만 인 터 페 이 스 를 사용 하면 단일 합 니 다.모든 인 터 페 이 스 는 이 루어 지지 않 았 습 니 다~그 러 니 어느 인터페이스 에서 든 계승 하고 덮어 쓰 는 방법 은 상관 없습니다~

좋은 웹페이지 즐겨찾기