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?
Meine Antwort ist richtig?
Ja, meistens und sicherlich in dem Kontext, den Sie beschreiben. Dies ist keine Mehrfachvererbung:
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):
(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:
super
sein? (Antwort von Java 8: ClassA
)IncompatibleClassChangeError
, in der die in Konflikt stehenden Standardmethoden aufgelistet sind.)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
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.
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?
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
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.
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 :)
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.
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
Die Antwort, die Sie gegeben haben, ist richtig. Der Interviewer hat sich geirrt:
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.