Erben Unterklassen private Felder?

245

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?

Stan Kurilin
quelle
33
Ich war einmal in einer ähnlichen Situation und mir wurde klar, dass ich nicht einmal für ein Unternehmen arbeiten wollte, in dem der Interviewer weniger über Java weiß als ich. :)
biziclop
48
Ein Interviewer ist manchmal anderer Meinung als Sie, selbst wenn er weiß, dass Sie Recht haben. Ein guter Interviewer wird versuchen, mehr über Sie als Ihr technisches Wissen zu erfahren.
Andy Thomas
4
@DigitalRoss Ist die Java-Sprachspezifikation auch schlecht geschrieben? Siehe RD01 Antwort: stackoverflow.com/questions/4716040/…
OscarRyz
9
@Andy Thomas-Cramer Ich würde auch nicht mit Leuten arbeiten wollen, die absichtlich lügen, um meine Reaktion zu testen.
Biziclop
4
Nun, ich denke, wir sollten zuerst die Bedeutung von "Vererbung" in Java herausfinden. Die Unterklasse hat nicht das private Feld und die Unterklasse hat das private Feld, kann aber nicht darauf zugreifen, ist unterschiedlich. Welche bezieht sich auf die genaue Bedeutung der Vererbung in Java?
MengT

Antworten:

238

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 ):

Mitglieder einer Klasse, die als privat deklariert sind, werden nicht von Unterklassen dieser Klasse geerbt. Nur Mitglieder einer Klasse, die als geschützt oder öffentlich deklariert sind, werden von Unterklassen geerbt, die in einem anderen Paket als dem deklariert sind, in dem die Klasse deklariert ist.

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 :)

robert_x44
quelle
3
@digital warum der Seufzer. Ich verstehe, Sie glauben, Sie haben Recht. Ich bin nicht anderer Meinung als Sie, dass die meisten Programmierer über Objektvererbung unterrichtet werden. Die JLS-Definition gilt jedoch direkt für die ursprüngliche Frage. Es ist Semantik ja, aber das JLS bestimmt die Definition, nicht Sie oder ich.
robert_x44
4
Eine Möglichkeit, all dies in Einklang zu bringen, besteht darin, einfach zu erkennen, dass das Wort "erben" auf zwei sehr unterschiedliche Arten verwendet wird, um die Beziehung zwischen abgeleiteten und übergeordneten Klassen zu beschreiben, zumindest in der Java-Welt. Ja, die JSL ist autorisierend. Ja, es bedeutet, dass Sie "erben" auf diese unglückliche Weise verwenden können. Aber es ist immer noch offensichtlich wahr, dass Unterklassen die privaten Felder ihrer Elternklasse durcheinander bringen (weil wir jetzt kein Wort haben).
DigitalRoss
1
@digital Sie befinden sich im Objekt der Klasse. nicht die Klasse selbst. Simula nannte sie verkettete Objekte. Wenn ein Objekt einer Unterklasse erstellt wurde, bestand es aus verketteten Präfixobjekten. Das Superklassenobjekt war ein Präfixobjekt, das selbst andere Präfixobjekte enthalten konnte. Ich finde es arrogant zu sagen, dass die JLS "eindeutig schlechte Formulierungen" hat. Was für ein Wort verwenden wir, Vererbung natürlich. Es ist nichts Falsches daran, eine etwas mehrdeutige Terminologie zu verwenden. Es passiert ständig. Das heißt aber nicht, dass es keine genaue Definition gibt.
robert_x44
1
@digital Wir können sicherlich zustimmen, dass das Wort auf unterschiedliche Weise verwendet wird. :) Wir können uns wahrscheinlich auch darauf einigen, dass eine Interviewfrage, die von einem mehrdeutigen Begriff abhängt, wahrscheinlich keine gute ist.
robert_x44
2
Hat jemand eine Referenz von Java / Oracle für "Objekte der Unterklasse enthalten die privaten Felder ihrer Oberklassen"? Ich bin damit einverstanden, kann aber keine offiziellen Dokumente finden, die dies belegen.
MengT
78

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.

