webentwicklung-frage-antwort-db.com.de

Java: Wenn A B und B Object erweitert, dann ist diese Mehrfachvererbung

Ich hatte gerade ein Interview und mir wurde eine Frage gestellt. 

Interviewer - Unterstützt Java die Mehrfachvererbung?

Me - Nein

Interviewer - Jede Klasse in Java erweitert die Klasse Object (außer Klasse Object) und wenn wir eine Klasse extern erweitern, wie

Class A extends B{
  // some code here
}

dann können Sie sagen, dass Klasse A Klasse B und Klasse Object erweitert, was bedeutet, dass es sich um Mehrfachvererbung handelt. Wie können Sie also sagen, dass Java keine Mehrfachvererbung unterstützt?

Me - Tatsächlich erweitert Klasse B die Klasse Object. Wenn Sie Klasse B in Klasse A erweitern, dann erweitert Klasse A die Klasse Object indirekt. Dies ist mehrstufige Vererbung, keine Mehrfachvererbung.

Aber meine Antwort befriedigte ihn nicht.

Ist meine Antwort richtig? Oder wo liege ich falsch? Was passiert eigentlich intern?

29
Ankit Sharma

Meine Antwort ist richtig?

Ja, meistens und sicherlich in dem Kontext, den Sie beschreiben. Dies ist keine Mehrfachvererbung:

Object ^- ClassA ^- ClassB

Es ist das, was Sie gesagt haben: Einzelvererbung mit mehreren Ebenen.

Dies ist mehrfache Vererbung: Das Erben von zwei oder mehr Basen, die keine "Beziehung" zueinander haben; das wäre von nicht zusammenhängenden Zeilen erben oder von Zeilen, die zuvor auseinandergegangen waren (in Java, da Object immer eine Basis ist, wäre dies die letztere):

Object ^- ClassA, Object ^- ClassB, ClassA ^- ClassC, ClassB ^- ClassC

