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 count
innen auch UseIt
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:
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 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 :
//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