Vererbung
Erwägen Sie ein Auto und einen Bus. Sie sind zwei verschiedene Fahrzeuge. Dennoch haben sie einige gemeinsame Eigenschaften wie Lenkung, Bremsen, Getriebe, Motor usw.
Mit dem Konzept der Vererbung kann dies wie folgt dargestellt werden ...
public class Vehicle {
private Driver driver;
private Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) languages, square brackets are used to denote arrays(Collections).
//You can define as many properties as you want here ...
}
Jetzt ein Fahrrad ...
public class Bicycle extends Vehicle {
//You define properties which are unique to bicycles here ...
private Pedal pedal;
}
Und ein Auto ...
public class Car extends Vehicle {
private Engine engine;
private Door[] doors;
}
Das ist alles über Vererbung . Wir verwenden sie, um Objekte in einfachere Grundformen und deren Kinder zu klassifizieren, wie wir oben gesehen haben.
Abstrakte Klassen
Abstrakte Klassen sind unvollständig Objekte. Um dies besser zu verstehen, lassen Sie uns noch einmal die Analogie zum Fahrzeug betrachten.
Ein Fahrzeug kann gefahren werden. Oder? Aber verschiedene Fahrzeuge werden auf verschiedene Weise gefahren ... Zum Beispiel kann man ein Auto nicht so fahren, wie man ein Fahrrad fährt.
Wie kann man nun die Antriebsfunktion eines Fahrzeugs darstellen? Es ist schwieriger zu prüfen, um welche Art von Fahrzeug es sich handelt, und es mit seiner eigenen Funktion zu fahren; Sie müssten die Klasse Driver immer wieder ändern, wenn Sie einen neuen Fahrzeugtyp hinzufügen.
Hier kommt die Rolle der abstrakten Klassen und Methoden ins Spiel. Sie können die Drive-Methode als abstrakt definieren, um anzugeben, dass alle vererbenden Kinder diese Funktion implementieren müssen.
Wenn Sie also die Fahrzeugklasse ändern ...
//......Code of Vehicle Class
abstract public void drive();
//.....Code continues
Das Fahrrad und das Auto müssen auch angeben, wie es gefahren werden soll. Andernfalls lässt sich der Code nicht kompilieren und es wird ein Fehler ausgegeben.
Kurz gesagt: Eine abstrakte Klasse ist eine teilweise unvollständige Klasse mit einigen unvollständigen Funktionen, die die vererbenden Kinder selbst angeben müssen.
Schnittstellen Die Schnittstellen sind völlig unvollständig. Sie haben keine Eigenschaften. Sie zeigen lediglich an, dass die vererbenden Kinder in der Lage sind, etwas zu tun ...
Angenommen, Sie haben verschiedene Arten von Mobiltelefonen dabei. Jedes von ihnen hat unterschiedliche Möglichkeiten, verschiedene Funktionen auszuführen, z. B. eine Person anzurufen. Der Hersteller des Telefons legt fest, wie das geht. Hier können die Mobiltelefone eine Nummer wählen - das heißt, sie sind wählbar. Lassen Sie uns dies als Schnittstelle darstellen.
public interface Dialable {
public void dial(Number n);
}
Hier definiert der Hersteller des Dialable, wie eine Nummer zu wählen ist. Sie müssen ihm nur eine Nummer zum Wählen geben.
// Makers define how exactly dialable work inside.
Dialable PHONE1 = new Dialable() {
public void dial(Number n) {
//Do the phone1's own way to dial a number
}
}
Dialable PHONE2 = new Dialable() {
public void dial(Number n) {
//Do the phone2's own way to dial a number
}
}
//Suppose there is a function written by someone else, which expects a Dialable
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE1;
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
Durch die Verwendung von Schnittstellen anstelle von abstrakten Klassen muss sich der Autor der Funktion, die ein Dialable verwendet, nicht um dessen Eigenschaften kümmern. Beispiel: Hat es einen Touchscreen oder eine Wähltastatur, ist es ein Festnetztelefon oder ein Mobiltelefon. Sie müssen nur wissen, ob es wählbar ist; ob es die Schnittstelle Dialable erbt (oder implementiert).
Und was noch wichtiger ist wenn Sie eines Tages das Wählbare durch ein anderes ersetzen
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE2; // <-- changed from PHONE1 to PHONE2
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
Sie können sicher sein, dass der Code immer noch einwandfrei funktioniert, da die Funktion, die die Wählscheibe verwendet, nicht von anderen Details abhängt (und auch nicht abhängen kann) als denen, die in der Wählscheibenschnittstelle angegeben sind. Beide implementieren eine Wählbarkeitsschnittstelle, und das ist das Einzige, was die Funktion interessiert.
Schnittstellen werden üblicherweise von Entwicklern verwendet, um die Interoperabilität (austauschbare Verwendung) zwischen Objekten zu gewährleisten, sofern sie eine gemeinsame Funktion haben (so wie Sie zu einem Festnetz- oder Mobiltelefon wechseln können, sofern Sie nur eine Nummer wählen müssen). Kurz gesagt, Schnittstellen sind eine viel einfachere Version von abstrakten Klassen, ohne jegliche Eigenschaften.
Beachten Sie auch, dass Sie beliebig viele Schnittstellen implementieren (erben) können, aber nur eine einzige übergeordnete Klasse erweitern (erben) können.
Mehr Infos Abstrakte Klassen vs. Interfaces
461 Stimmen
Obwohl ich es für wichtig halte, den Unterschied zwischen den beiden zu kennen, ist dies meiner Meinung nach keine gute Frage für ein Vorstellungsgespräch. Es sei denn, die Aufgabe bestand darin, ein Buch über OO-Themen zu schreiben. Es ist besser, wenn Sie nicht für diese Fledermäuse arbeiten.
117 Stimmen
@Alan: Ich mag das als Interviewfrage, aber ich würde niemanden auf diese Weise damit jagen - ich würde es wahrscheinlich eher so formulieren: "Wo würden Sie eine Schnittstelle einer abstrakten Basisklasse vorziehen, wenn Sie eine Hierarchie definieren?
12 Stimmen
Vielleicht wollten sie eine Antwort, die sich mehr auf das Design konzentriert... obwohl ich sie wie Sie als technische Frage behandelt hätte.
18 Stimmen
Hier gibt es schöne tabellarische Unterschiede: mindprod.com/jgloss/interfacevsabstract.html
4 Stimmen
Vielleicht haben sie nach einer Antwort von wann oder warum Sie das eine dem anderen vorziehen würden . Das ist es, was wirklich zeigen würde, ob Sie es bekommen - anstatt sie nur definieren zu können.
1 Stimmen
" wenn Sie eine öffentliche Variable innerhalb der Schnittstelle haben, wie würde sich das von einer abstrakten Klasse unterscheiden? " Für mich klingt das so, als wäre der Gesprächspartner zumindest verwirrt über das Thema. Du solltest dir keine Gedanken darüber machen, was sie hören wollten, sondern sie sollten es.
0 Stimmen
stackoverflow.com/questions/1913098/
0 Stimmen
stackoverflow.com/questions/4756065/
34 Stimmen
@Kave:
I insisted you can't have a public variable inside an interface.
Ich denke, die Schnittstelle kann öffentliche Variablen haben. In der Tat sind Variablen in Schnittstellen automatisch öffentlich und endgültig.0 Stimmen
Wenn Sie darüber nachdenken, wie Sie diese Tests durchführen würden, könnten Sie vielleicht etwas mehr Klarheit über Ihre Überlegungen gewinnen. stackoverflow.com/a/2947823/23963
3 Stimmen
Diese Frage stelle ich regelmäßig in telefonischen Vorstellungsgesprächen. So werden Leute aussortiert, die die Grundlagen der Programmierung nicht kennen. Nach der Antwort auf die Frage würde ich weitermachen. Bei einem Telefongespräch ist es mein Ziel, die Leute auszusortieren, die meine Zeit in einem persönlichen Gespräch verschwenden würden, und diese Frage ist sehr effektiv.
8 Stimmen
@a Learner: Wenn wir von C# sprechen, führt eine Schnittstelle mit einem Feld zu einem Kompilierfehler,
Interfaces cannot contain fields
. C#-Schnittstellen können Eigenschaften, aber keine Felder (d. h. Variablen) enthalten.1 Stimmen
Dies ist eine sehr häufig gestellte Frage bei Vorstellungsgesprächen. Das ist überraschend, da abstrakte Klassen im Vergleich zu anderen Dingen, nach denen man fragen könnte, selten in Lösungen verwendet werden.
0 Stimmen
Diese Frage könnte helfen, das Konzept der Schnittstellen zu verstehen. stackoverflow.com/q/8531292/1055241
0 Stimmen
Mögliche Duplikate von Wann sollte man eine Schnittstelle anstelle einer abstrakten Klasse verwenden und umgekehrt?
2 Stimmen
1. Abstrakte Klassen sind Teil des Vererbungsbaums. Das ist der Unterschied zu Interfaces. 2. Alle Variablen sind standardmäßig "Public final" in einer Schnittstelle. Abstrakte Klassen können alles haben.
0 Stimmen
IMO sind die Interviewfragen wirklich sehr gut. Um diese Fragen beantworten zu können, müssen Sie wirklich alle Unterschiede und die Verwendung von abstrakten Klassen und Schnittstellen, ihre Vorteile und Grenzen verstehen.
0 Stimmen
Ist damit Ihre Frage beantwortet? Was ist der Unterschied zwischen einer Schnittstelle und einer abstrakten Klasse?
0 Stimmen
Ich habe darauf bestanden, dass man keine öffentliche Variable innerhalb einer Schnittstelle haben kann. dafür ist eine Schnittstelle da, für den öffentlichen Gebrauch