Search…

Những Điểm Khác Nhau về OOP của C++ và Java

10/11/20205 min read
So sánh sự khác nhau giữa trong lập trình hướng đối tượng của C++ và Java.

Giới thiệu

Những ai có kinh nghiệm lâu năm với C++ và Java sẽ nhận thấy được nhiều sự khác biệt trong tư tưởng thiết kế lẫn tính năng của lập trình hướng đối tượng (OOP) trong C++ và Java. OOP trong Java có khá nhiều điều hay và mới mẻ như Java là ngôn ngữ thuần hướng đối tượng, không hỗ trợ đa kế thừa, thiết kế thêm tư tưởng interface.

OOP của C++ so với OOP của Java

1 cách tốt để học ngôn ngữ lập trình là khi học ngôn ngữ mới có thể so sánh với các ngôn ngữ đã biết trước đó, các ngôn ngữ này giống nhau ở điểm nào, các điểm ưu và nhược của ngôn ngữ khi cung giải quyết 1 vấn đề vì các ngôn ngữ ra đời sẽ hướng đến việc giải quyết các vấn đề khác nhau.

C++ và Java cũng vậy, có nhiều điều có thể học hỏi từ sự khác biệt giữa chúng:

Đặc điểm C++ Java
Ngôn ngữ thuần OOP Không phải là ngôn ngữ thuần OOP, được phát triển từ C với tên là C++ hay được gọi là "C with class". Java là ngôn ngữ thuần OOP, bất ky thành phần nào cũng thuộc về lớp, nằm trong class.
Phạm vi truy xuất của thành viên C++ có 3 phạm vi truy xuất của thuộc tính và phương thức: private, protected, public. Java mở rộng hơn C++ có 4 phạm vi truy cập: private, default, protected, public.
Nạp chồng toán tử C++ cho phép nạp chồng các toán tử như toán tử vào ra << >> + * / hay -= += /= */, ... Java không cho phép nạp chồng toán tử, chỉ có toán tử + cho phép nối hai chuỗi.
Hỗ trợ đa kế thừa C++ hỗ trợ đa kế thừa, 1 class có thể kế thừa nhiều class. Java không cho phép đa kế thừa từ nhiều class, mà chỉ kế thừa 1 class.
Hỗ trợ interface C++ không tồn tại khái niệm interface. Java hỗ trợ interface để kiểm soát các ràng buộc về ứng xử của class.
class vô sinh (class lá) C++ không có class vô sinh, nghĩa là lớp dẫn xuất được tạo ra thì các lớp con có thể kế thừa. Java có lớp vô sinh khi đánh dấu final cho class, khi đó không có class nào có thể kế thừa.
Hàm bạn, class bạn C++ có hỗ trợ hàm bạn, class bạn. Java không hỗ trợ hàm bạn, class bạn.
class cha của mọi class 1 class trong C++ được tạo ra và chưa kế thừa từ class nào thì nó không có class cha. Mặc định trong Java khi 1 class được tạo ra thì class cha của nó là class Object.
Tổ chức trong class

C++ có thể gom nhóm những thuộc tính hay phương thức có cùng phạm vi truy cập với nhau.

public:
int a;
int b;

C++ khai báo các prototype trong file .h và định nghĩa trong file .cpp.

Trước mỗi phương thức hay thuộc tính phải chỉ định phạm vi truy cập. Nếu không chỉ định thì Java hiểu đó là default.

Java khai báo và định nghĩa method trong 1 file .java

Phạm vi truy cập mặc định Trong C++ nếu không chỉ rõ phạm vi truy cập, mặc định là private. Trong Java nếu không chỉ rõ thì mặc định thuộc tính hay phương thức có phạm vi truy cập là default.
Phạm vi truy cập protected Phạm vi truy cập là protected trong C++ chỉ truy cập được ở trong class định nghĩa và ở class con. Phạm vi truy cập protected trong Java được truy cập ở Java là trong class định nghĩa, trong cùng package và class con trong cùng package.
Gọi lại phương thức của class cha C++ sử dụng cú pháp <class_name>::method(). Java sử dụng từ khóa super với cú pháp super.method()
Gọi lại constructor của class C++ không cho phép gọi lại contructor khác trong 1 contructor khác của lớp. Java cho phép gọi lại contructor của lớp trong 1 contructor khác với cú pháp this(parameter)
Kiểu kế thừa Trong C++ có các kiểu kế thừa lớp là: private, protected, public. Trong Java chỉ có kiểu kế thừa là public.
Phương thức vô sinh Trong C++ không tồn tại phương thức vô sinh, có thể override lại ở class con. Trong Java nếu phương thức được đánh dấu là final thì ở class con không thể override lại được.
Phương thức thuần túy ảo C++ có khái niệm phương thức thuần túy ảo. Với cú pháp: return type name_method() = 0. Java không có khái niệm phương thức thuần túy ảo.
 class ảo C++ nhận biết class ảo khi class đó có các phương thức đánh dấu với từ khóa virtual hoặc phương thức thuần ảo. Java nhận biết lớp ảo khi khai báo lớp có từ khóa abtract và có những phương thức được đánh dấu là abstract.
Phương thức ảo Phương thức ảo trong C++ được đánh dấu bởi từ khóa virtual và có định nghĩa bên trong thân hàm. Phương thức ảo trong Java được đánh dấu bởi từ khóa abstract, những phương thức này không có định nghĩa thân hàm, kết thúc bằng dấu ;.
Tổ chức class như thư mục Trong C++ nhắc đến namespace để định nghĩa các class trong này. Java định nghĩa các class trong các package.
Lập trình đồng bộ C++ không hỗ trợ lập trình đồng bộ cho class. Java hỗ trợ lập trình đồng bộ với từ khóa synchronized.
Hàm main Hàm main của C++ không thuộc về lớp nào, là 1 hàm cục bộ. Hàm main trong Java cũng nằm trong 1 class vì Java là ngôn ngữ thuần OOP.
Destructor C++ có destructor, lập trình viên phải chủ động thu dọn vùng nhớ đã cấp phát. Java không có khái niệm destructor mà có bộ thu gom rác gọi là GC (garbage collection), khi 1 đối tượng không còn tham chiếu nữa thì bộ thu gom rác sẽ tiến hành thu hồi.
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024