(Bildnachweis: http://yuml.me im Scruffy-Modus)

Intern Was passiert eigentlich?

Genau das, was Sie gesagt haben: Es gibt mehrere Ebenen. Wenn der Compiler ein Mitglied in einer Instanz auflöst:

obj.member

Es sieht nach, ob der Typ von obj (der in diesem Fall eine Klasse ist, sagen wir ClassB) member hat, entweder weil er sie direkt liefert oder durch Vererbung. Zur Laufzeit verwendet die JVM die member, die das Objekt tatsächlich hat.


Der Grund, warum ich oben "meistens" gesagt habe, ist, dass Java Schnittstellen hat und seit Java 8 "Standardmethoden" für Schnittstellen. Dies macht die Sache etwas komplizierter, aber Ihre Antwort zu den Stufen ist in dem Kontext, in dem Sie den Interviewer über Object, ClassA und ClassB beschrieben haben, richtig.

Schnittstellen haben es in Java immer möglich gemacht, dass etwas eine "ist eine" Beziehung mit zwei verschiedenen Typen hat: Ein Klassentyp, von dem er erbt, und einer von mehreren Schnittstellentypen, die er implementiert . Schnittstellen ohne Standardmethoden sind praktisch keine Mehrfachvererbung (die Klasse muss die Implementierung bereitstellen), aber sie haben es möglich gemacht, dass eine Klasse mehrere "is-a" -Beziehungen aus nicht zusammengehörigen Typbäumen hat. (Ich bin kein Wissenschaftler, es ist möglich, dass ein Wissenschaftler argumentiert, dass er Mehrfachvererbung auf akademische Weise anbietet.)

Mit Java 8 können Schnittstellen Standardimplementierungen der von ihnen definierten Methoden bereitstellen, wodurch die Zeilen sogar auf praktischer Ebene verwischt werden. Schauen wir uns das etwas genauer an:

Sagen wir, wir haben ClassA:

class ClassA {
    void doSomething() {
        // Code here
    }
}

und Interface1:

interface Interface1 {
    default void doSomethingElse() { // Requires Java 8
        // Code here
    }
}

und schließlich ClassB:

class ClassB extends ClassA implements Interface1 {
}

ClassB erbt die Implementierung von doSomething von ClassA. Aber es also erhält die "Standard" -Version von doSomethingElse von Interface1. Wir haben es nicht in ClassB implementiert, aber ClassB ist nicht abstrakt: Es hat wirklich doSomethingElse. Es bekommt es von der Schnittstelle . Ich habe das Wort "bekommt" anstelle von "erbt" dort verwendet, aber dies sieht aus wie eine lot , die die Standardmethode erbt.

Dies ist im Wesentlichen das "leichte" Mehrfachvererbung (wie in "leichtes Bier"). Es ist ein Endlauf um die dornigeren Probleme mit der echten Mehrfachvererbung, wie zum Beispiel:

  • Was sollte der Typ von super sein? (Antwort von Java 8: ClassA)
  • In welcher Reihenfolge führen Sie Konstruktoren ein? (Antwort von Java 8: Verkettung von Konstruktoren mit einer einzelnen Linie, Schnittstellen haben keine Konstruktoren.)
  • Führen Sie Konstruktoren aus, die Sie mehr als einmal erben, mehr als einmal? (Antwort von Java 8: Konstruktoren können nicht mehr als einmal geerbt werden, Schnittstellen haben sie nicht.)
  • Was passiert, wenn Sie mehrere Methoden mit derselben Signatur erben? (Antwort von Java 8: Wenn einer von ihnen aus der Basisklasse stammt, wird diese verwendet; die Implementierung einer Basisklasse kann die Standardmethode mehrerer Schnittstellen überschreiben. Wenn Sie mehrere Standardmethoden mit derselben Signatur aus verschiedenen Schnittstellen bei der Kompilierung Es handelt sich hierbei um einen Fehler bei der Kompilierung. Wenn eine Schnittstelle geändert wurde, ohne dass die Klasse neu kompiliert wurde und die Situation zur Laufzeit auftritt, handelt es sich um eine Laufzeitvariable IncompatibleClassChangeError, in der die in Konflikt stehenden Standardmethoden aufgelistet sind.)
39
T.J. Crowder

du hast Recht 

Die Object-Klasse ist zunächst die Super/Base/Parent-Klasse jeder Klasse, einschließlich benutzerdefinierter Klassen.

Selbst wenn wir es nicht explizit erwähnen, erweitert die benutzerdefinierte Klasse die Objektklasse standardmäßig.

es ist wie

class A 
class B extends A

 but compiler read it as 
class A extends Object
class B extends A

bewiesen

weitere Informationen finden Sie in dieser Java-Dokumentation zur Vererbung

7
MSR

Meine Antwort ist richtig?

Sie sind absolut korrekt, wenn Sie sagen, dass es sich um mehrstufige Vererbung handelt und nicht um mehrfache Vererbung.

Nur das root der Hierarchie ist Object, alle Klassen nicht erweitern Object einzeln.

Ein Zähler zum Interviewer:

Wenn alle Klassen Object erweitern, wird wie oft der Konstruktor von Object für A a = new A(); aufgerufen.

Die Antwort ist nur einmal und das wird für die Wurzel der Hierarchie sein.

5
Narendra Pathai

Ja, Sie haben recht ... wie viele andere darauf hingewiesen haben. Ich wollte nur sagen, dass es bei Interviews nicht nur um technisches Wissen geht, sondern auch darum, an den Waffen zu bleiben. Einige Interviewer werden Ihre Antwort in Frage stellen, nicht weil sie wissen möchten, ob Sie sich Ihrer Überzeugung sicher sind, sondern auch um zu testen, wie gut Sie andere unterrichten können und wie gut Sie mit einer autoritativen Figur umgehen.

Für den ersten Punkt, wenn Sie andere nicht unterrichten können, können Sie kein Mentor sein. Heutzutage ist es wichtig, jemanden einzustellen, der Nachwuchsentwickler coachen kann ... weil es wirtschaftlich sinnvoll ist.

Für den zweiten Punkt, weil sie nicht möchten, dass Sie technische Aspekte ändern, nur weil Ihr Chef Sie darum gebeten hat. Wenn Ihr Chef Sie bittet, alle Indizes aus der Datenbank zu entfernen, da diese zu viel Speicherplatz beanspruchen, würden Sie das tun? Würden Sie versuchen, Ihren Chef sonst zu überzeugen? Wie?

3
Does Java support multiple inheritance?

Ja für Schnittstellen, aber nicht für Klassen. 

Die Klasse und die Schnittstelle können viele Schnittstellen implementieren, erweitern jedoch nur eine Klasse

2
mohamed sulibi

Deine Antwort ist richtig!

class Object //for illustration purpose
{
}

class B
{
}

class A extends B
{
}

Wenn Sie ein Objekt der Klasse A erstellen, erfolgt die Verkettung von Konstruktor . D. H. Der Konstruktor der Klasse A ruft implizit super() auf und daher wird der Konstruktor der Klasse B aufgerufen, der dann seine Oberklasse implizit aufruft, die die Object-Klasse ist. 

In Java erweitert eine Klasse nur eine einzige Klasse, da der Konstruktor dieser Klasse nur einen Superklassenkonstruktor aufruft. Dies gilt nicht für Interfaces, da diese keine Konstruktoren haben.

Wenn ein Objekt der Klasse A erstellt wird und vorausgesetzt, dass Sie die Konstruktoren der Klassen A und B definiert haben, wird zuerst der Konstruktor der Klasse B und dann der Konstruktor der Klasse A ausgeführt.

2
Santosh Pavate

Was für eine dumme Frage.

Natürlich unterstützt Java keine Mehrfachvererbung und Schnittstellen werden nicht vererbt.

Vererbung geschieht nur über "erweitert", nicht über "Anbaugeräte". Wenn Sie definieren, dass eine Klasse mehrere Schnittstellen implementiert, sagen Sie nicht, dass es sich um eine Erweiterung dieser Schnittstellen handelt, dass sie jedoch dasselbe Verhalten haben und dass Verhalten (zumindest in Java) keine Vererbung definiert.

Damit Java die Mehrfachvererbung unterstützen kann, muss es etwas unterstützen

public class MI extends Object, MyOtherClass

Welches Java nicht kann.

Nun, vielleicht würde ich nicht den Job bekommen, die Frage des Interviewers stumm zu stellen :)

