Không. Họ không thừa kế nó.
Thực tế một số lớp khác có thể sử dụng nó một cách gián tiếp không nói gì về thừa kế, nhưng về đóng gói.
Ví dụ:
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?
}
}
Bạn cũng có thể nhận được giá trị count
bên trong UseIt
thông qua sự phản chiếu. Nó không có nghĩa là, bạn thừa hưởng nó.
CẬP NHẬT
Mặc dù giá trị là ở đó, nó không được kế thừa bởi lớp con.
Ví dụ, một lớp con được định nghĩa là:
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?
}
}
Đây chính xác là tình huống tương tự như ví dụ đầu tiên. Thuộc tính count
bị ẩn và không được kế thừa bởi lớp con. Tuy nhiên, như DigitalRoss chỉ ra, giá trị là có, nhưng không có nghĩa là thừa kế.
Đặt nó theo cách này. Nếu cha bạn giàu có và cho bạn thẻ tín dụng, bạn vẫn có thể mua đồ bằng tiền của mình, nhưng không có nghĩa là bạn đã thừa hưởng tất cả số tiền đó, phải không?
Cập nhật khác
Mặc dù vậy, nó rất thú vị để biết tại sao thuộc tính lại ở đó.
Tôi thực sự không có thuật ngữ chính xác để mô tả nó, nhưng đó là JVM và cách thức hoạt động của nó cũng tải định nghĩa cha mẹ "không được kế thừa".
Chúng tôi thực sự có thể thay đổi cha mẹ và lớp con vẫn sẽ hoạt động.
Ví dụ :
//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
Tôi đoán thuật ngữ chính xác có thể được tìm thấy ở đây: Đặc tả máy ảo JavaTM