DigitalRoss
quelle
2
@ Ma99uS. Natürlich werden sie wiederverwendet. Das ist der ganze Punkt der Vererbung. Ohne sie wäre und könnte der abgeleitete Typ keine Instanz des übergeordneten Typs sein. OOP wäre bedeutungslos. Polymorphe Typen würden nicht mehr funktionieren . Das Verständnis, dass es nur ein Objekt gibt und Sie eine Instanz des übergeordneten Typs sind, ist entscheidend für das Verständnis von OOP. Sie müssen dieses Problem überwinden, um es überhaupt zu verstehen.
DigitalRoss
2
Ich bin mir nicht sicher, ob das Beispiel des Vaters sehr gut ist, da ein Feld geerbt werden kann, während die Elternklasse noch lebt und auch dieses Feld hat. Wenn die Vererbung so funktionieren würde, könnte ich das Geld meines Vaters erben, solange er lebt, und er könnte das gleiche Geld auch behalten. Meine Kinder würden jedes sein Geld und mein Geld haben.
Peter Lawrey
2
@ Peter Lawrey nicht streiten oder so, aber hier ist, was ich denke. Der Elternteil hatte eine car, er bewahrte sie in einem privateSchließfach auf, von dem das Kind nicht den Schlüssel hat. Sie erben zwar das, caraber es ist für Sie nutzlos. Praktisch profitieren Sie also nicht von der Vererbung.
Nishant
1
@ DigitalRoss. Ich verstehe was sie meinen. Mhh, wir könnten sagen, der Wert ist da, weil die nicht geerbte übergeordnete Definition ebenfalls geladen ist. :) Ich denke, die JVM-Spezifikation hätte die richtige Antwort auf dieses "NEIN WORT", das wir suchen. java.sun.com/docs/books/jvms
OscarRyz
5
-1, In der Java-Sprachspezifikation wird klargestellt, dass sie nicht vererbt werden. Kein Wenn, kein Aber. Sie sind einfach nicht. Jede andere Definition der Vererbung ist im Kontext von Java falsch.
Biziclop
21

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:

Private Mitglieder in einer Superklasse

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.

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.

 

Nishant
quelle
2
Das ist nicht richtig. Sie können nicht darauf zugreifen, das ist richtig. Aber sie müssen geerbt werden, wie ich erklärt habe.
DigitalRoss
1
ausgezeichnete Antwort !!! +1 für I believe it's purely matter of point-of-view.undjustified the existence of protected modifier.
Ravi
14

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.

user541686
quelle
Richtig. Aber ich denke, in solch einer
Basisfrage
Ich denke, es ist die Java-Definition der Vererbung.
OscarRyz
Oder es hängt von Ihrer Definition von "Feld" ab. Um ein ganzzahliges Feld "foo" zu definieren, müssen Sie ein ganzzahliges Schließfach mieten und ein "foo" -Zeichen darauf setzen. Wenn das Feld als privat deklariert ist, erbt die abgeleitete Klasse ein unbeschriftetes ganzzahliges Speicherfach. Ob die abgeleitete Klasse das "Feld" erbt oder nicht, hängt davon ab, ob man dieses unbeschriftete Speicherfach als "Feld" bezeichnet.
Supercat
10

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 -

package Dump;

public class Parent {

    private String reallyHidden;
    private String notReallyHidden;

    public String getNotReallyHidden() {
        return notReallyHidden;
    }

    public void setNotReallyHidden(String notReallyHidden) {
        this.notReallyHidden = notReallyHidden;
    }

}//Parent

Kind -

package Dump;

public class Child extends Parent {

    private String childOnly;

    public String getChildOnly() {
        return childOnly;
    }

    public void setChildOnly(String childOnly) {
        this.childOnly = childOnly;
    }