1
Cindy Langdon

Ihre Antwort ist richtig, da Java die Mehrfachvererbung von Klassen nicht unterstützt. Java unterstützt die Mehrfachvererbung von Schnittstellen und es gibt keine andere Vererbung. Sie können aber auch Klassen zusammenstellen, aber das ist eine andere Geschichte.

1
FruitDealer

Ihre Antwort ist vollkommen in Ordnung. In Java können Sie Interms für die Unterstützung der mehrstufigen Vererbung aus der Object-Klasse erklären

Ihre Antwort ist absolut richtig.

Diese Art von Fragen wurde nur zur Prüfung gestellt, ob ein Kandidat konzeptionell stark ist oder nicht.

Nun, die einfachste und präzise Antwort auf diese Frage ist hier:

" Klassen können von Klassen abgeleitet werden, die von Klassen abgeleitet sind, die von Klassen usw. abgeleitet sind und letztendlich von der obersten Klasse Object abgeleitet werden. Eine solche Klasse soll von allen Klassen der Vererbung abstammen Kette reckt sich zurück zu Object. "

Bitte beziehen Sie sich auf diesen Link https://docs.Oracle.com/javase/tutorial/Java/IandI/subclasses.html

0
rags147

Die Antwort, die Sie gegeben haben, ist richtig. Der Interviewer hat sich geirrt:

Interner Prozess

if suppose Class A Doesn't extends any other class 
then ---> Class B extends Java.lang.Object 
then ---> Class A extends B
then class A also inherited the property of Java 'Object' class...

java unterstützt also keine Mehrfachvererbung.

Wenn Sie diesen Vorgang überprüfen möchten, generieren Sie einfach 'javadoc' für Ihre Klasse A und überprüfen Sie die Ergebnisse.

0