Bài 10. Hướng Dẫn Chuyển Đổi Kiểu Dữ Liệu Trong Java | Tự Học Java Căn Bản

Published on
Thuộc danh mục: Học Java Căn Bản|Đăng bởi: Lê Thanh Giang||10 min read
Facebook share iconLinkedIn share iconTwitter share iconPinterest share iconTumblr share icon
Bài 10. Chuyển Đổi Kiểu Dữ Liệu Trong Java | Tự Học Java Căn Bản

Chuyển đổi kiểu dữ liệu trong Java là gì?

Chuyển đổi kiểu dữ liệu (Type Casting) trong Java là quá trình thay đổi kiểu của một giá trị từ kiểu dữ liệu này sang kiểu dữ liệu khác. Java hỗ trợ nhiều loại chuyển đổi kiểu khác nhau, bao gồm:

  • Chuyển đổi kiểu ngầm định (Implicit Casting)
  • Chuyển đổi kiểu tường minh (Explicit Casting)
  • Chuyển đổi giữa kiểu dữ liệu nguyên thủy và kiểu đối tượng (Boxing và Unboxing)
  • Chuyển đổi giữa các kiểu số và chuỗi (String)
  • Chuyển đổi giữa các kiểu dữ liệu tham chiếu (Reference Type Casting)

Chuyển đổi kiểu ngầm định (Implicit Casting)

Chuyển đổi kiểu ngầm định (còn gọi là Widening Casting) xảy ra khi Java tự động chuyển một giá trị từ kiểu dữ liệu có kích thước nhỏ hơn sang kiểu dữ liệu có kích thước lớn hơn mà không làm mất dữ liệu.

Kiểu nhỏ hơnCó thể chuyển đổi sang
byteshort int long float double
shortint long float double
intlong float double
longfloat double
floatdouble

Ví dụ:

public class ImplicitCastingExample {
    public static void main(String[] args) {
        int myInt = 100;
        double myDouble = myInt; // Tự động chuyển từ int sang double

        System.out.println("Giá trị int: " + myInt);
        System.out.println("Giá trị double: " + myDouble);
    }
}
  • Biến myInt có kiểu int và được gán giá trị 100.
  • Biến myDouble có kiểu double, nhận giá trị từ myInt mà không cần ép kiểu.
  • Java tự động chuyển đổi từ int sang double mà không làm mất dữ liệu.

Chuyển đổi kiểu tường minh (Explicit Casting)

Chuyển đổi kiểu tường minh (còn gọi là Narrowing Casting) thường là khi chúng ta chuyển từ kiểu dữ liệu có kích thước lớn hơn về kiểu dữ liệu có kích thước nhỏ hơn. Việc này yêu cầu lập trình viên sử dụng dấu ngoặc đơn để chỉ rõ kiểu cần chuyển đổi.

Thực tế thì ép kiểu tường minh không phụ thuộc vào việc kiểu đích có kích thước nhỏ hơn hay lớn hơn. Mà chỉ cần bạn sử dụng dấu ngoặc đơn (type) để yêu cầu chuyển đổi kiểu, thì đó luôn là ép kiểu tường minh, bất kể kiểu đích có lớn hơn hay nhỏ hơn kiểu gốc.

Kiểu lớn hơnCó thể chuyển đổi sang
doublefloat long int short byte
floatlong int short byte
longint short byte
intshort byte
shortbyte

Ví dụ:

public class ExplicitCastingExample {
    public static void main(String[] args) {
        double myDouble = 9.78;
        int myInt = (int) myDouble; // Chuyển đổi từ double sang int

        System.out.println("Giá trị double ban đầu: " + myDouble);
        System.out.println("Giá trị int sau khi ép kiểu: " + myInt);
    }
}
  • Biến myDouble có kiểu double với giá trị 9.78.
  • Khi chuyển đổi double sang int, phần thập phân bị mất (9.78 trở thành 9).
  • Cần chỉ định rõ kiểu (int) myDouble để Java hiểu rằng bạn muốn chuyển đổi từ kiểu double sang int.

Chuyển đổi giữa kiểu dữ liệu nguyên thủy và kiểu đối tượng

Java cung cấp các lớp bao (Wrapper Class) như Integer, Double, Float, ... để chuyển đổi giữa kiểu nguyên thủy và đối tượng.

