いいえ、継承しません。
他のクラスがそれを間接的に使用するという事実は、継承については何も言わず、カプセル化についてです。
例えば:
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仮想マシン仕様