Vì sao lỗi không hỗ trợ ứng dụng java năm 2024

Có rất nhiều ngôn ngữ lập trình hướng đối tượng phổ biến được sử dụng hiện nay, bao gồm Java, C++, JavaScript, Python, PHP, Ruby và Perl. Mặc dù kế thừa là một khái niệm phổ biến trong số các ngôn ngữ OOP này, nhưng không phải tất cả các kiểu kế thừa đều tồn tại trong mỗi ngôn ngữ này. Điều cực kỳ quan trọng là phải biết các kiểu kế thừa phổ biến và các hạn chế về kế thừa trong ngôn ngữ cụ thể mà bạn đang sử dụng. Bạn càng biết nhiều về kế thừa, bạn sẽ càng trở thành nhà phát triển hiệu quả hơn. Các kiểu kế thừa được Java hỗ trợ bao gồm:

  • Kế thừa một cấp : Khi một lớp con kế thừa các tính năng từ một lớp cha duy nhất.
  • Kế thừa đa cấp : Đây là hình thức kế thừa đa cấp một cấp. Trong kế thừa đa cấp, một lớp con cũng có thể đóng vai trò là lớp cha của các lớp con khác. Mối quan hệ giữa mỗi cấp độ là tuyến tính - không có nhánh nào cao hơn so với đa kế thừa. Trong trường hợp này, lớp con cuối cùng có chức năng từ tất cả các cấp độ trên.
  • Kế thừa phân cấp : Ngược lại với đa kế thừa. Trong kế thừa phân cấp, một lớp cha có nhiều hơn một lớp con. Vì vậy, thay vì có các nhánh phía trên, nó lại phân nhánh ở phía dưới.
  • Kế thừa lai : Đúng như tên gọi, kế thừa lai là sự kết hợp của các kiểu thừa kế khác.

Ngoài các kiểu kế thừa được liệt kê ở trên, còn có các kiểu khác mà Java không hỗ trợ.

  • Đa kế thừa : Trong đa kế thừa, một lớp con có nhiều hơn một lớp cha. Mặc dù Java và JavaScript không hỗ trợ đa kế thừa nhưng các ngôn ngữ OOP như C++ thì có.
  • Kế thừa đa đường dẫn : Là sự kết hợp của kế thừa đa cấp, đa cấp và phân cấp, trong kế thừa đa đường dẫn, một lớp con kế thừa các đặc điểm và chức năng của nó từ lớp cha và một số lớp con của lớp cha. Vì kế thừa đa đường dựa trên đa kế thừa nên Java không hỗ trợ việc sử dụng nó.

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

Vấn đề chính với đa kế thừa là nó có thể tạo ra sự mơ hồ trong các lớp con. Trong sách trắng năm 1995, nhà thiết kế Java chính James Gosling đã tuyên bố rằng các vấn đề về đa kế thừa là một trong những lý do khiến Java được tạo ra. Sự phức tạp vốn có của đa kế thừa được thấy rõ nhất trong bài toán kim cương. Trong bài toán kim cương, lớp cha A có hai lớp con B và C riêng biệt; nghĩa là, các lớp con B và C mở rộng lớp A.

Vì sao lỗi không hỗ trợ ứng dụng java năm 2024
Bây giờ chúng ta tạo một lớp con D mới mở rộng cả lớp B và lớp C. Lưu ý rằng chúng ta có nhiều kế thừa (D mở rộng B và C), kế thừa phân cấp ( B và C mở rộng A) và kế thừa đa cấp (D mở rộng A, B và C). Trong bài toán kim cương, lớp con B và C kế thừa một phương thức từ lớp cha A. Cả B và C đều ghi đè phương thức được kế thừa. Nhưng các phương pháp mới ở B và C mâu thuẫn với nhau. Lớp con cuối cùng D kế thừa hai phương thức độc lập và xung đột từ nhiều cha mẹ B và C của nó. Không rõ nên sử dụng phương thức nào của lớp D, do đó nảy sinh sự mơ hồ. Các ngôn ngữ lập trình OOP khác triển khai các phương pháp khác nhau để giải quyết sự mơ hồ của đa kế thừa.

Cách giải quyết vấn đề đa kế thừa trong Java

Việc đa kế thừa có vấn đề không có nghĩa là nó vô dụng. Có nhiều tình huống mà bạn có thể muốn một lớp có chức năng từ một số lớp khác. Hãy nghĩ về chiếc Tesla Roadster mà bạn sẽ mua khi trở thành một nhà phát triển phần mềm cực kỳ thành công. Đặc tính kỹ thuật của nó dựa trên cả hạng xe thể thao và hạng xe điện. Một ví dụ khác: trình duyệt mà bạn đang đọc bài viết này. Nó có các tính năng từ lớp giải pháp bảo mật Internet và từ lớp trình duyệt Internet nói chung. Nhưng bạn không thể mở rộng nhiều lớp trong Java. Vậy ngôn ngữ này giải quyết vấn đề đa kế thừa như thế nào? Java sử dụng các cấu trúc được gọi là giao diện. Giao diện là các kiểu trừu tượng xác định hành vi sẽ được các lớp thực hiện. Bởi vì chúng trừu tượng nên các giao diện không chứa các hướng dẫn chi tiết về hành vi của chúng. Thay vào đó, các lớp cung cấp các triển khai cụ thể về hành vi giao diện. Giao diện có một số đặc điểm xác định:

  • Không giống như các lớp, bạn không khởi tạo giao diện. Thay vào đó, các lớp thực hiện các giao diện.
  • Các giao diện chỉ chứa các định nghĩa hằng số công khai và các tiêu đề phương thức.
  • Giao diện chỉ có thể mở rộng các giao diện khác, không phải các lớp.
  • Giao diện có thể mở rộng nhiều giao diện và các lớp có thể triển khai nhiều giao diện.

Bây giờ chúng ta có thể giải quyết vấn đề kim cương một cách hiệu quả bằng cách sử dụng các giao diện. Hãy nhớ rằng chỉ các giao diện mới có thể mở rộng các giao diện khác và bất kỳ lớp nào yêu cầu nhiều đặc điểm kế thừa đều phải triển khai nhiều giao diện, chúng ta có thể ghi đè các lớp có vấn đề kim cương. Những gì từng là lớp A, B và C giờ trở thành giao diện A, B và C. Giao diện B và C vẫn mở rộng giao diện A, nhưng không có giao diện nào trong số này có chức năng cụ thể, chỉ có các hành vi cụ thể. Lớp D vẫn là lớp chịu trách nhiệm triển khai cụ thể hành vi được tìm thấy trong giao diện B và C. Lưu ý một điểm khác biệt chính: lớp D không mở rộng giao diện B và C. Thay vào đó, nó triển khai chúng. Bằng cách này, bạn thực sự không có nhiều kế thừa. Thay vào đó, bạn chỉ cần trình bày lại vấn đề.

Phần kết luận

Hiểu tính kế thừa là điều cần thiết đối với bất kỳ nhà phát triển Java hiệu quả nào. Điều quan trọng không kém là phải biết những hạn chế của tính kế thừa và cách giải quyết có sẵn của Java đối với các vấn đề đa kế thừa truyền thống. Học cách tạo giao diện để tái tạo hiệu ứng của đa kế thừa trong Java sẽ cải thiện năng suất và cơ hội tuyển dụng của bạn.