Chắc hẳn bạn nghe nói về Java nhiều hơn C#, vì có rất nhiều ứng dụng, phần mềm mang thương hiệu này. Game Java thường được nhắc đến nhiều, đặc biệt trong thời kỳ chưa xuất hiện các hệ điều hành thông minh. Còn C#, nó được biết đến là một ngôn ngữ lập trình phổ biến, thường chỉ được hiểu bởi cộng đồng lập trình viên.
Khác với C#, Java không chỉ là một ngôn ngữ lập trình. Java được chia thành nhiều dạng, cho phép chơi game trực tuyến, chạy các ứng dụng và hỗ trợ nhiều vấn đề trên máy tính. Việc cài đặt Java trên máy tính là cần thiết và dễ dàng. Hãy tự cài đặt Java và tham khảo thêm về nó trên Mytour để hiểu rõ hơn. Trong bài viết này, chúng ta sẽ tập trung vào sự khác biệt giữa 2 ngôn ngữ lập trình này.
So sánh giữa Java và C#.
Các kiểu dữ liệu
Trong Java, các kiểu dữ liệu nguyên thủy vi phạm nguyên tắc OOP vì chúng không kế thừa từ lớp Object như các đối tượng khác. Điều này làm cho xử lý trở nên phức tạp. Ngược lại, trong C#, các kiểu int là bí danh của Int32, giúp tránh được vấn đề trên.
Khai báo
Việc khai báo tương đối tương đồng.
Cả hai sử dụng final static = const hoặc read only trong C#: Hằng số sẽ được biên dịch trước khi gọi, giúp tăng hiệu suất.
Các cấu trúc điều khiển
Cả Java và C# đều cung cấp đầy đủ if/then/else và switch. Tuy nhiên, trong Java, không cần sử dụng break trong mỗi case của switch, trong khi đối với C#, điều này là bắt buộc.
Các vòng lặp
Cung cấp đầy đủ while/do while /for và thêm foreach, chỉ áp dụng cho các đối tượng trong mảng list.
So sánh cú pháp của C# và Java
Các kiểu nguyên gốc (primitive) và kiểu đơn giản (simple)
Java có một số kiểu primitive như: byte, char, int, long, float, double. Đây là các khối cơ bản của Java, khác với C#, các đối tượng trong Java kế thừa từ java.lang.Object, nhưng kiểu primitive không thể. Điều này đồng nghĩa rằng các lớp khi tính toán trên các đối tượng không làm việc với các kiểu primitive, chúng cần được ánh xạ thành mô hình đối tượng để sử dụng.
Trong C#, điều này không bao giờ xảy ra. C# sử dụng hệ thống kiểu đối tượng trong .NET, nơi mà các chương trình C# có thể giao tiếp với nhiều ngôn ngữ khác trong .NET mà không gặp rắc rối nào. Do đó, các kiểu primitive hoặc kiểu đơn giản trong hàm C# cũng giống như bất kỳ đối tượng nào khác.
Khai báo (declarations)
Các biến được định nghĩa trong C# cũng tương tự như trong Java
Java sử dụng từ khóa “static final” để tạo biến hằng; trong Java, một biến “static final” là biến lớp chứ không phải biến đối tượng, và trình biên dịch sẽ ngăn bất kỳ đối tượng nào khác thay đổi giá trị của biến. Trái ngược với điều này, C# có hai cách để công bố một biến hằng. Điều này làm cho chương trình đã biên dịch chạy nhanh hơn vì không cần tìm kiếm giá trị của hằng trong suốt thời gian chạy.
Hằng thường được áp dụng cho BUFFERSIZE hoặc TIMEOUT mà không gây sự chuyển đổi trong mã nguồn. Nếu một trường được đánh dấu là const, mọi mã nguồn được biên dịch một lần nữa sẽ không thể chuyển đổi và sẽ cần được biên dịch lại theo quy định. Ngược lại, nếu một hằng được đánh dấu là readonly, khi ứng dụng được thực thi, trạng thái có thể thay đổi và mã nguồn kiểm tra giá trị của trường readonly trong khi trình biên dịch vẫn bảo vệ nó.
Cấu trúc điều kiện (Conditionals structure)
Có hai cấu trúc điều kiện là “if–then–else” và “switch”, cả hai đều có sẵn trong C# và Java. Tuy nhiên, cú pháp “switch” có một số khác biệt.
Java yêu cầu các dòng điều khiển phải chính xác rơi vào các trường hợp khác nhau của phát biểu switch, trong khi trình biên dịch C# tuyệt đối không cho phép điều này.
Skips (Nhảy)
Hầu hết các cú nhảy trong Java đều có tương đương trong C#: continue, break, goto, return. Những cú nhảy này được sử dụng giống như cách chúng ta sử dụng trong Java: thoát khỏi vòng lặp hoặc trả lại điều khiển cho một khối lệnh khác.
Các phương thức (methods)
Ở cấp độ cơ bản, Java và C# tương đồng, mỗi phương thức đều chứa tham số và có kiểu trả về. Tuy nhiên, C# có một số phương thức không có sẵn trong Java như Params, ref và out.
Các thuộc tính (properties)
Thuộc tính là một tính năng quan trọng của C#, thường sử dụng mô hình getter/setter, tương đương với Java. Java thực hiện điều này với một phương thức set và một phương thức get.
Dễ dàng sử dụng trong chương trình C#
int giatriHienTai = ThuocTinh;
ThuocTinh = GiaTriMoi;
Ở phía sau, C# biên dịch thuộc tính thành hai phương thức trong ngôn ngữ trung gian của .NET (Intermediate Language) có tên là get_ThuocTinh và set_ThuocTinh. Các phương thức này không thể gọi trực tiếp từ C#, nhưng ngôn ngữ khác sử dụng MSIL có thể truy cập các getter/setter này.
Quản lý quyền truy cập (Accessbility Modifiers)
Access modifier hạn chế phạm vi biên đổi một phần của mã nguồn. Có năm từ chỉnh truy cập trong C#:
public – tương tự như trong Java. Bạn có thể truy cập tự do đến thành viên bên trong đối tượng.
protected – cũng như trong Java. Chỉ có các lớp kế thừa từ lớp này mới có thể truy cập.
internal – khá mới với lập trình viên Java. Tất cả đối tượng được định nghĩa trong một file .cs có một phạm vi truy cập cho thành viên bên trong.
protected internal – sự kết hợp giữa protected và internal. Có thể truy cập từ assembly hoặc từ các đối tượng kế thừa.
private – giống như trong Java. Không ai có thể truy cập vào lớp ngoại trừ từ bên trong lớp
Các từ chỉnh này có thể áp dụng cho cấu trúc giống như Java. Bạn có thể điều chỉnh quyền truy cập đối với đối tượng, phương thức và biến. Chúng ta sẽ thảo luận về chúng ở đây và bàn luận về đối tượng và kế thừa ở phần tiếp theo.
Đối tượng, Lớp và Cấu trúc
Tất cả những người lập trình Java đều quen với khái niệm về lớp, đối tượng và kế thừa. Học về những phần tương tự trong C# chỉ là nói về sự khác biệt về ngữ nghĩa.
Mọi lớp đều được truyền bằng tham số vào các phương thức gọi. Điều này có nghĩa là biến thực sự là một tham số truyền vào vùng nhớ chứa đối tượng. Trong Java, mọi thứ, ngoại trừ kiểu nguyên gốc, đều được truyền bằng tham số - không có cách nào để xác định mọi thứ để có thể truyền bằng tham trị.
This và base
Trong C#, đối tượng có thể tự tham chiếu đến chính nó, tương tự như Java. Từ khóa 'this' mang ý nghĩa giống nhau, nhưng C# sử dụng 'base' thay vì 'super' như trong Java. Cả 'this' và 'base' có thể sử dụng trong phương thức và constructor, tương tự như 'this' và 'super' trong Java.
Ép kiểu
Trái ngược với Java, C# cho phép định nghĩa chuyển đổi kiểu tùy chỉnh giữa hai đối tượng bất kỳ. Hai loại chuyển đổi là:
Chuyển đổi tương đối: Yêu cầu kiểu đích được xác định trong phát biểu, và không đảm bảo hoạt động hoặc nếu hoạt động, kết quả có thể mất thông tin. Lập trình viên Java thường quen với chuyển đổi tuyệt đối khi ép một đối tượng thành một đối tượng của các lớp con của nó.
Chuyển đổi tuyệt đối: Không yêu cầu kiểu cha và đảm bảo hoạt động.
Tải chồng toán tử (Operator overloading)
Tải chồng toán tử trong C# rất đơn giản. Lớp FlooredDouble ở trên có thể được thừa kế để chứa một phương thức static
Cấu trúc Mã nguồn
Trong C#, không có yêu cầu cụ thể về cách tổ chức file. Bạn có thể sắp xếp toàn bộ mã nguồn C# trong một file .cs (trong khi Java thường yêu cầu một file .java chứa một lớp).
C# cung cấp cách để phân chia các thành phần của chương trình, tương tự như việc sử dụng các khối trong Java. Bằng cách sử dụng namespace, các kiểu có quan hệ có thể được nhóm vào cấp độ cao hơn.
Tổng kết
Trong bài viết này, chúng ta không đề cập đến toàn bộ cú pháp của C#, nhưng tập trung vào các phát biểu quen thuộc và tương đương trong Java.
Hy vọng bài viết này sẽ hữu ích cho bạn hiểu sâu hơn về C# và Java, đặc biệt là những người mới bắt đầu học lập trình. Trên máy tính, Java cũng cung cấp cách để mở rộng bộ nhớ. Nếu bạn quan tâm, hãy tham khảo cách tăng dung lượng bộ nhớ và tuân theo hướng dẫn.