Nie. Nie dziedziczą tego.
Fakt, że niektóre inne klasy mogą z niego korzystać pośrednio, nie mówi nic o dziedziczeniu, ale o enkapsulacji.
Na przykład:
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?
}
}
Możesz także uzyskać wartość count
wnętrza UseIt
poprzez odbicie. To nie znaczy, że odziedziczysz to.
AKTUALIZACJA
Mimo że wartość istnieje, nie jest dziedziczona przez podklasę.
Na przykład podklasa zdefiniowana jako:
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?
}
}
Jest to dokładnie taka sama sytuacja jak w pierwszym przykładzie. Atrybut count
jest ukryty i wcale nie jest dziedziczony przez podklasę. Mimo to, jak wskazuje DigitalRoss, wartość istnieje, ale nie w przypadku dziedziczenia.
To w ten sposób. Jeśli twój ojciec jest bogaty i daje ci kartę kredytową, nadal możesz kupić coś za jego pieniądze, ale to nie znaczy, że odziedziczyłeś te pieniądze, prawda?
Inna aktualizacja
To bardzo interesujące, aby wiedzieć, dlaczego istnieje ten atrybut.
Szczerze mówiąc, nie mam dokładnego terminu, aby to opisać, ale jest to JVM i sposób, w jaki działa, który ładuje również definicję rodzica „nie odziedziczoną”.
Możemy faktycznie zmienić element nadrzędny, a podklasa będzie nadal działać.
Na przykład :
//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
Myślę, że dokładny termin można znaleźć tutaj: Specyfikacja wirtualnej maszyny JavaTM