2016-06-02 7 views
-3

Diese Frage war Teil des OCJP und ich bekomme Option A (Alpha Beta), aber die Antwort ist E (Kompilierung fehlgeschlagen). Verstehe nicht, wie es passiert ist.Vererbung in Java - Kompilierung fehlgeschlagen

Kann mir bitte jemand erklären?

class Alpha { 
    String getType() { return "alpha"; } 
} 
class Beta extends Alpha { 
    String getType() { return "beta"; } 
} 
class Gamma extends Beta { 
    String getType() { return "gamma"; } 

    public static void main(String[] args) { 
     Gamma g1 = new Alpha(); 
     Gamma g2 = new Beta(); 
     System.out.println(g1.getType() + " " + g2.getType()); 
    } 
} 

Was ist das Ergebnis?

  • A) alpha beta
  • B) beta beta
  • C) gamma gamma
  • D) alpha alpha
  • E) Compilation ausfällt.
+5

Haben Sie den Compilerfehler gelesen? – SLaks

+2

Schauen Sie sich die Hierarchie an, lesen Sie den Compilerfehler, schauen Sie sich die Hierarchie an, finden Sie die Antwort selbst heraus, lernen Sie. –

+1

Ziemlich sicher 'Gamma g1 = neues Alpha();' muss sein 'Alpha g1 = neues Gamma();' –

Antwort

2

die Vererbungshierarchie zeigt:

  • Betaist-anAlpha
  • Gammaist-aBeta

aber das bedeutet nicht, dass Alpha oder Beta ist ein Gamma, daher schlägt die Kompilierung aufgrund Ihres Versuchs fehl, eine Instanz von Alpha oder Beta zu Gamma zuzuweisen.

0

Sie können eine Klasse instanziieren, aber als eine super Klasse deklarieren, aber nicht umgekehrt.

In sehr einfachen Worten, ein Ferrari ist eine Art von Auto, aber ein Auto ist keine Art von Ferrari. Eine Banane ist eine Art von Früchten, aber eine Frucht ist keine Art von Banane.

Daher ...

Alpha test1 = new Gamma(); 
Beta test2 = new Gamma(); 
Alpha test3 = new Beta(); 

... wäre schön, wie Sie eine Gamma sind Instanziieren (oder Beta) Objekt, sondern nur über die definierte Alpha und Beta-Schnittstellen in ihre Basisklassen für den Zugang. Es ist nur über vollständig gemeinsam genutzte Schnittstellen zulässig. Ein Gamma ist eine Art von Alpha oder eine Art von Beta. Und eine Beta ist auch eine Art von Alpha. Aber ein Alpha ist kein Typ von Gamma, noch ist ein Beta ein Typ von Gamma.

Ein Alpha-Objekt oder ein Beta-Objekt teilt jedoch nicht alle Methoden eines Gamma-Objekts, daher können Sie es einfach nicht so machen.

Wenn Sie versuchen, über eine Gamma-Schnittstelle auf ein Alpha- oder Beta-Objekt zuzugreifen, haben diese Objekte diese Schnittstelle nicht.