Tôi đã tìm kiếm trực tuyến cho câu hỏi tương tự, nhưng không thể tìm thấy nó. Vì vậy, đăng ở đây.Thừa kế Java - từ khóa này
Trong chương trình sau đây tại sao giá trị của 'i' được in là 100?
AFAIK 'this' dùng để chỉ đối tượng hiện tại; trong trường hợp này là 'TestChild' và tên lớp cũng được in chính xác. Nhưng tại sao giá trị của biến mẫu không phải là 200?
public class TestParentChild {
public static void main(String[] args) {
new TestChild().printName();
}
}
class TestChild extends TestParent{
public int i = 200;
}
class TestParent{
public int i = 100;
public void printName(){
System.err.println(this.getClass().getName());
System.err.println(this.i); //Shouldn't this print 200
}
}
Và hơn thế nữa, kết quả đầu ra sau đây như tôi mong đợi. Phương thức lớp con được gọi, khi tôi gọi "this.test()" từ lớp cha.
public class TestParentChild {
public static void main(String[] args) {
new TestChild().printName();
}
}
class TestChild extends TestParent{
public int i = 200;
public void test(){
System.err.println("Child Class : "+i);
}
}
class TestParent{
public int i = 100;
public void printName(){
System.err.println(this.getClass().getName());
System.err.println(this.i); //Shouldn't this print 200
this.test();
}
public void test(){
System.err.println("Parent Class : "+i);
}
}
Cảm ơn đã trả lời nhanh chóng . Bạn có thể vui lòng eloberate, bạn có ý nghĩa gì bởi điều này? ** "Trong các trường Java không thể được đánh dấu là ảo" ** Như tôi đã đề cập, trong chương trình thứ hai của tôi, phương thức cá thể được gọi một cách chính xác. Nhưng biến mẫu là tham chiếu đến lớp Parent. – Jack
Tôi đã cập nhật câu trả lời của mình. – Dai
Trong Java, tất cả các phương thức (trừ khi được chỉ định) là "ảo", có nghĩa là chúng có một vtable được liên kết cho phép gửi thời gian chạy. Các trường, tuy nhiên, tồn tại như là một vị trí bộ nhớ tuyệt đối (ish) và không được bù đắp bởi bất kỳ vtable nào. Tôi đổ lỗi cho sự nhầm lẫn trên tài liệu thiết kế của Java mà không có từ khóa "ảo" và "ghi đè" rõ ràng trong khi C# làm. – Dai