Non, ils n'en héritent pas.
Le fait qu'une autre classe puisse l'utiliser indirectement ne dit rien sur l'héritage, mais sur l'encapsulation.
Par exemple:
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?
}
}
Vous pouvez également obtenir la valeur de l' count
intérieur UseIt
via la réflexion. Cela ne signifie pas que vous en héritez.
METTRE À JOUR
Même si la valeur est là, elle n'est pas héritée par la sous-classe.
Par exemple, une sous-classe définie comme:
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?
}
}
C'est exactement la même situation que le premier exemple. L'attribut count
est masqué et n'est pas hérité du tout de la sous-classe. Pourtant, comme le souligne DigitalRoss, la valeur est là, mais pas par héritage.
Mets le comme ça. Si votre père est riche et vous donne une carte de crédit, vous pouvez toujours acheter quelque chose avec son argent, mais cela ne signifie pas que vous avez hérité de tout cet argent, n'est-ce pas?
Autre mise à jour
Il est cependant très intéressant de savoir pourquoi l'attribut est là.
Franchement, je n'ai pas le terme exact pour le décrire, mais c'est la machine virtuelle Java et la façon dont elle fonctionne qui charge également la définition parent "non héritée".
Nous pourrions en fait changer le parent et la sous-classe fonctionnera toujours.
Par exemple :
//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
Je suppose que le terme exact pourrait être trouvé ici: La spécification de la machine virtuelle JavaTM