Pas de. Ils n'héritent pas.
Le fait que certaines autres classes peuvent utiliser indirectement ne dit rien à propos de l'héritage, mais à propos de 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 count
à l'intérieur d' UseIt
via la réflexion. Il n'a pas les moyens, vous en hériter.
Mise à JOUR
Même si la valeur est là, il 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 caché et pas héritées par la sous-classe. Encore, comme DigitalRoss points, la valeur est là, mais pas par la voie de l'héritage.
Mettre de cette façon. Si votre père est riche, et vous donne une carte de crédit, vous pouvez toujours acheter des chose avec son argent, mais cela ne signifie pas que vous avez hérité de tout ce que l'argent, n'est ce pas?
Autres mise à jour
C'est très intéressant, cependant, de savoir pourquoi l'attribut est là.
Franchement, je n'ai pas le terme exact pour décrire ça, mais c'est la JVM et la façon dont il fonctionne, qui se charge aussi de la "pas hérité" parent définition.
On pourrait effectivement changer le parent et le sous-classe ne fonctionnent toujours.
Par exemple:
C:\java>more > A.java
class A {
private int i;
public String toString() { return ""+ i; }
}^C
C:\java>more > B.java
class B extends A {
}^C
C:\java>more > Main.java
class Main {
public static void main( String [] args ) {
System.out.println( new B().toString() );
}
}^C
C:\java>javac A.java B.java Main.java
C:\java>java Main
0
C:\java>more > A.java
class A {
public String toString() {
return "Nothing here";
}
}^C
C:\java>javac A.java
C:\java>java Main
Nothing here
Je crois que le terme exact pourrait être trouvé ici: La Java Virtual Machine Spécification