ไม่พวกมันไม่ได้รับมรดก
ความจริงบางคลาสอื่นอาจใช้โดยทางอ้อมไม่ได้พูดอะไรเกี่ยวกับการสืบทอด แต่เกี่ยวกับการห่อหุ้ม
ตัวอย่างเช่น
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
ผ่านการสะท้อนกลับ มันไม่ได้หมายความว่าคุณจะสืบทอดมัน
UPDATE
แม้ว่าค่าจะอยู่ที่นั่น แต่ไม่ได้สืบทอดโดยคลาสย่อย
ตัวอย่างเช่นคลาสย่อยที่นิยามเป็น:
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 Virtual Machine