Bài 11: Ép kiểu dữ liệu trong Java
1. Ép kiểu
Java là ngôn ngữ rất chặt chẽ về kiểu dữ liệu, nó thường kiểm soát chặt về sự tương thích giữa các kiểu trong các ngữ cảnh thực hiện ngay trong lúc biên dịch. Tuy nhiên, một số kiểm soát cũng chỉ thực hiện được lúc hệ thống thực hiện, ví dụ như trường hợp thực hiện phép gán mà 2 toán hạng không tương thích với nhau về kiểu (như gán giá trị kiểu double cho biến kiểu int). Trong những trường hợp như thế, ta phải sử dụng quy tắc ép kiểu. Quy tắc ép kiểu có dạng: (<type>)<exp>
Lúc thực hiện hệ thống sẽ chuyển kết quả tính toán của biểu thức
Ví dụ:
int x = (int)15.67 + 1;
Lưu ý:
Không cho phép chuyển đổi giữa các kiểu nguyên thủy với kiểu tham chiếu, ví dụ kiểu double không thể ép sang các kiểu lớp như HocSinh được nhé!
Kiểu giá trị boolean (logic) không thể chuyển sang các kiểu dữ liệu số và ngược lại.
Việc chuyển đổi giữa các kiểu theo quy tắc trên được gọi là ép kiểu (hay chuyển đổi kiểu) tường minh. Java cũng giống như các ngôn ngữ lập trình khác, ngoài cơ chế ép kiểu tường minh còn sử dụng cơ chế ép kiểu không tường minh, ví dụ có thể gán ký tự char cho biến kiểu int.
2. Mở rộng (widening) và thu hẹp kiểu (narrowwing)
Đối với các kiểu dữ liệu nguyên thủy, các giá trị của kiểu hẹp hơn (chiếm số byte ít hơn) có thể được chuyển sang những kiểu rộng hơn (chiếm số byte lớn hơn) mà không mất mát dữ liệu. Cách chuyển kiểu đó được gọi là mở rộng kiểu. Java cho phép thực hiện mở rộng kiểu theo các quy tắc được mô tả như hình dưới:
char c = 'A';
int k = c; // mở rộng kiểu char sang kiểu int (mặc định)
Chuyển đổi kiểu theo chiều ngược lại, từ kiểu rộng về kiểu hẹp hơn thì được gọi là thu hẹp kiểu. Lưu ý là thu hẹp kiểu có thể dẫn đến mất mát dữ liệu. Thực tế là mọi sự chuyển đổi kiểu được phép mà không phải mở rộng kiểu như hình trên thì đều là thu hẹp kiểu. Như vậy mọi chuyển đổi giữa char và hai kiểu byte và short cũng là thu hẹp kiểu.
Ví dụ:
int k = 10;
char c = (char)k; // Thu hẹp kiểu của k về kiểu của c
Cuối cùng ta cũng cần lưu ý về ngữ cảnh phải thực hiện ép kiểu:
- Thực hiện các gán đối với các biến kiểu nguyên thủy hoặc kiểu tham chiếu.
- Thực hiện các lời gọi hàm (phương thức) với các tham số kiểu nguyên thủy hay kiểu tham chiếu.
- Thực hiện tính toán các biểu thức số học.
- Ghép các xâu kết hợp với đối tượng của lớp String và các kiểu dữ liệu khác.