2012-12-10 5 views
3

다음 순환 상속 계층은 Java에서 허용되지 않습니다. 컴파일러에서 오류가 발생하지만 컴파일에 실패한 정확한 원인을 알고 싶습니다. 컴파일러는 오류가 발생합니다 때문에되는 일을 무엇Java의 순환 상속 계층

class A extends B{} 
class B extends C{} 
class C extends A{} // this will give you compile time error. 

, 나는 우리가 C 때문에 이러한 진술에 문제를 줄일 수 있습니다 class C extends A{}

+4

개는 동물이지만 개는 동물이 아닙니다. 그렇지 않으면 모든 동물은 개가 될 것입니다 !! – Thihara

+0

그 말은 얼마나 어리석은 지 보시오 ?? – Thihara

+0

@ Thihara 당신이 맞을 때, 이것은 질문과 직접 ​​관련이 없습니다. 당신의 논리에 따르면 클래스 A는 {A}를 확장 할 것입니다.이 정의는 실제로 똑같은 문제를 극단으로 가져옵니다. – SomeWittyUsername

답변

9

이러한 관계는 단순히 가능하지 않습니다. 그것은 무한 재귀 클래스를 정의합니다. class C을 정의하려면 , 을 정의하려면 class B이 필요하고 class B을 정의하려면 class C이 필요합니다. 그러면 다시 시작점으로 돌아갑니다. 이것은 무한히 계속되어 컴파일러는 이것을 할 수 없으며 논리적 인 의미도 없다.

1

코드를 작성하는 순간 는 IS-AB :

class A extends C{} 
class C extends A{} 

분명히 충돌이므로 컴파일러에서 오류가 발생합니다.

+0

그래서'class A extends A {}'는 괜찮습니까? 'IS-A'는 여기서 문제가되지 않습니다. – SomeWittyUsername

3

을 확장하고 Java는 실제로 하위 클래스 을 확장합니다. 수퍼 클래스는입니다. 이는 하위 객체가 모든 수퍼 객체와 일부 새 구성원 및 일부 지정된 구성원이라는 것을 의미합니다.

는 어떻게

  • A는 확장
  • B가 의 확장 c는 C
  • 로 확장 될 B 할 수 있는가?
우리는 확장이 말할 수

Order Relation 그렇게 : A는 B의미 확장하는 < B (심지어는 아니 < = B), 다음의 경우 B 그것은 너무 < C에서 명백한 것입니다 C는보다 작을 수 없습니다.

1

상속의 개념을 가계도로 추상화합시다. 본질적으로 이것이 바로 그들이 부추 겨서하는 것입니다. 나는 여기에 역 매핑 방식을 사용합니다, 그래서 당신은 당신의 어머니로부터 특정 속성을 상속 A.

  • 에 C에서 내 방식으로 작동합니다.
  • 어머니 은 아버지의 특정 속성을 상속합니다.
  • 할아버지는 상속 사슬에서 가장 높은 것으로 간주 될 수 있습니다.

    • C는
    • B가 상속 A. B.로부터 상속에

    자바,이 결과

  • A는 상속 체인에서 가장 높은 개체입니다.

논리적 극단으로 촬영,이 multiple inheritance, 자바에서 지원되지 않습니다, 아직 interfaces의 사용을 통해 완화 할 수있는 기능을 포함한다.

당신의 상속 계획에 따르면, 할아버지는 손자에게서 직접 물려받습니다.

3

간단한 매우 실용적인 문제가 있습니다 (다른 답변에서 설명 논리적 인 문제 외에) :

인스턴스화하는 동안 초기화해야하는 클래스. 이는 수퍼 클래스를 먼저 초기화하여 Java에서 수행됩니다. 주기가있을 때 초기화 코드는 상속 사다리를 올라가서 도달하지 못한 수퍼 클래스를 초기화하려고 시도합니다 ...

따라서 Java의 경우 금지되어 있어야합니다.

0

순환 상속에는 다음과 같은 두 가지 예가있을 수 있습니다.
1. 클래스 A는 클래스 A에 이미 존재하고 확장해야하는 이유 때문에이 의미가 없습니다.
2. 클래스 A는 B {}를 확장하고 클래스 B는 A {}를 확장합니다. -이 경우 두 클래스의 멤버를 하나의 클래스로 작성한 다음 두 클래스를 작성하고 서로를 확장해야합니다.
위의 사용 사례는 유효하지 않으므로 Java는 순환 상속을 지원하지 않습니다.

0

나는이 스레드에 아직 설명되지 않은 Java 관련 답변을 추가 할 것이라고 생각했습니다. Java에서 모든 클래스는 궁극적으로 Object 클래스에서 파생되어야합니다. 그렇기 때문에 모든 객체를 아무런 문제없이 Object의 인스턴스에 캐스팅 할 수 있습니다. 이 사실을 지원하기 위해 Java Inheritance Tutorial 상태 : 슈퍼 클래스가 없습니다

이외에서는 개체, 모든 클래스가 하나 하나 직접 슈퍼 클래스 (단일 상속)이있다. 다른 명시적인 수퍼 클래스가 없으면 모든 클래스는 암시 적으로 Object의 서브 클래스입니다.

클래스는 클래스 등에서 파생 된 클래스에서 파생 될 수 있으며 궁극적으로 최상위 클래스 인 Object에서 파생됩니다. 이러한 클래스는 Object로 다시 확장되는 상속 체인의 모든 클래스에서 상속 받았다고합니다.

순환 상속 종속성이 허용하는 경우

, 자바의 클래스는 정확히 하나의 직접 슈퍼 클래스 (위 참조), 그 다음 어떤 순환 의존성 체인의 클래스의 인스턴스 (수업 A, B의 예를 들어, 인스턴스 및 C이 있어야하기 때문에)은 허용되지 않는 Object에서 상속 될 수 없습니다. 따라서 이러한 순환 종속성 객체 중 어떤 것도 Object으로 처리 될 수 없습니다. 따라서 컴파일러는 주기적 종속성을 금지해야합니다.

관련 문제