Нет, они не наследуют это.
Тот факт, что какой-то другой класс может использовать его косвенно, ничего не говорит о наследовании, но о инкапсуляции.
Например:
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