Lý do java tuyên bố thêm 2 loại phương pháp mới này là "đảm bảo tính tương thích nhị phân với mã được viết cho phiên bản cũ hơn của các giao diện đó".
Điều này chỉ áp dụng cho phương pháp mặc định (không phải phương pháp tĩnh) và bỏ qua một số ngữ cảnh. Từ Goetz, State of the Lambda:
Mục đích của các phương pháp mặc định ... là cho phép các giao diện được phát triển theo cách tương thích sau khi xuất bản lần đầu.
Mục tiêu chính là cho phép phát triển giao diện , tức là bổ sung các phương pháp mới. Nếu một phương thức mới được thêm vào một giao diện, các lớp hiện có thực hiện giao diện sẽ thiếu một triển khai thực hiện, điều này sẽ không tương thích. Để tương thích, việc triển khai phải đến từ đâu đó, vì vậy nó được cung cấp theo các phương thức mặc định.
Tại sao làm sai lệch khái niệm ban đầu của giao diện giả sử hoàn toàn trừu tượng để hỗ trợ các vấn đề kiến trúc hiện có?
Mục đích chính của giao diện Java là specify a contract mà bất kỳ lớp nào có thể triển khai mà không phải thay đổi vị trí của nó trong phân cấp lớp. Đúng là, trước Java 8, giao diện hoàn toàn trừu tượng.Tuy nhiên, đây không phải là thuộc tính thiết yếu của giao diện. Ngay cả khi các phương thức mặc định được đưa vào, một giao diện tại trái tim của nó vẫn chỉ định một hợp đồng khi lớp thực hiện. Lớp thực thi có thể ghi đè lên các phương thức mặc định, vì vậy lớp đó vẫn còn trong việc kiểm soát hoàn toàn việc thực hiện nó. (Lưu ý cũng default methods cannot be final đó.)
sự khác biệt giữa việc sử dụng một lớp trừu tượng và phiên bản mới của giao diện khác hơn so với khả năng của một lớp học để mở rộng nhiều giao diện là gì?
Khả năng của lớp để mở rộng nhiều giao diện có liên quan chặt chẽ với sự khác biệt giữa giao diện và lớp trừu tượng, cụ thể là giao diện không thể chứa trạng thái. Đây là khó khăn chính khi cho phép đa thừa kế: nếu một siêu lớp xuất hiện nhiều lần trong tổ tiên của một lớp, trạng thái của siêu lớp đó chỉ xuất hiện một lần hay nhiều lần? Một khác biệt khác là các lớp trừu tượng có thể định nghĩa các phương thức và các trường được chia sẻ với các lớp con, nhưng không phải với người gọi, bằng cách sử dụng các mức truy cập được bảo vệ và gói riêng. Giao diện chỉ có thể có các phương thức công khai.
(Trong Java 9, hỗ trợ cho các phương pháp tư nhân đã được thêm vào. Điều này rất hữu ích cho việc chia sẻ thực hiện những phương pháp mặc định hoặc tĩnh của một giao diện.)
Cuối cùng, phương pháp tĩnh trong giao diện không ảnh hưởng đến lớp thừa kế, cũng không phải là một phần của hợp đồng giao diện. Họ chỉ đơn thuần là một cách để tổ chức các phương thức tiện ích theo cách thuận tiện hơn. Ví dụ, việc sử dụng phổ biến các phương thức tĩnh trong một giao diện là cho các phương thức nhà máy tĩnh. Nếu các phương thức tĩnh không được cho phép trong các giao diện, các phương thức factory tĩnh sẽ phải được đặt trên một lớp đồng hành. Việc cho phép các phương thức tĩnh trong các giao diện cho phép các phương thức như vậy được nhóm lại với chính giao diện đó, khi làm như vậy là thích hợp.
Bản sao có thể có của http://stackoverflow.com/questions/22591499/what-are-the-differences-between-abstract-classes-and-interfaces-in-java-8 – Vulcan
@Vulcan câu hỏi của tôi là nhắm mục tiêu sử dụng của bản cập nhật java 8 chứ không phải sự khác biệt giữa giao diện trừu tượng và giao diện –