Tại sao Java không hỗ trợ đa kế thừa?

Tại sao Java không hỗ trợ đa kế thừa? Đây là một trong những câu hỏi phỏng vấn khá khó khăn trong java.Nếu C++  có thể hỗ trợ đa kế thừa nhưng với Java tại sao không,đây là một câu hỏi tranh luận được đưa ra.

Java không hỗ trợ đa kế thừa

Gần đây một người bạn của tôi xuất hiện trong một cuộc phỏng vấn và sau một loạt các câu hỏi dễ dàng thì câu
cuối cùng được hỏi : “Tại sao Java không hỗ trợ đa kế thừa” , mặc dù người bạn của tôi đã có một ý tưởng rằng trong Java có thể hỗ trợ đa kế thừa bằng cách sử dụng  interface nhưng người phỏng vấn đã không đồng ý với ý kiến này, có lẽ anh bạn của tôi đã chưa đọc kỹ về kiến thức này. Vì vậy, sau khi phỏng vấn người bạn của tôi đến với tôi,tôi và anh ta vừa uống coffee vừa nói chuyện bình thường, anh ta nói với tôi về câu hỏi này và hỏi tôi câu trả lời. Vâng đây là câu hỏi rất cổ điển, và tôi quết định viết một bài blog để người bạn của tôi cũng như các bạn đọc có thể trả lời câu hỏi này.

Đầu tiên,để chắc chắn rằng java không hỗ trợ đa kế thừa thì đây là tuyên bố của James Gosling trong tháng 2 năm 1995 cho một ý tưởng về lý do tại sao đa kế thừa không được hỗ trợ trong Java:

 

 

“JAVA omits many rarely used, poorly understood, confusing features of C++ that in our experience bring more grief than benefit. This primarily consists of operator overloading (although it does have method overloading), multiple inheritance, and extensive automatic coercions.”

 

Tại sao Java không hỗ trợ đa kế thừa?

Sự mơ hồ hay còn gọi là “ambiguity around Diamond problem” ,các bạn hãy xem xét một class A có phương thức foo ()  và sau đó class B và C  kế thừa từ class A và có có phương thức foo () riêng của mỗi class.Vấn đề bây giờ là class class D kế thừa từ cả 2 class B và C vậy class D sẽ sử dụng phương thức foo() của class B hay C? Điều này được gọi là mơ hồ,hãy xem ví dụ mô hình dưới đây :

Mô hình giải thích tại sao Java không hỗ trợ đa kế thừa

 

Quả nhiên là class D không biết gọi phương thức foo() từ class B hay C.

Đến đây thì bạn đọc có thể hiểu được răng JAVA loại bỏ đa kế thừa rồi đúng không?

Kết Luận :

Trong C ++ chúng ta có thể giải quyết điều này bằng đa kế thừa, cung cấp dự khuyết để giải quyết. Trong JAVA thì  không bao giờ có thể xảy ra vì java không hỗ trợ đa kế thừa. Ở đây ngay cả  khi hai interface có cùng một phương thức, các class thực hiện  sẽ chỉ có một phương thức và sẽ được thực hiện bởi người lập trình.

Đây là lý do đa kế thừa nảy sinh nhiều vấn đề  mơ hồ hơn cả những vấn đề nó giải quyết được. Do đó mà Java cũng như các ngôn ngữ hiện đại ngày nay đều không có đa kế thừa như C++ hay Pascal.