Ні. Вони не успадковують це.
Те, що деякі інші класи можуть використовувати це опосередковано, говорить не про спадщину, а про інкапсуляцію.
Наприклад:
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?
}
}
Ви також можете отримати значення count
всередині UseIt
за допомогою відображення. Це не означає, ти це успадковуєш.
ОНОВЛЕННЯ
Незважаючи на те, що значення є, воно не успадковується підкласом.
Наприклад, підклас, визначений як:
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?
}
}
Це точно та сама ситуація, що і перший приклад. Атрибут count
прихований і зовсім не успадковується підкласом. Однак, як вказує DigitalRoss, цінність є, але не за допомогою спадкування.
Поставте так. Якщо ваш батько заможний і дає вам кредитну карту, ви все одно можете придбати річ за його гроші, але це не означає, що ви успадкували всі ці гроші, чи не так?
Інше оновлення
Дуже цікаво знати, чому атрибут є.
Я, відверто кажучи, не маю точного терміна, щоб описати це, але саме JVM і спосіб його роботи завантажує також "не успадковане" батьківське визначення.
Ми могли фактично змінити батьківський і підклас все ще буде працювати.
Наприклад :
//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
Я думаю, що точний термін можна знайти тут: Специфікація віртуальної машини JavaTM