× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

Ép kiểu trong Java - Giải mã thông tin về Java type conversion

07/09/2021 01:03

Có một số trường hợp khi lập trình mà các kiểu hằng số và biến khác nhau trộn lẫn trong một biểu thức. Để thực hiện hành động trên những hằng số và biến này, chúng ta cần chuyển đổi chúng thành cùng một kiểu hay còn gọi là ép kiểu. Trong bài viết này, chúng ta sẽ tìm hiểu về khái niệm ép kiểu trong Java, vốn được sử dụng để chuyển đổi một giá trị đã xác định trước thành một kiểu khác. 

Ép kiểu trong Java là gì?

Ép kiểu - Type conversion hay Type Casting là quá trình chuyển đổi một biến cả một kiểu được xác định trước thành một kiểu khác. Nếu những kiểu dữ liệu này tương thích với kiểu khác, trình biên dịch sẽ tự động chuyển đổi chúng và nếu không, lập trình viên sẽ cần ép kiểu  chúng một cách rõ ràng. 

Các kiểu ép kiểu trong Java

  • Ép kiểu ngầm (tự động)
  • Ép kiểu tường minh

Ép kiểu ngầm định trong Java

Ép kiểu ngầm hay ép kiểu tự động là quá trình chuyển đổi tự động một kiểu dữ liệu thành kiểu khác bằng trình biên dịch mà không cần sự can thiệp của lập trình viên. Quá trình này còn được gọi là ép kiểu nới rộng (widening Conversion) vì trình biên dịch chuyển giá trị kiểu dữ liệu có kích thước nhỏ hơn sang kiểu có kích thước lớn hơn. Kiểu biến đổi này không làm mất thông tin. Ép kiểu ngầm định trong Java chỉ có thể thực thi khi:

  • Hai dữ liệu tương thích với nhau
  • Có nhu cầu chuyển đổi kiểu dữ liệu nhỏ hơn hoặc hẹp hơn thành kiểu dữ liệu lớn hơn

Hình ảnh trên cho thấy quá trình chuyển đổi mà Java cho phép. Ví dụ, trình biên dịch chuyển đổi tự động dữ liệu byte thành kiểu ngắn vì byte nhỏ hơn (8 bit) hoặc hẹp hơn short (16 bit).

byte ——— có thể chuyển đổi thành ————-> short, int, long, float, hoặc double

Short ——— có thể chuyển đổi thành ————-> int, long, float hoặc double

char ——— có thể chuyển đổi thành ————-> int, long, float hoặc double

int ——— có thể chuyển đổi thành ————-> long, float, hoặc double

long ——— có thể chuyển đổi thành ————-> float hoặc double

float ——— có thể chuyển đổi thành ————-> double

 

Ví dụ:

package com.techvidvan.typeconversion;

public class ImplicitTypeConversion

{

  public static void main(String[] args)

  {

    int intVariable = 25;

    long longVariable = intVariable;

    float floatVariable = longVariable;

    double doubleVariable = floatVariable;

    System.out.println("Integer value is: " +intVariable);

    System.out.println("Long value is: " +longVariable);

    System.out.println("Float value is: " +floatVariable);

    System.out.println("Double value is: " +doubleVariable);

  }

}

Output

Integer value is: 25

Long value is: 25

Float value is: 25.0

>>> Tham khảo: Khóa học lập trình Java

Ép kiểu tường minh trong Java 

Ép kiểu tường minh là quá trình chuyển đổi dữ liệu một cách tường minh thành một kiểu dữ liệu cụ thể. Chúng ta cũng có thể gọi nó là ép kiểu hẹp (Narrowing Conversion). Kiểu ép kiểu này được thực hiện thủ công bởi lập trình viên, chứ không phải trình biên dịch. Chúng ta cần thực hiện ép kiểu tường minh khi có nhu cầu chuyển đổi từ kiểu dữ liệu có kích thước lớn hơn sang kiểu có kích thước nhỏ hơn. Kiểu biến đổi này có thể làm mất thông tin. Ví dụ, kiểu dữ liệu double được chuyển đổi rõ ràng thành kiểu int.

Cú pháp ép kiểu tường minh trong Java:

(type) expression;

Ví dụ:

 

1

2

3

4

5

6

7

8

9

10

11

public class TestNarrowwing {

    public static void main(String[] args) {

        double d = 100.04;

        long l = (long) d; // yêu cầu chỉ định kiểu dữ liệu (long)

        int i = (int) l; // yêu cầu chỉ định kiểu dữ liệu (int)

 

        System.out.println("Giá trị Double: " + d);

        System.out.println("Giá trị Long: " + l);

        System.out.println("Giá trị Int:  " + i);

 

    }

}

