Để thêm Stream vào Java 8, họ phải phá vỡ hàng tỷ dòng code — hoặc phát minh một lối thoát
Vì sao interface được phép mang mã sẵn, bài toán kim cương quay lại và được giải bằng Bay.super.diChuyen(), cùng ba luật ưu tiên khi có xung đột.
Vì sao interface được phép mang mã sẵn, bài toán kim cương quay lại và được giải bằng Bay.super.diChuyen(), cùng ba luật ưu tiên khi có xung đột.
Interface có phương thức default từ Java 8 nên ranh giới mờ đi nhiều. Hai thứ còn khác thật sự — giữ trạng thái và số lượng kế thừa được — cùng hai câu hỏi để chọn và một ví dụ chuyển từ lớp trừu tượng sang interface.
Phương thức được chọn theo đối tượng thật lúc chạy, trường được chọn theo kiểu khai báo lúc biên dịch. Mở bytecode ra là thấy ngay: invokevirtual tra bảng lúc chạy, getfield chốt chỉ mục lúc dịch — cùng một đối tượng cho ra hai kết quả.
Cùng một lớp đếm số lượt thêm, kế thừa HashSet cho ra 6 còn giữ một Set bên trong cho ra 3 — vì addAll âm thầm gọi add. Vì sao 'kế thừa phá vỡ đóng gói', và ba câu hỏi để biết khi nào kế thừa vẫn đúng.
Bốn mức truy cập của Java qua thông báo lỗi thật của javac, cái luật protected mà ít người biết (chỉ qua tham chiếu kiểu chính nó), vì sao mức mặc định bị đánh giá thấp, và lý do sinh getter/setter cho mọi trường là thói quen nên bỏ.
Sáu bước JVM chạy khi bạn gõ new, vì sao một trường khai giá trị rõ ràng lại null giữa chừng, this(...) khác super(...) ra sao, và vì sao gọi phương thức bị ghi đè trong hàm khởi tạo lại nguy hiểm.