Kiểu Dữ Liệu (Data Types)
Kiểu dữ liệu (data type) trong lập trình Java quy định kích thước và loại giá trị mà một biến có thể lưu trữ. Java có hai loại kiểu dữ liệu chính: Kiểu dữ liệu nguyên thủy (Primitive Data Types), Kiểu dữ liệu phi nguyên thủy (Non-primitive Data Types).

Ⅰ. Kiểu dữ liệu nguyên thủy (Primitive data types)
Là những kiểu dữ liệu cơ bản được cung cấp sẵn bởi Java. Chúng chiếm một lượng bộ nhớ cố định và không thể thay đổi kích thước. Bao gồm các kiểu dữ liệu sau:
Kiểu Dữ Liệu | Kích Thước | Giới Hạn Giá Trị | Ví Dụ |
---|---|---|---|
boolean | 1 byte | true hoặc false | true, false |
char | 2 byte | Mã ký tự Unicode (0 đến 65,535) | 'A', 'b', '@' |
byte | 1 byte | -128 đến 127 | 100, -50, 0 |
short | 2 byte | -32,768 đến 32,767 | 1500, -2000 |
int | 4 byte | -2,147,483,648 đến 2,147,483,647 | 1000000, -5000 |
long | 8 byte | -9,223,372,036,854,775,808 đến 9,223,372,036,854,775,807 | 10000000000L, -5000000000L |
float | 4 byte | -3.4E38 đến 3.4E38 | 3.14f, -0.5f |
double | 8 byte | -1.7E308 đến 1.7E308 | 3.141592653589793, -0.123456789 |
Giá trị mặc định của biến trong Java
Trong Java, bạn không nhất thiết phải gán giá trị cho biến ngay khi khai báo. Nếu bạn khai báo một biến nhưng không gán giá trị (khởi tạo), trình biên dịch sẽ tự động đặt một giá trị mặc định hợp lý cho biến đó.
Thông thường, giá trị mặc định sẽ là 0 hoặc null phụ thuộc vào kiểu dữ liệu của biến. Tuy nhiên, việc phụ thuộc vào giá trị mặc định này thường được coi là một cách lập trình không tốt.
Bảng dưới đây tóm tắt các giá trị mặc định cho các kiểu dữ liệu cơ bản:
Kiểu Dữ Liệu | Giá Trị Mặc Định |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | \u0000 (Ký tự trống) |
String (hoặc bất kỳ đối tượng nào) | null |
boolean | false |
Lưu ý về biến cục bộ (local variable):
↳ Biến cục bộ khác với trường (field). Trình biên dịch sẽ không tự động gán giá trị mặc định cho biến cục bộ chưa được khởi tạo.
↳ Nếu bạn không thể khởi tạo biến cục bộ ngay khi khai báo, hãy nhớ gán giá trị cho biến đó trước khi sử dụng. Truy cập vào một biến cục bộ chưa được khởi tạo sẽ dẫn đến lỗi biên dịch.
Ⅱ. Kiểu dữ liệu phi nguyên thủy (Non-primitive data types)
Là những kiểu dữ liệu được xây dựng từ các kiểu dữ liệu nguyên thủy. Chúng có kích thước linh hoạt và có thể chứa các đối tượng (object) phức tạp. Bao gồm các kiểu dữ liệu sau:
↳ Classes: Bản thiết kế để tạo ra các đối tượng. Mỗi đối tượng là một instance của một class và có thể chứa các thuộc tính (property) và phương thức (method).
↳ Interfaces: Định nghĩa một hợp đồng (contract) mà các lớp khác phải tuân theo.
↳ Arrays: Mảng là một tập hợp các phần tử có cùng kiểu dữ liệu, được truy cập bằng chỉ số.
Ⅲ. Ép kiểu dữ liệu
Ép kiểu (type casting) trong Java là quá trình chuyển đổi giá trị từ một kiểu dữ liệu sang kiểu dữ liệu khác. Việc ép kiểu thường cần thiết khi bạn muốn thực hiện các phép toán hoặc gán giá trị giữa các biến có kiểu dữ liệu khác nhau. Có hai loại ép kiểu chính:
1. Ép kiểu ngầm định (Implicit Casting):
Xảy ra tự động khi trình biên dịch Java nhận ra rằng có thể chuyển đổi giá trị từ kiểu dữ liệu này sang kiểu dữ liệu khác một cách an toàn và không gây mất dữ liệu.
Thường xảy ra khi chuyển đổi từ kiểu dữ liệu nhỏ hơn sang kiểu dữ liệu lớn hơn.
Ví dụ
byte b = 10;
int i = b; // Ép kiểu ngầm định từ byte sang int
2. Ép kiểu tường minh (Explicit Casting):
Yêu cầu lập trình viên sử dụng toán tử ép kiểu để chuyển đổi giá trị. Thường xảy ra khi chuyển đổi từ kiểu dữ liệu lớn hơn sang kiểu dữ liệu nhỏ hơn hoặc khi cần kiểm soát rõ ràng việc chuyển đổi.
Có hai loại ép kiểu tường minh (Explicit Casting):
↳ Ép kiểu thu hẹp (Narrowing Casting): Chuyển đổi từ kiểu dữ liệu lớn hơn sang kiểu dữ liệu nhỏ hơn. Có thể dẫn đến mất dữ liệu nếu giá trị không nằm trong phạm vi cho phép của kiểu dữ liệu đích.
Ví dụ
int i = 100;
byte b = (byte) i; // Ép kiểu thu hẹp từ int sang byte (có thể dẫn đến mất dữ liệu)

↳ Ép kiểu mở rộng (Widening Casting): Chuyển đổi từ kiểu dữ liệu nhỏ hơn sang kiểu dữ liệu lớn hơn. Không dẫn đến mất dữ liệu.
Ví dụ
byte b = 10;
int i = (int) b; // Ép kiểu mở rộng từ byte sang int

Lưu ý:
↳ Sử dụng ép kiểu ngầm định khi có thể vì nó đơn giản và hiệu quả hơn.
↳ Sử dụng ép kiểu tường minh khi cần kiểm soát rõ ràng việc chuyển đổi hoặc khi ép kiểu thu hẹp.
↳ Cần cẩn thận khi ép kiểu thu hẹp vì có thể dẫn đến mất dữ liệu.