    public static void main(String [] args){

        System.out.println("Testing...");
        Child c1 = new Child();
        c1.setChildOnly("childOnly");
        c1.setNotReallyHidden("notReallyHidden");

        //Attempting to access parent's reallyHidden
            c1.reallyHidden;//Does not even compile

    }//main

}//Child
Erran Morad
quelle
10

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:

class Some { 
   private int count; 
   public void increment() { 
      count++;
   }
   public String toString() { 
       return Integer.toString( count );
   }
}

class UseIt { 
    void useIt() { 
        Some s = new Some();
        s.increment();
        s.increment();
        s.increment();
        int v = Integer.parseInt( s.toString() );
        // hey, can you say you inherit it?
     }
}

Sie können den Wert von countinnen auch UseItdurch 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:

class SomeOther extends Some { 
    private int count = 1000;
    @Override
    public void increment() { 
        super.increment();
        count *= 10000;
    }
}

class UseIt { 
    public static void main( String ... args ) { 
        s = new SomeOther();
        s.increment();
        s.increment();
        s.increment();
        v = Integer.parseInt( s.toString() );
        // what is the value of v?           
     }
}

Dies ist genau die gleiche Situation wie im ersten Beispiel. Das Attribut countist 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 :

//A.java
class A {
   private int i;
   public String toString() { return ""+ i; }
}
// B.java
class B extends A {}
// Main.java
class Main {
   public static void main( String [] args ) {
      System.out.println( new B().toString() );
    }
}
// Compile all the files
javac A.java B.java Main.java
// Run Main
java Main
// Outout is 0 as expected as B is using the A 'toString' definition
0

// Change A.java
class A {
   public String toString() {
      return "Nothing here";
   }
}
// Recompile ONLY A.java
javac A.java
java Main
// B wasn't modified and yet it shows a different behaviour, this is not due to 
// inheritance but the way Java loads the class
Output: Nothing here

Ich denke, der genaue Begriff könnte hier gefunden werden: Die JavaTM Virtual Machine Specification

OscarRyz
quelle
:) Das nächste Mal könnten Sie die Gelegenheit nutzen, um Ihrem Interviewer zu erklären, wo er / sie falsch liegt, und dies kann Ihnen zusätzliche Punkte geben;) Natürlich sollten Sie dies auf diplomatisch korrekte Weise tun.
OscarRyz
1
Sie müssen vererbt werden, damit polymorphe Typen überhaupt eine Bedeutung haben. Siehe meine Erklärung. Es ist wahr, dass man nicht mit ihnen herumspielen kann, aber sie sind da. Sie müssen sein.
DigitalRoss
Ihr Code enthält keine Vererbungsschlüsselwörter (erweitert / implementiert), sodass dies kein Vererbungsbeispiel ist.
Fmucar
1
Ähh, wenn sie da sind, wie sind sie dorthin gekommen? Weil die Unterklasse sie definiert hat? Nein, weil sie geerbt wurden ?
DigitalRoss
1
Toller Punkt zu encapsulationvs inherit, ich denke, diese Antwort verdient mehr Stimmen.
Eric Wang
6

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 ->

public class ParentClass {
  private int x;

  public int getX() {
    return x;
  }

  public void setX(int x) {
    this.x = x;
  }
}

class SubClass extends ParentClass {
  private int y;

  public int getY() {
    return y;
  }

  public void setY(int y) {
    this.y = y;
  }

  public void setXofParent(int x) {
    setX(x); 
  }
}

class Main {
  public static void main(String[] args) {
    SubClass s = new SubClass();
    s.setX(10);
    s.setY(12);
    System.out.println("X is :"+s.getX());
    System.out.println("Y is :"+s.getY());
    s.setXofParent(13);
    System.out.println("Now X is :"+s.getX());
  }
}

Output:
X is :10
Y is :12
Now X is :13

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.

dganesh2002
quelle
2
Gemäß Oracle-Dokument - 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.
dganesh2002
4

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.

