Hãy xem xét các đoạn mã sau:Phương pháp trọng và thừa kế trong java
class A{ /* assume static and non static block are here */ }
class B extends A{ /* assume static and non static block are here */ }
Trong phương pháp chính,
new B();
Vì vậy, thứ tự của các khởi tạo sẽ là:
- thành viên tĩnh khởi tạo cho lớp A
- thành viên tĩnh initializati trên cho lớp B
- phi thành viên tĩnh khởi cho lớp Một
- sau đó thực thi mã bên trong constructor Một thành viên
- phi tĩnh khởi cho lớp B
- sau đó thực thi mã bên trong constructor B
Bây giờ, hãy xem đoạn mã này,
class A{
A(){
this.m(); //line 1
}
void m(){
System.out.println("A.m()");
}
}
class B extends A{
void m(){
System.out.println("B.m()");
}
}
Trong phương pháp chính,
new B();
Khi mã của hàm tạo A đang được thực hiện, nó chỉ có thể thấy phương thức m trong lớp A vì các thành viên không tĩnh chưa được khởi tạo cho lớp B (theo thứ tự tôi đã đề cập). Tuy nhiên kết quả là "B.m()". (phương pháp của lớp phụ đã được thực hiện) Ai đó có thể giải thích những gì đang xảy ra ở đây (phương pháp overridng) xem xét thứ tự mà tôi đã đề cập?
[This] (http://stackoverflow.com/a/15327631/335858) nên mang lại một số rõ ràng, mặc dù nó không phải là một bản sao chính xác. – dasblinkenlight
có thể trùng lặp của [Thứ tự khởi tạo lớp Java và phương thức ghi đè] (http: // stackoverflow.com/questions/18138397/java-class-initialization-order-and-overridden-methods) –
Bạn nên ** không bao giờ, Không bao giờ, KHÔNG BAO GIỜ ** gọi các phương thức ảo trong một hàm tạo/hủy. Đây là ý tưởng tồi tệ * xác định * khủng khiếp. Việc gọi các phương thức 'final' instance có thể là * okay *, nhưng tôi thường coi nó là một ý tưởng * xấu * và tránh nó khi có thể. Đó là một ý tưởng * khủng khiếp * mà nó được đề cập trong Hiệu ứng C++ của Scott Meyer và trong khi câu hỏi của bạn * là * về Java, những lý do chính mà anh ta đưa ra ở đây áp dụng ở đây. Đừng làm thế. – jason