Trong một bài báo trắng có tiêu đề “Java. một Tổng quan” của James Gosling vào tháng 2 năm 1995 đưa ra ý tưởng về lý do tại sao tính đa kế thừa không được hỗ trợ trong Java
JAVA bỏ qua nhiều tính năng hiếm khi được sử dụng, khó hiểu, khó hiểu của C++ mà theo kinh nghiệm của chúng tôi mang lại nhiều đau buồn hơn là lợi ích. Điều này chủ yếu bao gồm quá tải toán tử [mặc dù nó có quá tải phương thức], đa kế thừa và ép buộc tự động rộng rãi
Ai tốt hơn Tiến sĩ. James Gosling đủ điều kiện để đưa ra nhận xét về điều này. Đoạn này cung cấp cho chúng ta một cái nhìn tổng quan và anh ấy chạm vào chủ đề không hỗ trợ đa kế thừa này
Java không hỗ trợ đa kế thừa
Đầu tiên hãy đóng đinh điểm này. Bản thân điều này là một điểm thảo luận, liệu java có hỗ trợ đa kế thừa hay không. Một số người nói, nó hỗ trợ sử dụng giao diện. Không. Không hỗ trợ đa kế thừa trong java. Nếu bạn không tin lời tôi nói, hãy đọc lại đoạn trên và đó là lời của cha đẻ của Java
Câu chuyện hỗ trợ đa kế thừa bằng giao diện này là điều mà các nhà phát triển chúng tôi đã nghĩ ra. Giao diện mang lại sự linh hoạt hơn so với các lớp cụ thể và chúng tôi có tùy chọn triển khai nhiều giao diện bằng cách sử dụng một lớp. Đây là theo thỏa thuận, chúng tôi đang tuân theo hai kế hoạch chi tiết để tạo ra một lớp học
Điều này đang cố gắng tiến gần hơn đến đa kế thừa. Những gì chúng tôi làm là triển khai nhiều giao diện, ở đây chúng tôi không mở rộng [kế thừa] bất cứ thứ gì. Lớp triển khai là lớp sẽ thêm các thuộc tính và hành vi. Nó không nhận được việc triển khai miễn phí từ các lớp cha. Tôi chỉ đơn giản nói rằng, không có hỗ trợ đa kế thừa trong java
Đa kế thừa là nơi chúng ta kế thừa các thuộc tính và hành vi của nhiều lớp cho một lớp duy nhất. C++, Common Lisp, là một số ngôn ngữ phổ biến hỗ trợ đa kế thừa
Tại sao Java không hỗ trợ đa kế thừa?
Bây giờ chúng tôi chắc chắn rằng không có hỗ trợ đa kế thừa trong java. Nhưng tại sao? . Từ khóa là sự đơn giản và hiếm khi sử dụng
Sự đơn giản
Tôi muốn chia sẻ định nghĩa về java do James Gosling đưa ra
JAVA. Một ngôn ngữ đơn giản, hướng đối tượng, phân tán, giải thích, mạnh mẽ, an toàn, kiến trúc trung lập, di động, hiệu suất cao, đa luồng, năng động
Nhìn vào vẻ đẹp của định nghĩa này cho java. Đây phải là định nghĩa cho một ngôn ngữ phần mềm hiện đại. Đặc điểm đầu tiên trong định nghĩa ngôn ngữ là gì?
Để thực thi tính đơn giản phải là lý do chính để bỏ qua nhiều kế thừa. Chẳng hạn, chúng ta có thể xem xét bài toán đa kế kim cương
Chúng ta có hai lớp B và C kế thừa từ A. Giả sử rằng B và C đang ghi đè một phương thức được kế thừa và chúng cung cấp cách triển khai của riêng chúng. Bây giờ D kế thừa từ cả B và C thực hiện đa kế thừa. D nên kế thừa phương thức ghi đè đó, phương thức ghi đè nào sẽ được sử dụng?
Trong C++ có khả năng rơi vào cái bẫy này mặc dù nó cung cấp các giải pháp thay thế để giải quyết vấn đề này. Trong java, điều này không bao giờ có thể xảy ra vì không có đa kế thừa. Ở đây, ngay cả khi hai giao diện sẽ có cùng một phương thức, thì lớp triển khai sẽ chỉ có một phương thức và điều đó cũng sẽ do người triển khai thực hiện. Tải động các lớp làm cho việc triển khai đa kế thừa trở nên khó khăn
hiếm khi được sử dụng
Chúng tôi đã sử dụng java từ lâu rồi. Đã bao nhiêu lần chúng ta phải đối mặt với tình huống bị mắc kẹt và quay mặt vào tường vì thiếu hỗ trợ đa kế thừa trong java? . Vì hiếm khi được yêu cầu, đa thừa kế có thể được bỏ qua một cách an toàn khi xem xét mức độ phức tạp của nó khi triển khai. Nó không đáng để rắc rối và con đường đơn giản được chọn
Ngay cả khi nó được yêu cầu, nó có thể được thay thế bằng thiết kế thay thế. Vì vậy, có thể sống mà không có nhiều quyền thừa kế mà không gặp vấn đề gì và đó cũng là một lý do
Ý kiến của tôi về điều này là, việc bỏ qua hỗ trợ đa kế thừa trong java không phải là một sai sót và nó tốt cho những người triển khai
Đa kế thừa là một tính năng của khái niệm hướng đối tượng, trong đó một lớp có thể kế thừa các thuộc tính của nhiều hơn một lớp cha. Sự cố xảy ra khi tồn tại các phương thức có cùng chữ ký trong cả lớp cha và lớp con. Khi gọi phương thức, trình biên dịch không thể xác định phương thức lớp nào sẽ được gọi và ngay cả khi gọi phương thức lớp nào được ưu tiên.
Ghi chú. Java không hỗ trợ Đa kế thừa
ví dụ 1
Java
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI234
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI235
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI236
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI237
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI238
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI239
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI240
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI20
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI21
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22____03
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI25
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI26
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI28
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____100
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI201
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI202
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI206
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI207
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI20
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI209
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22____03
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI25
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI26
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI28
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____100
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2349
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI202
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2354
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2355
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI20
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2357____2358
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2359
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22____2361
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22____2363
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2364
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI25
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2366
_______07____2368
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____2370____2371
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2372
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____2374
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____2376
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____2378
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____2380
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
đầu ra. Lỗi biên dịch được ném
Phần kết luận. Như được mô tả từ đoạn mã trên, khi gọi phương thức fun[] bằng cách sử dụng đối tượng Test sẽ gây ra sự phức tạp chẳng hạn như nên gọi phương thức fun[] của Parent1 hay fun[] của Parent2.
ví dụ 2
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI26
Mã này như sau
Java
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI234
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI235
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2386
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI236
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI237
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI238
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI239
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2391
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI20
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2393
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI25
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI26
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____2398
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____100
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2401
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI202
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI206
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI240
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI20
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2409
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2358
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2393
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI25
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI26
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____2398
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____100
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI201
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI202
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2354
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI207
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI20
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI217
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2358
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2393
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI25
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI26
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____2398
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____100
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2349
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI202
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI232
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI233
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI20
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2357____2358
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2359
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22____2361
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22____2363
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2364
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI25
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2366
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____046
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____2370____2371
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2372
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI252
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____054
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____2380
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
đầu ra.
Một lần nữa, nó đưa ra lỗi trình biên dịch khi chạy phương thức fun[] vì nhiều kế thừa gây ra sự cố kim cương khi được phép trong các ngôn ngữ khác như C++. Từ mã, chúng tôi thấy rằng. Khi gọi phương thức fun[] bằng cách sử dụng đối tượng Kiểm tra sẽ gây ra sự phức tạp chẳng hạn như nên gọi phương thức fun[] của Parent1 hay fun[] của Parent2. Do đó, để tránh những phức tạp như vậy, Java không hỗ trợ nhiều lớp kế thừa
Đa kế thừa không được hỗ trợ bởi Java khi sử dụng các lớp, việc xử lý sự phức tạp gây ra do đa kế thừa là rất phức tạp. Nó tạo ra các vấn đề trong các hoạt động khác nhau như truyền, xây dựng chuỗi, v.v. và lý do trên là có rất ít tình huống mà chúng ta thực sự cần nhiều kế thừa, vì vậy tốt hơn là bỏ qua nó để giữ cho mọi thứ đơn giản và dễ hiểu.
Các vấn đề trên được xử lý như thế nào đối với Phương thức và Giao diện Mặc định? . Và một lớp có thể triển khai hai hoặc nhiều giao diện. Trong trường hợp cả hai giao diện được triển khai đều chứa các phương thức mặc định có cùng chữ ký phương thức, thì lớp triển khai phải chỉ định rõ ràng phương thức mặc định nào sẽ được sử dụng trong một số phương thức ngoại trừ main[] của lớp triển khai sử dụng từ khóa super hoặc nó sẽ ghi đè lên phương thức mặc định .
Java 8 supports default methods where interfaces can provide a default implementation of methods. And a class can implement two or more interfaces. In case both the implemented interfaces contain default methods with the same method signature, the implementing class should explicitly specify which default method is to be used in some method excluding the main[] of implementing class using super keyword, or it should override the default method in the implementing class, or it should specify which default method is to be used in the default overridden method of the implementing class.
ví dụ 3
Java
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI260
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI261
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI262
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI263
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI264
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI266
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI268
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI25
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI270
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI272
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI273
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI274
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI273
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI276
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI273
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI200
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI279
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI202
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI284
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI263
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI286
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI266
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI268
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI25
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI270
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI272
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI273
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI274
_______073____098
________ 073 ________ 100 ________ 1001 ________ 102
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2006
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2007
________ 00 ________ 1009 ________ 1010 ________ 1011
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____1013
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2014
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2015
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____2363
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI25
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI270
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI272
_______073____1023
_______073____1025
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI273
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2027
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2028
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2029
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2030
_______073____1023
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI273
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2034
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI273
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2036
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2028
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2029
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2030
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2014
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2044
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2014
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2363
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI25
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2048
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI273
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2027
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2028
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2029
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2030
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI22
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2014
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2058
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2014
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2363
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI25
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2062
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI273
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2036
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2028
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2029
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2030
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
_______07____1071
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27____2363
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2364
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI25
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2076
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI272
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI273
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2080
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI273
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2082____2371
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2084
_______073____1086
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2087
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI200
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2089
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI202
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2087
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2092
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2087
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2094
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI27
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI204
Đầu ra
Default PI1 Default PI2 Now Executing showOfPI1[] showOfPI2[] Default PI1 Default PI2
Ghi chú. Nếu chúng tôi loại bỏ việc triển khai phương thức mặc định khỏi “TestClass”, chúng tôi sẽ gặp lỗi trình biên dịch. Nếu có một viên kim cương thông qua các giao diện, thì sẽ không có vấn đề gì nếu không có giao diện ở giữa nào cung cấp triển khai giao diện gốc. Nếu họ cung cấp triển khai, thì có thể truy cập triển khai như trên bằng siêu từ khóa
Tại sao đa kế thừa được hỗ trợ trong Python?
Kế thừa là cơ chế để đạt được khả năng sử dụng lại mã vì một lớp [lớp con] có thể lấy thuộc tính của lớp khác [lớp cha] . Nó cũng cung cấp tính bắc cầu tức là. nếu lớp C kế thừa từ P thì tất cả các lớp con của C cũng kế thừa từ P.Tại sao tránh đa kế thừa trong Java?
Trong trường hợp có nhiều giao diện có cùng một phương thức mặc định . Trong lớp cụ thể triển khai cả hai giao diện, bạn có thể triển khai phương thức chung và gọi cả hai siêu phương thức. do đó, bạn có thể đạt được nhiều kế thừa trong Java bằng các giao diện.Tại sao đa kế thừa không được hỗ trợ trong Java nhưng trong giao diện?
Như chúng tôi đã giải thích trong chương thừa kế, tính đa thừa kế không được hỗ trợ trong trường hợp lớp do tính không rõ ràng . Tuy nhiên, nó được hỗ trợ trong trường hợp giao diện vì không có sự mơ hồ. Đó là bởi vì việc triển khai của nó được cung cấp bởi lớp triển khai.