Chuyển từ kiểu nguyên thủy sang đối tượng (Boxing)

public class BoxingExample {
    public static void main(String[] args) {
        int num = 100;
        Integer obj = Integer.valueOf(num); // Boxing (chuyển đổi từ int sang Integer)

        System.out.println("Giá trị Integer object: " + obj); // Giá trị Integer object: 100
    }
}
  • Phương thức Integer.valueOf(num) tạo một đối tượng Integer từ giá trị int.
  • Lúc này obj là một đối tượng Integer chứa giá trị 100. Khi in ra đối tượng này, phương thức toString() của lớp Integer sẽ tự động được gọi, và giá trị của nó sẽ được hiển thị dưới dạng 100.

Chuyển từ đối tượng sang kiểu nguyên thủy (Unboxing)

public class UnboxingExample {
    public static void main(String[] args) {
        Integer obj = 50;  // Boxing tự động (autoboxing)
        int num = obj.intValue(); // Unboxing (chuyển đổi từ Integer sang int)

        System.out.println("Giá trị int: " + num);
    }
}
  • obj.intValue() thực hiện quá trình unboxing, tức là chuyển đối tượng Integer về giá trị nguyên thủy int.
  • Ở đây, obj là đối tượng Integer, và phương thức intValue() giúp lấy giá trị nguyên thủy 50 từ đối tượng này.

Autoboxing và Auto-unboxing

Java cung cấp một cơ chế tự động gọi boxing và unboxing, được gọi là autoboxingauto-unboxing. Điều này giúp chúng ta không cần phải gọi các phương thức như valueOf() hoặc intValue() trong các tình huống đơn giản.

Ví dụ:

public class AutoBoxingExample {
    public static void main(String[] args) {
        int num = 100;
        Integer obj = num; // Autoboxing (tự động chuyển từ int sang Integer)

        System.out.println("Giá trị Integer object: " + obj);

        int num2 = obj; // Auto-unboxing (tự động chuyển từ Integer sang int)
        System.out.println("Giá trị int: " + num2);
    }
}

Chuyển đổi giữa kiểu số và kiểu chuỗi String

Chuyển số thành chuỗi String

Bạn có thể sử dụng phương thức String.valueOf() hoặc toán tử +"" để chuyển đổi số thành chuỗi.

Ví dụ:

public class NumberToString {
    public static void main(String[] args) {
        int num = 123;
        String str1 = String.valueOf(num);
        String str2 = num + ""; // Hoặc sử dụng toán tử +

        System.out.println("Chuỗi từ int: " + str1);
        System.out.println("Chuỗi từ int (cách 2): " + str2);
    }
}

Chuyển chuỗi String thành số

Dùng các phương thức Integer.parseInt(), Double.parseDouble(), Float.parseFloat(), v.v.

Ví dụ:

public class StringToNumber {
    public static void main(String[] args) {
        String str = "456";
        int num = Integer.parseInt(str);
        double dnum = Double.parseDouble(str);

        System.out.println("Số nguyên từ chuỗi: " + num);
        System.out.println("Số thực từ chuỗi: " + dnum);
    }
}

Chuyển đổi kiểu dữ liệu tham chiếu (Lớp và Đối tượng)

Java hỗ trợ chuyển đổi kiểu giữa các lớp cha và lớp con khi sử dụng kế thừa extends.

  • Upcasting: Chuyển từ lớp con lên lớp cha (tự động).
  • Downcasting: Chuyển từ lớp cha xuống lớp con (cần ép kiểu).

Chuyển đổi từ lớp con lên lớp cha (Upcasting)

  • Tự động thực hiện nếu lớp con kế thừa lớp cha.
  • Không cần ép kiểu.

Ví dụ:

class Animal {
    void makeSound() {
        System.out.println("Some sound...");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("Gâu gâu!");
    }
}

public class UpcastingExample {
    public static void main(String[] args) {
        Animal myDog = new Dog(); // Upcasting từ Dog → Animal
        myDog.makeSound();
    }
}

Downcasting (Chuyển từ lớp cha xuống lớp con)

  • Cần ép kiểu tường minh.
  • Có thể gây lỗi ClassCastException nếu không kiểm tra trước.

Ví dụ:

public class DowncastingExample {
    public static void main(String[] args) {
        Animal myAnimal = new Dog(); // Upcasting
        Dog myDog = (Dog) myAnimal;  // Downcasting (ép kiểu)
        myDog.bark();
    }
}

