Dies ist eine Interviewfrage.
Erben Unterklassen private Felder?
Ich antwortete mit "Nein", da wir nicht auf "normale OOP-Weise" darauf zugreifen können. Der Interviewer glaubt jedoch, dass sie vererbt werden, weil wir indirekt oder mithilfe von Reflexion auf solche Felder zugreifen können und sie noch im Objekt vorhanden sind.
Nachdem ich zurückgekommen war, fand ich im Javadoc folgendes Zitat :
Private Mitglieder in einer Superklasse
Eine Unterklasse erbt nicht die privaten Mitglieder ihrer übergeordneten Klasse.
Kennen Sie Argumente für die Meinung des Interviewers?
java
oop
inheritance
private
Stan Kurilin
quelle
quelle
Antworten:
Der größte Teil der Verwirrung in den Fragen / Antworten hier betrifft die Definition der Vererbung.
Offensichtlich als @DigitalRoss erläutert ein OBJECT einer Unterklasse muss ihre übergeordneten privaten Felder enthalten. Kein Zugang zu einem privaten Mitglied bedeutet nicht, dass es nicht da ist.
Jedoch. Dies unterscheidet sich vom Begriff der Vererbung für eine Klasse. Wie in der Java-Welt, in der es um Semantik geht, ist der Arbiter die Java-Sprachspezifikation (derzeit 3. Ausgabe).
Wie im JLS angegeben ( https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2 ):
Diese Adressen die genaue Frage des Interviewers gestellt: „do Unterklassen private Felder erben“. (Hervorhebung von mir hinzugefügt)
Die Antwort lautet Nein. Sie tun es nicht. OBJEKTE von Unterklassen enthalten private Felder ihrer Oberklassen. Die Unterklasse selbst hat KEINE ANMERKUNG von privaten Feldern ihrer Oberklasse.
Ist es eine semantische Semantik? Ja. Ist es eine nützliche Interviewfrage? Wahrscheinlich nicht. Das JLS legt jedoch die Definition für die Java-Welt fest und tut dies (in diesem Fall) eindeutig.
EDITED (entfernte ein paralleles Zitat von Bjarne Stroustrup, das aufgrund der Unterschiede zwischen Java und C ++ wahrscheinlich nur zur Verwirrung beiträgt. Ich werde meine Antwort auf dem JLS ruhen lassen :)
quelle
Ja
Es ist wichtig zu wissen, dass es zwar zwei Klassen gibt, aber nur ein Objekt.
Also, ja, natürlich hat es die privaten Felder geerbt. Sie sind vermutlich für eine ordnungsgemäße Objektfunktionalität wesentlich, und während ein Objekt der übergeordneten Klasse kein Objekt der abgeleiteten Klasse ist, ist eine Instanz der abgeleiteten Klasse meistens definitiv eine Instanz der übergeordneten Klasse. Es könnte nicht sehr gut sein, dass ohne alle Felder.
Nein, Sie können nicht direkt darauf zugreifen. Ja, sie werden geerbt. Sie müssen sein.
Das ist eine gute Frage!
Aktualisieren:
Ähm, "Nein"
Nun, ich denke wir haben alle etwas gelernt. Da das JLS den genauen Wortlaut "nicht vererbt" erstellt hat, ist es richtig, mit "Nein" zu antworten . Da die Unterklasse nicht auf die privaten Felder zugreifen oder diese ändern kann, werden sie mit anderen Worten nicht vererbt. Aber es wirklich ist nur ein Objekt, es ist wirklich nicht enthält die privaten Felder, und so , wenn jemand die JLS und Tutorial Wortlaut nimmt die falsche Art und Weise, wird es ziemlich schwierig sein , zu verstehen , OOP, Java - Objekte, und das, was wirklich geschieht.
Update zu Update:
Die Kontroverse beinhaltet hier eine grundlegende Zweideutigkeit: Was genau wird diskutiert? Das Objekt? Oder reden wir in gewissem Sinne über die Klasse selbst? Bei der Beschreibung der Klasse im Gegensatz zum Objekt ist viel Spielraum zulässig. Die Unterklasse erbt also keine privaten Felder, aber ein Objekt, das eine Instanz der Unterklasse ist, enthält sicherlich die privaten Felder.
quelle
car
, er bewahrte sie in einemprivate
Schließfach auf, von dem das Kind nicht den Schlüssel hat. Sie erben zwar das,car
aber es ist für Sie nutzlos. Praktisch profitieren Sie also nicht von der Vererbung.Nein. Private Felder werden nicht vererbt. Deshalb wurde Protected erfunden. Es ist beabsichtigt. Ich denke, dies hat die Existenz eines geschützten Modifikators gerechtfertigt.
Kommen wir nun zu den Kontexten. Was meinst du mit geerbt - wenn es in dem Objekt vorhanden ist, das aus einer abgeleiteten Klasse erstellt wurde? Ja, so ist es.
Wenn Sie meinen, kann es nützlich sein, eine Klasse abzuleiten. Nun, nein.
Wenn Sie nun zur funktionalen Programmierung kommen, wird das private Feld der Superklasse für die Unterklasse nicht auf sinnvolle Weise vererbt . Für die Unterklasse ist ein privates Feld der Superklasse dasselbe wie ein privates Feld einer anderen Klasse.
Funktionell wird es nicht vererbt. Aber im Idealfall ist es.
OK, habe gerade in das Java-Tutorial geschaut, das sie zitieren:
Siehe: http://download.oracle.com/javase/tutorial/java/IandI/subclasses.html
Ich stimme zu, dass das Feld da ist. Die Unterklasse erhält jedoch keine Berechtigung für dieses private Feld. Für eine Unterklasse ist das private Feld dasselbe wie jedes private Feld einer anderen Klasse.
Ich glaube, es ist nur eine Frage der Sichtweise. Sie können das Argument auf beiden Seiten formen. Es ist besser, in beide Richtungen zu rechtfertigen.
quelle
I believe it's purely matter of point-of-view.
undjustified the existence of protected modifier.
Dies hängt von Ihrer Definition von "erben" ab. Hat die Unterklasse noch die Felder im Speicher? Bestimmt. Kann es direkt auf sie zugreifen? Nein, es sind nur Feinheiten der Definition; Es geht darum zu verstehen, was wirklich passiert.
quelle
Ich werde das Konzept mit Code demonstrieren. Unterklassen erben WIRKLICH die privaten Variablen der Superklasse . Das einzige Problem besteht darin, dass sie den untergeordneten Objekten nur zugänglich sind , wenn Sie öffentliche Getter und Setter für die privaten Variablen in der Superklasse bereitstellen.
Betrachten Sie zwei Klassen im Paket Dump. Kind erweitert Eltern.
Wenn ich mich richtig erinnere, besteht ein untergeordnetes Objekt im Speicher aus zwei Regionen. Einer ist nur der übergeordnete Teil und der andere ist nur der untergeordnete Teil. Ein Kind kann nur über eine öffentliche Methode im Elternteil auf den privaten Abschnitt im Code seines Elternteils zugreifen.
Denk darüber so. Borats Vater Boltok hat einen Safe mit 100.000 Dollar. Er möchte seine "private" Variable nicht sicher teilen. Er stellt also keinen Schlüssel für den Safe zur Verfügung. Borat erbt den Safe. Aber was nützt es, wenn er es nicht einmal öffnen kann? Wenn nur sein Vater den Schlüssel zur Verfügung gestellt hätte.
Eltern -
Kind -
quelle
Nein, sie erben es nicht.
Die Tatsache, dass eine andere Klasse es indirekt verwendet, sagt nichts über die Vererbung aus, sondern über die Kapselung.
Zum Beispiel:
Sie können den Wert von
count
innen auchUseIt
durch Reflexion erhalten. Es bedeutet nicht, dass Sie es erben.AKTUALISIEREN
Obwohl der Wert vorhanden ist, wird er nicht von der Unterklasse geerbt.
Zum Beispiel eine Unterklasse definiert als:
Dies ist genau die gleiche Situation wie im ersten Beispiel. Das Attribut
count
ist ausgeblendet und wird von der Unterklasse überhaupt nicht geerbt. Wie DigitalRoss hervorhebt, ist der Wert zwar vorhanden, jedoch nicht durch Vererbung.Sagen Sie es so. Wenn dein Vater reich ist und dir eine Kreditkarte gibt, kannst du immer noch etwas mit seinem Geld kaufen, aber das heißt nicht, dass du das ganze Geld geerbt hast , oder?
Anderes Update
Es ist jedoch sehr interessant zu wissen, warum das Attribut vorhanden ist.
Ich habe ehrlich gesagt nicht den genauen Begriff, um es zu beschreiben, aber es ist die JVM und die Art und Weise, wie sie funktioniert, die auch die "nicht geerbte" übergeordnete Definition lädt.
Wir könnten das übergeordnete Element tatsächlich ändern und die Unterklasse wird weiterhin funktionieren.
Zum Beispiel :
Ich denke, der genaue Begriff könnte hier gefunden werden: Die JavaTM Virtual Machine Specification
quelle
encapsulation
vsinherit
, ich denke, diese Antwort verdient mehr Stimmen.Nun, meine Antwort auf die Frage des Interviewers lautet: Private Mitglieder werden nicht in Unterklassen vererbt, aber sie sind nur über öffentliche Getter- oder Setter-Methoden oder solche geeigneten Methoden der ursprünglichen Klasse für Unterklassen- oder Unterklassenobjekte zugänglich. Die übliche Praxis besteht darin, die Mitglieder privat zu halten und mit öffentlichen Getter- und Setter-Methoden auf sie zuzugreifen. Was bringt es also, nur Getter- und Setter-Methoden zu erben, wenn das private Mitglied, mit dem sie sich befassen, für das Objekt nicht verfügbar ist? Hier bedeutet "geerbt" einfach, dass es direkt in der Unterklasse verfügbar ist, um mit neu eingeführten Methoden in der Unterklasse herumzuspielen.
Speichern Sie die folgende Datei als ParentClass.java und probieren Sie es selbst aus ->
Wenn wir versuchen, die private Variable x von ParentClass in der SubClass-Methode zu verwenden, ist sie für Änderungen nicht direkt zugänglich (bedeutet nicht vererbt). X kann jedoch in SubClass über die setX () -Methode der ursprünglichen Klasse geändert werden, wie dies in der setXofParent () -Methode erfolgt, ODER es kann mithilfe des ChildClass-Objekts mithilfe der setX () -Methode oder der setXofParent () -Methode geändert werden, die letztendlich setX () aufruft. Hier sind setX () und getX () also eine Art Tor zum privaten Mitglied x einer ParentClass.
Ein weiteres einfaches Beispiel ist, dass die Clock-Superklasse Stunden und Minuten als private Mitglieder und geeignete Getter- und Setter-Methoden als öffentliche Mitglieder hat. Dann kommt DigitalClock als Unterklasse der Uhr. Wenn das Objekt der DigitalClock keine Stunden- und Minutenmitglieder enthält, sind die Dinge durcheinander.
quelle
Ok, dies ist ein sehr interessantes Problem, das ich viel recherchiert habe und zu dem Schluss gekommen bin, dass private Mitglieder einer Oberklasse in den Objekten der Unterklasse tatsächlich verfügbar (aber nicht zugänglich) sind. Um dies zu beweisen, ist hier ein Beispielcode mit einer übergeordneten Klasse und einer untergeordneten Klasse. Ich schreibe ein untergeordnetes Klassenobjekt in eine txt-Datei und lese ein privates Mitglied mit dem Namen 'bhavesh' in der Datei, um zu beweisen, dass es tatsächlich im untergeordneten Element verfügbar ist Klasse, aber aufgrund des Zugriffsmodifikators nicht zugänglich.
Öffnen Sie MyData1.txt und suchen Sie nach dem privaten Mitglied 'bhavesh'. Bitte lassen Sie mich wissen, was Sie denken.
quelle
Es scheint, dass eine Unterklasse die privaten Felder insofern erbt, als genau diese Felder im Innenleben der Unterklasse verwendet werden (philosophisch gesehen). Eine Unterklasse ruft in ihrem Konstruktor den Konstruktor der Oberklasse auf. Die privaten Felder der Oberklasse werden offensichtlich von der Unterklasse geerbt, die den Konstruktor der Oberklasse aufruft, wenn der Konstruktor der Oberklasse diese Felder in seinem Konstruktor initialisiert hat. Das ist nur ein Beispiel. Aber natürlich kann die Unterklasse ohne Zugriffsmethoden nicht auf die privaten Felder der Oberklasse zugreifen (es ist, als könnte man die Rückseite eines iPhones nicht öffnen, um den Akku herauszunehmen und das Telefon zurückzusetzen ... aber der Akku ist noch vorhanden).
PS Eine der vielen Definitionen der Vererbung, auf die ich gestoßen bin: "Vererbung - eine Programmiertechnik, mit der eine abgeleitete Klasse die Funktionalität einer Basisklasse erweitern kann, indem sie ihren gesamten STAAT (Schwerpunkt liegt bei mir) und ihr Verhalten erbt."
Die privaten Felder sind der geerbte Status der Oberklasse, auch wenn sie für die Unterklasse nicht zugänglich sind.
quelle
Ich würde antworten , dass private Felder in Java werden vererbt. Gestatten Sie mir zu demonstrieren:
Wenn Sie in einem Programm ausgeführt werden
Bar bar = new Bar();
, wird im Ausgabefeld immer die Nummer "2" angezeigt. Da die Ganzzahl "x" mit den Methodenupdate()
und gekapselt istgetX()
, kann nachgewiesen werden, dass die Ganzzahl vererbt wird.Die Verwirrung ist, dass, weil Sie nicht direkt auf die Ganzzahl "x" zugreifen können, die Leute argumentieren, dass sie nicht vererbt wird. Jedes nicht statische Element in einer Klasse, sei es ein Feld oder eine Methode, wird jedoch vererbt.
quelle
Das Auffüllen von Bits / Ausrichtung und die Aufnahme der Objektklasse in die VTABLE werden nicht berücksichtigt. Das Objekt der Unterklasse hat also einen Platz für die privaten Mitglieder der Superklasse. Es kann jedoch nicht über die Objekte der Unterklasse darauf zugegriffen werden ...
quelle
Nein , private Felder werden nicht vererbt. Der einzige Grund ist, dass die Unterklasse nicht direkt auf sie zugreifen kann .
quelle
Ich glaube, die Antwort hängt völlig von der Frage ab, die gestellt wurde. Ich meine, wenn die Frage ist
Dann lautet die Antwort Nein . Wenn wir die Details des Zugriffsspezifizierers durchgehen , wird erwähnt, dass private Mitglieder nur innerhalb der Klasse selbst zugänglich sind.
Aber wenn die Frage ist
Das heißt, es spielt keine Rolle, was Sie tun, um auf das private Mitglied zuzugreifen. In diesem Fall können wir eine öffentliche Methode in der Superklasse erstellen und Sie können auf das private Mitglied zugreifen. In diesem Fall erstellen Sie also eine Schnittstelle / Brücke, um auf das private Mitglied zuzugreifen.
Andere OOP-Sprachen wie C ++ haben das
friend function
Konzept, mit dem wir auf das private Mitglied einer anderen Klasse zugreifen können.quelle
Wir können einfach sagen, dass, wenn eine Oberklasse geerbt wird, die privaten Mitglieder der Oberklasse tatsächlich private Mitglieder der Unterklasse werden und nicht weiter vererbt werden können oder für die Objekte der Unterklasse nicht zugänglich sind.
quelle
Auf ein privates Klassenmitglied oder einen Konstruktor kann nur innerhalb des Hauptteils der Klasse der obersten Ebene ( §7.6 ) zugegriffen werden , der die Deklaration des Mitglieds oder Konstruktors enthält. Es wird nicht von Unterklassen geerbt. https://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6
quelle
Eine Unterklasse erbt nicht die privaten Mitglieder ihrer übergeordneten Klasse. Wenn die Oberklasse jedoch über öffentliche oder geschützte Methoden für den Zugriff auf ihre privaten Felder verfügt, können diese auch von der Unterklasse verwendet werden.
quelle
Private Mitglieder (Staat und Verhalten) werden vererbt. Sie können das Verhalten und die Größe des Objekts beeinflussen, das von der Klasse instanziiert wird. Ganz zu schweigen davon, dass sie für die Unterklassen über alle verfügbaren Mechanismen zur Unterbrechung der Kapselung sehr gut sichtbar sind oder von ihren Implementierern angenommen werden können.
Obwohl die Vererbung eine "defacto" -Definition hat, hat sie definitiv keinen Zusammenhang mit "Sichtbarkeits" -Aspekten, die von den "Nein" -Antworten angenommen werden.
Es besteht also keine Notwendigkeit, diplomatisch zu sein. JLS ist an dieser Stelle einfach falsch.
Jede Annahme, dass sie nicht "vererbt" werden, ist unsicher und gefährlich.
Unter zwei defakto (teilweise) widersprüchlichen Definitionen (die ich nicht wiederholen werde) ist die einzige, die befolgt werden sollte, die sicherere (oder sicherere).
quelle