import java.io.Serializable;
public class ParentClass implements Serializable {
public ParentClass() {

}

public int a=32131,b,c;

private int bhavesh=5555,rr,weq,refw;
}

import java.io.*;
import java.io.Serializable;
public class ChildClass extends ParentClass{
public ChildClass() {
super();
}

public static void main(String[] args) {
ChildClass childObj = new ChildClass();
ObjectOutputStream oos;
try {
        oos = new ObjectOutputStream(new FileOutputStream("C:\\MyData1.txt"));
        oos.writeObject(childObj); //Writing child class object and not parent class object
        System.out.println("Writing complete !");
    } catch (IOException e) {
    }


}
}

Öffnen Sie MyData1.txt und suchen Sie nach dem privaten Mitglied 'bhavesh'. Bitte lassen Sie mich wissen, was Sie denken.

Bhavesh Agarwal
quelle
3

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.

Flanker
quelle
1

Ich würde antworten , dass private Felder in Java werden vererbt. Gestatten Sie mir zu demonstrieren:

public class Foo {

    private int x; // This is the private field.

    public Foo() {
        x = 0; // Sets int x to 0.
    }

    //The following methods are declared "final" so that they can't be overridden.
    public final void update() { x++; } // Increments x by 1.
    public final int getX() { return x; } // Returns the x value.

}


public class Bar extends Foo {

    public Bar() {

        super(); // Because this extends a class with a constructor, it is required to run before anything else.

        update(); //Runs the inherited update() method twice
        update();
        System.out.println(getX()); // Prints the inherited "x" int.

    }

}

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 Methoden update()und gekapselt ist getX(), 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.

Rechtmäßig faul
quelle
3
"Enthält" bedeutet nicht "erbt";)
Stan Kurilin
1

Speicherlayout in Java gegenüber Vererbung

Geben Sie hier die Bildbeschreibung ein

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 ...

Somenath Mukhopadhyay
quelle
1

Nein , private Felder werden nicht vererbt. Der einzige Grund ist, dass die Unterklasse nicht direkt auf sie zugreifen kann .

joooohnli
quelle
0

Ich glaube, die Antwort hängt völlig von der Frage ab, die gestellt wurde. Ich meine, wenn die Frage ist

Können wir von ihrer Unterklasse aus direkt auf das private Feld der Superklasse zugreifen?

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

Können wir von ihrer Unterklasse aus auf das private Feld der Superklasse zugreifen?

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 functionKonzept, mit dem wir auf das private Mitglied einer anderen Klasse zugreifen können.

Ravi
quelle
0

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.

Aamir Wani
quelle
-1

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.

Suprinder
quelle
-2

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).

gkakas
quelle
1
-1. Das JLS definiert die Sprache, es ist unmöglich, dass das JLS "falsch" ist. Wenn es Mechanismen gibt, die die Kapselung unterbrechen, bedeutet dies nicht, dass das Feld vererbt wird. lediglich, dass es Mechanismen gibt, die die Einkapselung untergraben.
SL Barth - Stellen Sie Monica
Eine Definition kann an sich in mehrfacher Hinsicht falsch sein. Darüber weiter zu diskutieren ist nicht meine Absicht. Das Argument hier ist nicht die Mechanismen, die die Kapselung brechen (Gott oder schlecht, wie sie auch sein mögen), sondern die Tatsache, dass das Feld / die Methode vorhanden ist und das Verhalten und den Zustand Ihrer Unterklasse beeinflusst. Es ist also "geerbt". Man könnte ein privates 100-KB-Byte-Array in einer Klasse verwenden und einfach annehmen, dass seine (Jumbo-) Nachkommen es nicht erben. Verpassen Sie nicht den Punkt und beurteilen Sie dies als eine gute oder schlechte Praxis (Übertreibung hilft, einen Punkt zu machen): Es ist eine vorgesehene, legitime Handlung. Private Mitglieder werden "geerbt".
Gkakas