No. Non lo ereditano.
Il fatto che un'altra classe possa usarla indirettamente non dice nulla sull'ereditarietà, ma sull'incapsulamento.
Per esempio:
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?
}
}
Puoi anche ottenere il valore di count
dentro UseIt
tramite la riflessione. Non significa che lo erediti.
AGGIORNARE
Anche se il valore è presente, non viene ereditato dalla sottoclasse.
Ad esempio una sottoclasse definita come:
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?
}
}
Questa è esattamente la stessa situazione del primo esempio. L'attributo count
è nascosto e non ereditato dalla sottoclasse. Tuttavia, come sottolinea DigitalRoss, il valore è presente, ma non per eredità.
Detto così. Se tuo padre è ricco e ti dà una carta di credito, puoi ancora comprare qualcosa con i suoi soldi, ma non significa che hai ereditato tutti quei soldi, vero?
Altro aggiornamento
È molto interessante, però, sapere perché l'attributo è presente.
Francamente non ho il termine esatto per descriverlo, ma è la JVM e il modo in cui funziona che carica anche la definizione genitore "non ereditata".
Potremmo effettivamente cambiare il genitore e la sottoclasse funzionerà comunque.
Per esempio :
//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
Immagino che il termine esatto possa essere trovato qui: le specifiche della macchina virtuale JavaTM