Tidak. Mereka tidak mewarisinya.
Fakta bahwa beberapa kelas lain mungkin menggunakannya secara tidak langsung tidak mengatakan apa-apa tentang warisan, tetapi tentang enkapsulasi.
Misalnya:
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?
}
}
Anda juga bisa mendapatkan nilai dari count
dalam UseIt
melalui refleksi. Itu tidak berarti, Anda mewarisinya.
MEMPERBARUI
Meskipun nilainya ada, itu tidak diwarisi oleh subclass.
Misalnya subclass didefinisikan sebagai:
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?
}
}
Ini persis situasi yang sama dengan contoh pertama. Atribut count
disembunyikan dan tidak diwarisi oleh subclass sama sekali. Namun, seperti yang ditunjukkan DigitalRoss, nilainya ada di sana, tetapi tidak dengan warisan.
Begini. Jika ayahmu kaya dan memberimu kartu kredit, kamu masih bisa membeli barang dengan uangnya, tetapi tidak berarti kamu mewarisi semua uang itu, bukan?
Pembaruan lainnya
Sangat menarik untuk mengetahui mengapa atribut itu ada.
Saya terus terang tidak memiliki istilah yang tepat untuk menggambarkannya, tetapi JVM dan cara kerjanya memuat juga definisi induk "tidak diwariskan".
Kami benar-benar dapat mengubah induk dan subkelas akan tetap berfungsi.
Misalnya :
//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
Saya kira istilah yang tepat dapat ditemukan di sini: Spesifikasi Mesin Virtual JavaTM