Bài 2. Các kiểu dữ liệu trong ngôn ngữ lập trình Java được phân loại như thế nào?

Xin chào tất cả các bạn!
Kiểu dữ liệu có lẽ là một vấn đề mà mới nghe mọi người thường nói: “Cơ bản thôi mà, có gì đâu mà phải nói nhiều…”. Có lẽ vậy, đúng là cơ bản thật. Đọc thử bài viết này và xem mình đã thực sự nắm rõ nó chưa nhé!
Bài viết dựa trên kiến thức và kinh nghiệm cá nhân, hi vọng sẽ chia sẻ những gì có ích và thiết thật nhất đến tất cả các bạn. Mong nhận được nhiều comment và phản hồi từ các bạn để các bài viết sau sẽ tốt hơn nữa.
Let’s go! 
:P


Trong Java, các kiểu dữ liệu được chia thành 2 nhóm chính:
  1. Kiểu dữ liệu cơ sở (Primitive data type): bao gồm byteshortintlong,floatdoublebooleanchar.
  2. Kiểu dữ liệu tham chiếu (Reference data type): tất cả các kiểu còn lại nhưint[]StringScanner,… (như vậy, class được xem là một kiểu dữ liệu tham chiếu đấy nhé).
Sau đây, để hiểu rõ tại sao ngôn ngữ Java lại phân các kiểu dữ liệu thành 2 nhóm như vậy, chúng ta hãy cùng xem cách thức tổ chức lưu trữ của 2 nhóm này trên memory như thế nào nhé! :)
  1. Kiểu dữ liệu cơ sở: Tất cả các biến thuộc kiểu dữ liệu cơ sở đều được lưu trên vùng nhớ stack.
Ví dụ: Chúng ta có câu khai báo như sau:
int a = 10;
Nào, chúng ta cùng chia nhỏ câu lệnh trên để các bạn dễ hình dung các bước mà chương trình sẽ thực hiện:
  • int a: Cấp phát một ô nhớ gồm 4 bytes trên vùng nhớ stack. (Vì độ dài của kiểu int là 4 bytes)4
  • a = 10: Gán giá trị 10 cho ô nhớ trên.5
  • Như vậy, biến a chính là một ô nhớ trên vùng nhớ stack. Đơn giản và dễ hiểu đúng không nào các bạn. Vậy còn kiểu dữ liệu tham chiếu sẽ được lưu trữ thế nào nhỉ? Cùng đi tiếp nào… :P
  1. Kiểu dữ liệu tham chiếu: những biến thuộc kiểu dữ liệu tham chiếu (hay biến tham chiếu) sẽ được lưu tại vùng nhớ stack và đối tượng sinh ra (sau toán tử new) sẽ được lưu tại vùng nhớ heap. Giá trị của biến tham chiếu chính là địa chỉ của đối tượng được sinh ra đó.
Ví dụ: Chúng ta có câu khai báo như sau:
String a = new String(“Java”);
Tương tự ở trên, chúng ta cùng chia nhỏ câu lệnh trên dể dễ hình dung các bước mà chương trình sẽ thực thi trong câu lệnh đó nhé!
  • Đầu tiên là String a: Cấp phát một ô nhớ trên vùng nhớ stack, ô nhớ này chính là biến tham chiếu a.6
  • new String(): Cấp phát một ô nhớ trên vùng nhớ heap, ô nhớ này là một đối tượng kiểu String, việc cấp ô nhớ này do toán tử new thực hiện.7
  • String("Java"): Gán giá trị “Java” cho ô nhớ trên vùng nhớ heap.8
  • a = "Java": Gán địa chỉ của đối tượng trên vùng nhớ heap cho ô nhớ trên vùng nhớ stack (biến tham chiếu a).8
Như ví dụ trên, ta thấy biến tham chiếu a tương tự như con trỏ (pointer) trong ngôn ngữ C/C++, nó được lưu tại vùng nhớ stack và tham chiếu đến địa chỉ của một đối tượng được tạo ra trên vùng nhớ heap.
Vậy sự khác nhau của con trỏ (pointer) trong ngôn ngữ C/C++ và biến tham chiếu (reference variable) trong ngôn ngữ Java là gì? Tại sao Java lại không sử dụng con trỏ như C/C++ nữa? Và có thực sự là Java đã loại bỏ hoàn toàn con trỏ trong ngôn ngữ này?  Hãy đón đọc trong những bài viết tiếp sau các bạn nhé! :)
Để biết rõ hơn về vùng nhớ stack và heap, các bạn vui lòng xem lại bài đầu tiên của series này nhé.

Nhận xét