Kết quả:

Giá trị Double: 100.04

Giá trị Long: 100

Giá trị Int:  100

Assignment Compatibility - Gán tương thích trong Java

Như đã biết, chúng ta có thể gán giá trị của kiểu số nguyên cho giá trị cùng kiểu hoặc kiểu rộng hơn mà không cần ép kiểu. Trong trường hợp này, trình biên dịch tự động mở rộng giá trị của các kiểu phù hợp. Một giá trị của bất kỳ kiểu số nguyên nào khác. Tuy nhiên, kiểu số nguyên không thể được ép kiểu thành giá trị boolean, cũng như kiểu boolean không thể được truyền thành giá trị kiểu số nguyên. 

Bảng sau đây cho biết liệu một phép gán từ một kiểu số nguyên cụ thể sang một kiểu số nguyên khác có thể được thực hiện trực tiếp.

Chuyển đổi kiểu dữ liệu nguyên trong Java

Assignment Operation

Chuyển đổi gán xảy ra khi chúng ta chỉ định một biến của một kiểu thành một kiểu khác. Chúng ta chỉ có thể thực hiện việc ép kiểu mở rộng hoặc ngầm định qua thực thi assignment. Ví dụ:

int number1 ;

byte number2 ;

number1 = number2 ;      //number2 automatically converts to int

Integer Promotion

Khi đánh giá biểu thức số nguyên, Java tự động nhận ra nhu cầu chuyển đổi kiểu và thực hiện nó cho phù hợp bằng cách thực hiện Integer Promotion. Ví dụ:

int num = 5

double sum = 30;

double average = sum / num;  //num also converts to double

>>> Đọc thêm: Singleton trong Java - Cách triển khai và ví dụ mà mọi LTV cần biết

Chuyển đổi trong quá trình gọi phương thức

Kiểu chuyển đổi này xảy ra khi chúng ta gọi một phương thức và đối số được truyền của một kiểu dữ liệu cho phương thức đang muốn chuyển sang kiểu dữ liệu khác.  Giả sử đối số được truyền tới một phương thức là kiểu int và phương thức yêu cầu kiểu dữ liệu dài thì int tự động chuyển thành long tại thời điểm gọi phương thức.

float floatVariable = 4.56f;

double doubleVariable = Math.sin(floatVariable);

//method sin() expects double and hence floatVariable converts to double

>>> Đọc thêm: Console trong Java - Phương thức đọc inpute console trong Java

Nguyên tắc ép kiểu Reference

  • Chúng ta có thể chuyển đổi class type thành class type hoặc thành kiểu giao diện interface. Chuyển đổi thành một kiểu lớp yêu cầu kiểu mới phải là lớp cha của lớp cũ. Và chuyển đổi thành một kiểu giao diện yêu cầu lớp cũ phải triển khai giao diện.
  • Chúng ta chỉ có thể chuyển đổi một kiểu giao diện thành một kiểu giao diện cho đối tượng. Nếu chúng ta chuyển đổi sang kiểu giao diện, thì kiểu mới phải là giao diện của kiểu cũ.
  • Chúng ta có thể chuyển đổi mảng sang giao diện Cloneable hoặc Serializable, thành kiểu đối tượng hoặc mảng.

Ví dụ code minh họa:

package com.techvidvan.typeconversion;

public class ReferenceTypeConversion

{

  class Shape

  {
  }

  class Square extends Shape

  {
  }

  public static void main(String[] args)

  {

    Shape s1 = new Shape();

    Square s2 = new Square();

    s1 = s2; //allowed

    s2 = s1; //not allowed

  }

}

Output

Type mismatch: cannot convert from ReferenceTypeConversion.Shape to ReferenceTypeConversion.Square

Kết luận:

Chúng ta gọi quá trình thay đổi giá trị từ kiểu dữ liệu này sang kiểu dữ liệu khác là ép kiểu. Sử dụng ép kiểu trong Java bạn có thể chuyển đối kiểu dữ liệu lớn hơn thành kiểu nhỏ hơn. Và nếu việc chuyển đổi cần được thực hiện từ các kiểu nhỏ hơn hoặc hẹp hơn sang các kiểu lớn hơn, thì trình biên dịch sẽ tự động chuyển đổi chúng bằng cách sử dụng ép kiểu ngầm định. Trong bài viết này, chúng ta đã thảo luận về hai kiểu ép kiểu trong Java, hy vọng bạn đã hiểu rõ về ép kiểu và có thể áp dụng trong các dự án sắp tới. Tìm hiểu thêm về Java và các ngôn ngữ lập trình khác qua các khóa học lập trình tại Viện công nghệ thông tin T3H.