C++ có nhiều thừa kế. Việc thực hiện thừa kế nhiều ở cấp độ hội đồng có thể khá phức tạp, nhưng có tốt descriptions trực tuyến về cách thức này thường được thực hiện (vtables, fixups con trỏ, khối, vv).Giao diện java được triển khai bên trong như thế nào? (vtables?)
Java không có nhiều kế thừa thực hiện, nhưng nó có nhiều giao diện kế thừa, vì vậy tôi không nghĩ rằng việc triển khai thẳng về phía trước với một vtable duy nhất cho mỗi lớp có thể thực hiện điều đó. Làm thế nào để java thực hiện các giao diện nội bộ?
Tôi nhận thấy rằng trái với C++, Java được Jit biên soạn, vì vậy các phần mã khác nhau có thể được tối ưu hóa khác nhau và các JVM khác nhau có thể làm những việc khác nhau. Vì vậy, có một số chiến lược chung mà nhiều JVM thực hiện theo cách này hay không ai biết việc triển khai trong một JVM cụ thể? Ngoài ra JVM thường ảo hóa và gọi phương thức nội tuyến trong trường hợp không có vtables hoặc tương đương, vì vậy có thể không hỏi về chuỗi thực thi thực hiện các cuộc gọi phương thức ảo/giao diện, nhưng tôi cho rằng Các JVM vẫn giữ một số kiểu đại diện chung của các lớp xung quanh để sử dụng nếu chúng không thể ảo hóa mọi thứ. Giả định này có sai không? Có đại diện này nhìn trong bất kỳ cách nào giống như một C++ vtable? Nếu các giao diện như vậy có các vtables riêng biệt và các giao diện này được liên kết với vtables lớp như thế nào? Nếu vậy có thể đối tượng trường hợp có nhiều con trỏ vtable (để lớp/giao diện vtables) như trường hợp đối tượng trong C + + có thể? Do tham chiếu của một loại lớp và một loại giao diện cho cùng một đối tượng luôn luôn có cùng một giá trị nhị phân hoặc có thể những khác nhau như trong C + +, nơi họ yêu cầu sửa chữa con trỏ?
(để tham khảo: this question hỏi một cái gì đó tương tự về CLR, và dường như có một lời giải thích tốt trong this msdn article mặc dù có thể bị lỗi thời bởi bây giờ tôi đã không thể tìm bất cứ điều gì tương tự cho Java..)
Edit:
- ý tôi là 'cụ' theo nghĩa của "Làm thế nào để trình biên dịch GCC thực hiện nguyên Ngoài/chức năng cuộc gọi/etc", chứ không phải theo nghĩa của "lớp Java ArrayList cài đặt giao diện Danh sách ".
- tôi biết cách làm việc này ở cấp bytecode JVM, những gì tôi muốn biết là những loại mã và datastructures được tạo ra bởi JVM sau khi nó được thực hiện tải các tập tin lớp và biên dịch các bytecode.
Bạn đề cập đến kế thừa giao diện và kế thừa thực hiện. Việc thừa kế thực hiện rất khó vì bạn cần có một thứ tự tìm kiếm xác định. Giao tiếp kế thừa là cách đơn giản hơn. Bạn chỉ cần có một bản đồ với tất cả các chữ ký phương thức cần được thực hiện. Không yêu cầu đơn đặt hàng tìm kiếm (vì không có triển khai nào được đính kèm). Không có trật tự ở đó. – extraneon