Lập trình hướng đối tượng - Sự giống và khác nhau giữa C++, C# và Java
Giống nhau:
_Cả 3 ngôn ngữ lập trình đều dùng 2 kí hiệu để chú thích :
+ // dùng để chú thích theo dòng.
+ /* dùng để chú thích theo khối */.
_Chú thích theo dòng bắt đầu từ cặp dấu sổ (//) cho đến dòng cuối cùng.Chú
thích theo khối bắt đầu bằng /* và kết thúc bằng */ và có thể bao gồm nhiều
dòng.
có nghĩa là bất kỳ một lớp nào khi tính toán trên các đối tượng (ví dụ như các đối tượng trong Tập hợp API) sẽ không làm việc với các kiểu primitive. Các kiểu primitive sẽ phải được ánh xạ (map) thành mô hình đối tượng theo quy định để có thể sử dụng chúng. +Giao diện (interface) là một lớp thuần trừu tượng được tạo ra cho phép cài đặt đa thừa kế Java. Việc truy xất vào vùng nhớ heap chậm hơn truy xất vào vùng nhớ stack tuy nhiên java có cơ chế cho phép truy cập vào vùng nhớ heap với tốc độ xấp xỉ bằng tốc độ truy cập vào vùng nhớ stack. _Trong C++ : các class và struct hầu như đều giống nhau. Mảng chính trong C++ là con trỏ (pointer). Kiểu boolean trong C++ thực chất là một kiểu integer. Trong C++ kiểu int là 16bit và kiểu long là 32 bit. IV)Đổi kiểu : 1)Giống nhau : những đối tượng có kiểu dữ liệu này có thể chuyển đổi thành thông qua một cơ chế chuyển đổi tường minh hay ngầm định. Chuyển đổi ngầm định được hệ thống thực hiện một cách tự động, trình biên dịch sẽ thực hiện công việc này. Còn chuyển đổi tường minh diễn ra khi chúng ta gán ép một giá trị dữ liệu cho kiểu dữ liệu khác. _Chuyển đổi ngầm định : VD { short x=10 ; int y=x ; //chuyển đổi ngầm định. } { short a=10 ; int y=100 ; a=y ;//báo lỗi } _Ngoài ra ta còn có thể sử dụng các toán tử để chuyển kiểu : 2)Khác nhau : _Trong C++ : việc đổi kiểu được thực hiện 1 cách ngầm định.Khi ta định nghĩa kiểu dữ liệu và khi xuất ra thì chương trình sẽ tự động nhận dạng kiễu dữ liệu ta vừa nhập rồi xuất ra.Cách xuất ra hoàn toàn khác C và C#.VD : { int a ; char b ; cin>>a ; cin>>b ; cout<<a<<b ;//In ra 2 giá trị a,b vừa nhập. } _Trong C# : cho phép khả năng định nghĩa chuyển đổi kiểu tự tạo cho hai đối tượng bất kỳ. Hai kiểu chuyển đổi là: chuyển đổi tương đối và chuyển đổi tuyệt đối. _Trong Java : thường chỉ thân thuộc với việc chuyển kiểu giữa các kiểu primitive và khi ép kiểu lên cao hơn cho siêu lớp và thấp hơn cho các lớp con. V)Không gian tên: _Trong C# nhằm tránh xung đột giữa việc sử dụng các thư viện khác nhau từ các nhà cung cấp .Ngoài ra không gian tên được xem như là tập hợp các đối tượng và cung cấp duy nhất các định danh cho các kiểu dữ liệu và được đặt trong một cấu trúc phân cấp.Công thức : using .VD: namespace MyLib { using System; public class Tester { public static int Main() { for (int i =0; i < 10; i++) { Console.WriteLine( “i: {0}”, i); } return 0; } } } _Trong Java và C++ không hỗ trợ không gian tên như C#. VI)Quản lý và cấp phát vùng nhớ: 1)Giống nhau: Phần lớn các bộ nhớ đều sử dụng cho các biến mảng và các đối tượng khác mà chúng ta khai báo. Kích cỡ của chúng là cố định và không thay đổi trong thời gian chạy chương trình.Nhưng trong trường hợp cần bộ nhớ lớn thì ta vẫn phải thực hiện các thao tác khai báo. 2)Khác nhau: _Trong C++ : sử dụng bộ nhớ động. C++ đã tích hợp 2 toán tử new và delete để thực hiện việc này. +Toán tử new : dùng để cấp phát vùng nhớ.VD: { int* i; i=new int [5]; }//Cấp phát một vùng nhớ cho mảng. { int* i; i=new int; }//Cấp phát một vùng nhớ cho con trỏ. +Toán tử delete : bộ nhớ động chỉ cần thiết trong 1 khoảng thời gian nên sau khi sử dụng ta phải giải phóng vùng nhớ đã cấp phát.Trong C++ không tự động giải phóng mà ta phải tự sử dụng toán tử.VD: delete i; _Trong Java : Do Java không sử dụng con trỏ và các phép toán con trỏ.Java chỉ kiểm tra thông tin tất cả các truy nhập đến mảng, chuổi khi thực thi để đảm bảo.Các lập trình viên không phải bận tâm đến việc cấp phát bộ nhớ . Quá trình cấp phát, giải phóng được thực hiện tự động nhờ dịch vụ thu nhặt những đối tượng không sử dụng nữa ( garbage collector). _Trong C# : quản lý và cấp phát bộ nhớ hoàn toàn giống trong Java đều sử dụng bộ gom rác ( garbage collector). VII)Hàm trùng tên : 1)Giống nhau : đây là trường hợp có 2 hàm hoặc nhiều hơn trùng tên với nhau nhưng lại khác nhau về kiểu dữ liệu hay số khai báo. _Trong C++ : hàm trùng tên còn gọi là chồng hàm (quá tải).Nghĩa là hai hàm có thể cùng tên nếu số khai báo của chúng khác nhau.Vì vậy ta có thể đặt cùng một tên cho nhiều hàm nếu chúng có tham số khác nhau hay kiểu dữ liệu của các tham số khác nhau.VD : // overloaded function #include int divide (int a, int b) { return (a/b); } float divide (float a, float b) { return (a/b); } int main () { int x=5,y=2; float n=5.0,m=2.0; cout << divide (x,y); cout << "\n"; cout << divide (n,m); return 0; } _Trong Java : do sử dụng chung cái tên cho nhiều phương thức nên ta phải cho Java biết cần phải gọi phương thức nào để thực hiện, Java dựa vào sự khác nhau về số lượng đối cũng như kiểu dữ liệu của các đối này để phân biệt các phương thức trùng tên.VD : public class OverloadingOrder { static void print(String s, int i) { System.out.println("String: " + s +", int: " + i); } static void print(int i, String s) { System.out.println("int: " + i +", String: " + s); } public static void main(String[] args) { print("String first", 11); print(99, "Int first"); } } 2)Khác nhau : _Trong Java : sẽ thông báo lỗi nếu không tìm thấy hàm tải thích hợp, không thể trả về của hàm để phân biệt sự khác nhau giữa 2 phương thức bội tải. Mất một khoảng thời gian để tìm ra hàm thích hợp, nhiều lúc có thể dẩn đến sai sót. Do không thể định nghĩa toán tử được như trong C++ và đây cũng là một khuyết điểm của Java nhưng nhiều người xem điều này là không cần thiết. _Trong C# : không có chồng hàm mà chỉ có chồng toán tử. Nạp chồng toán tử có thể làm cho mã nguồn trực quan và những hành động của lớp khi xây dựng giống như các lớp được xây dựng sẵn. Tuy nhiên, việc nạp chồng toán tử cũng có thể làm cho mã nguồn phức tạp một cách khó quản lý nếu phá vỡ cách thể hiện thông thường để sử dụng những toán tử. Hạn chế việc sử dụng tùy tiện các nạp chồng toán tử bằng những cách sử dụng mới và những cách đặc trưng. VIII)Nhập xuất : 1)Giống nhau : _Chỉ có cách nhập xuất bằng Console của Java và C# rất giống nhau đều là sử dụng các luồng Stream để nhập xuất (I/O với file). _Về cách nhập xuất thông thường thì Java và C++ tương đối giống nhau (I/O bằng màn phím và màn hình). 2)Khác nhau : _Trong Java : đưa ra mọi lớp luồng để xử lý mọi kiểu dữ liệu. Java chia luồng thành 2 loại : luồng Byte ( By Stream) và luồng ký tự ( Character Stream ). Lớp InputStream và OutputStream là cơ sở cho mọi hướng nhập xuất hướng byte, lớp reader/writer là cơ sở cho việc đọc ghi hướng kí tự.Lớp RandomAccessFile kế thừa từ lớp Object và triển khai giao diện, Inputstream và Outputstream, đây là lớp duy nhất hỗ trợ đọc và ghi.Có thể nhập xuất 4 loại dữ liệu cơ bản sau : text ( tức là I/O dưới dạng đọc ghi các ký tự), byte ( đọc theo từng byte), primitive data ( kiểu dữ liệu nguyên thủy như int,long,float), Object ( các loại đối tượng ). + VD kiểu I/O dạng text : package Basic; import java.io.*; public class passSample { public static void main(String args[]) throws IOExcepti on { InputStreamReader isReader = new InputStreamReader( System.in); BufferedReader br = new BufferedReader(isReader); FileWriter myFile = new FileWriter("E:/test.txt"); BufferedWriter bw = new BufferedWriter(myFile); System.out.println("Nhap vao, go~ 010 de ket thuc." ); String str = new String(); while( !(str = br.readLine()).equalsIgnoreCase("010 ") ) { bw.write(str); bw.newLine(); } bw.flush(); myFile.close(); } } +VD kiểu I/O dùng InputStreamReader : import java.io.*; public class thidu { public static void main(String args[]) throws Exception { BufferedReader in = new BufferedReader(new InputStr eamReader(System.in)); System.out.println("Nhập chuỗi :") ; String VD; VD = in.readLine(); System.out.println("Chuỗi vừa nhập là : " +VD); } } _Trong C# : sử dụng Console, ứng dụng này giao tiếp với người dùng thông qua bàn phím và không có giao diện người dùng ( UI ). Trong hai ứng dụng đơn giản trên ta đã dùng phương thức WriteLine() của lớp Console.Ngoài ra còn sử dụng các luồng để nhập xuất.Có nhiều lớp thừa kế từ lớp Stream như FileSteam, MemoryStream, và NetworkStream.Có thể nhập xuất các dạng tập tin như text, binary, file.Lớp Stream có nhiều phương thức nhưng quan trọng nhất là 5 phương thức Read(), Write(), BeginRead(), BeginWrite(), Flush().Ngoài ra trong C# còn có nhập xuất đồng bộ và nhập xuất không đồng bộ. +VD cài đặt việc đọc và ghi tập tin nhị phân : using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace StreamReadWrite { class Program { static void Main(string[] args) { // Get the directories currently on the C drive. DirectoryInfo[] cDirs = new DirectoryInfo(@"c:\").GetDirectories(); // Write each directory name to a file. using (StreamWriter sw = new StreamWriter("CDriveDirs.txt")) { foreach (DirectoryInfo dir in cDirs) { sw.WriteLine(dir.Name); } } // Read and show each line from the file. string line = ""; using (StreamReader sr = new StreamReader("CDriveDirs.txt")) { while ((line = sr.ReadLine()) != null) { Console.WriteLine(line); } } } } } +VD ứng dụng Console : using System; class ChaoMung { static void Main() { //Xuat ra man hinh chuoi thong bao Console.WriteLine(“Chao Mung”); } } _Trong C++ : sử dụng 2 toán tử cin/cout để thao tác nhập/xuất. Cin chỉ bắt đầu xử lý dữ liệu từ bàn phím sau khi phím Enter được gõ.Vì vậy dù chỉ nhập một ký tự thì Cin vẫn chờ cho đến khi gõ phím Enter để kết thúc.Trong Cout toán tử << được gọi là toán tử chèn vì nó chèn dữ liệu đi vào sau nó vào dòng dữ liệu đứng trước . +VD : {int a;cin >>a;cout <<a;}
File đính kèm:
- Lập trình hướng đối tượng - Sự giống và khác nhau giữa C++, C# và Java.pdf