Hết sức tò mò,Tại sao phương thức finalize() trong java.lang.Object được bảo vệ?
Tại sao sửa đổi truy cập của phương thức finalize()
được thực hiện là protected
. Tại sao nó không thể là public
? Ai đó có thể giải thích cho tôi bất kỳ lý do cụ thể nào đằng sau điều này?
Ngoài ra, tôi đã biết rằng phương thức finalize()
chỉ được gọi một lần. Nếu tôi gọi nó hai lần trong chương trình của tôi trong nội bộ, điều gì đang xảy ra? Bộ thu gom rác sẽ gọi lại lần nữa?
private void dummyCall() {
try {
finalize();
finalize();
} catch (Throwable e) {
e.printStackTrace();//NOT REACHES EXCEPTION
}
}
tại sao bạn sẽ viết một phương thức để gọi finalize(). finalize() được gọi tại sự phá hủy dụ bởi JVM. bạn không nên gọi nó. Bạn có thể ghi đè lên nó mặc dù, trong trường hợp bạn muốn hành vi đặc biệt tại thời điểm phá hủy ... – harschware
Có. Cá nhân tôi sẽ không bao giờ làm điều đó. Nhưng tôi hỏi nó ra khỏi tò mò vì tôi đọc GC sẽ không gọi nó nếu nó đã được gọi trên một đối tượng. Ai đang theo dõi liệu phương thức finalize() này có được gọi hay không là những gì tôi nghi ngờ. Tuy nhiên, tôi chưa có một lời giải thích thuyết phục nào cho câu hỏi thứ hai này. – bragboy
Câu hỏi thực sự thú vị là: tại sao * hoàn thành() * xuất hiện ở phần trên cùng của hệ thống phân cấp Java OO? Dự án 200K LOC ở đây và chúng tôi đã không ghi đè * hoàn thành() * một lần duy nhất. Một số thậm chí sẽ nói rằng đó là một mùi mã để ghi đè * finalize() * và một số dị giáo sẽ đi xa như nói rằng * finalize() * không tồn tại ở cấp OOA/OOD và rằng nó hiện diện ở đầu Java phân cấp là một (tách) Java idiosynchrasy (và hoàn toàn không liên quan đến không gian vấn đề của bạn).Khá một số câu trả lời upvoted ở đây btw xem xét * finalize() * để bị hỏng/thiếu sót trong cách này hay cách khác :) – SyntaxT3rr0r