Để chắc chắn, cần kiểm tra trước khi ép kiểu bằng instanceof để tránh lỗi.

if (myAnimal instanceof Dog) {
    Dog myDog = (Dog) myAnimal;
    myDog.bark();
}

Kết luận:

Chuyển đổi kiểu dữ liệu trong Java là một khái niệm quan trọng giúp lập trình viên có thể làm việc với nhiều loại dữ liệu khác nhau một cách linh hoạt. Java hỗ trợ hai phương thức chuyển đổi kiểu chính: Chuyển đổi kiểu ngầm định (Implicit Casting)Chuyển đổi kiểu tường minh (Explicit Casting).

  • Chuyển đổi kiểu ngầm định (Widening Casting) xảy ra khi Java tự động chuyển đổi giá trị từ kiểu dữ liệu nhỏ hơn sang kiểu dữ liệu lớn hơn mà không cần sự can thiệp của người lập trình.
  • Chuyển đổi kiểu tường minh (Narrowing Casting) yêu cầu người lập trình chỉ định rõ ràng kiểu đích, vì kiểu này có thể mất dữ liệu (ví dụ: chuyển từ double sang int).

Ngoài ra, Java cung cấp các lớp bao (Wrapper Classes) như Integer, Double, Float, ... để hỗ trợ chuyển đổi giữa kiểu dữ liệu nguyên thủy và kiểu đối tượng, thông qua cơ chế Boxing (chuyển từ kiểu nguyên thủy sang đối tượng) và Unboxing (chuyển từ đối tượng sang kiểu nguyên thủy).

Chuyển đổi kiểu còn xuất hiện trong các kỹ thuật như UpcastingDowncasting trong kế thừa (Inheritance), cho phép linh hoạt trong việc sử dụng các đối tượng con thông qua tham chiếu lớp cha, đồng thời vẫn có thể thực thi các phương thức phù hợp với loại đối tượng thực tế.

Loại chuyển đổiMô tảVí dụ

Chuyển đổi kiểu ngầm định (Implicit Casting / Widening Casting)

Chuyển đổi từ kiểu dữ liệu có kích thước nhỏ hơn sang kiểu dữ liệu có kích thước lớn hơn mà không cần sự can thiệp của lập trình viên.

int → long, float → double.

Chuyển đổi kiểu tường minh (Explicit Casting / Narrowing Casting)

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. Cần phải chỉ định rõ ràng và có thể mất dữ liệu.

double → int, long → short.
Boxing (Chuyển từ kiểu nguyên thủy sang đối tượng)Chuyển đổi từ kiểu nguyên thủy thành đối tượng (Wrapper Class).int → Integer, double → Double.
Unboxing (Chuyển từ đối tượng sang kiểu nguyên thủy)Chuyển đối tượng (Wrapper Class) về kiểu nguyên thủy tương ứng.Integer → int, Double → double.
Upcasting (Chuyển từ lớp con về lớp cha)

Quá trình chuyển một đối tượng của lớp con thành tham chiếu của lớp cha, cho phép sử dụng các phương thức của lớp cha.

Dog → Animal, Car → Vehicle.
Downcasting (Chuyển từ lớp cha về lớp con)

Chuyển một đối tượng từ lớp cha về lớp con, có thể gây ra lỗi nếu không thực hiện kiểm tra kiểu hợp lệ.

Animal → Dog, Vehicle → Car (phải kiểm tra kiểu trước khi downcast).

Việc hiểu và áp dụng đúng cách các kỹ thuật chuyển đổi kiểu dữ liệu sẽ giúp lập trình viên tối ưu hóa mã nguồn và tránh được các lỗi về kiểu dữ liệu trong quá trình phát triển ứng dụng Java.

Bài tập thực hành

Hãy viết chương trình nhận đầu vào là một số thực double, sau đó:

  1. Chuyển số thực này sang int và in ra màn hình.
  2. Chuyển số đó thành chuỗi và hiển thị.
  3. Chuyển chuỗi đó trở lại số nguyên int và in ra.

Bài tiếp theo: Bài 11. Các phép toán cơ bản trong Java

Bài viết mới nhất

Bài viết liên quan

Newsletter border

Đăng ký để nhận tin từ RiverLee