STDIO
Tìm kiếm gần đây
    Nội dung
    0
    0
    Chia sẻ
    Nội dung
    0
    0
    Chia sẻ

    Chuyển Kiểu trong Java

    Hướng dẫn chuyển kiểu giữa các đối tượng trong Java thông qua code mẫu về Upcast và Downcast.
    17/08/2015 04/08/2020 3 phút đọc
    Chuyển Kiểu trong Java

    Chuyển kiểu

    Thông thường chuyển kiểu được chia làm 2 loại:

    • Chuyển kiểu ngầm định.
    • Chuyển kiểu tường minh.

    Bài viết trình bày cả hai loại chuyển kiểu trên theo kiểu dữ liệu là kiểu dữ liệu cơ bản và kiểu dữ liệu tham chiếu.

    Chuyển kiểu đối với kiểu dữ liệu cơ bản

    Đối với những kiểu dữ liệu cơ bản trong Java, nguyên lý chuyển kiểu tương tự như trong ngôn ngữ C.

    Chuyển kiểu với kiểu dữ liệu tham chiếu

    Xây dựng 2 lớp Dragon kết thừa từ lớp Monster.

    class Monster {
           public void eat(){
                  System.out.println("Monster eat something");
           }
    }
    
    class Dragon extends Monster {
           public void fly(){
                  System.out.println("Dragon can fly");
           }
    }

    Upcast

    Upcast được hiểu là chuyển kiểu từ thể hiện của dẫn xuất (Dragon) trở thành thể hiện của lớp mà nó kế thừa (Monster).

    Từ ví dụ phía trên, hiện thực hàm main như sau:

    public static void main(String[] args) {
          Dragon obj1   = new Dragon();
          Monster obj2  = obj1;              // Upcast with no explicit cast
          Monster obj3  = (Monster)obj1;     // Upcast with an explicit cast
     
          obj1.eat();
          obj2.eat();
          obj3.eat();
    }
    • Monster obj2 = obj1; là upcast bất tường minh.
    • Monster obj3 = (Monster)obj1; là upcast tường minh.
    • Kết quả của 3 trường hợp đều là Monster eat something.

    Một lưu ý nhỏ rằng: mọi phương thức của lớp Monster hoàn toàn có thể gọi qua 1 đối tượng thuộc lớp Dragon do giữa MonsterDragon có quan hệ IS_A. Tuy nhiên, nếu thực hiện override bất kỳ phương thức nào của lớp Monster tại lớp Dragon thì trong quá trình thực thi phương thức được gọi sẽ là phương thức của lớp Dragon. Quay trở lại ví dụ phía trên. Nếu trong lớp Dragon, thực hiện override phương thức eat như sau:

    class Monster {
           public void eat() {
                  System.out.println("Monster eat something");
           }
    }
    
    class Dragon extends Monster {
           public void eat() {
                  System.out.println("Dragon eat mana");
           }
    
           public void fly() {
                  System.out.println("Dragon can fly");
           }
    }
    
    public static void main(String[] args) {
          Dragon obj1   = new Dragon();
          Monster obj2  = obj1;              // Upcast with no explicit cast
          Monster obj3  = (Monster)obj1;     // Upcast with an explicit cast
     
          obj1.eat();
          obj2.eat();
          obj3.eat();
    }

    Kết quả sẽ là:

    • Dragon eat mana
    • Monster eat something
    • Monster eat something

    Downcast

    Khác với upcast, downcast là dạng chuyển kiểu từ 1 thể hiện của lớp cơ sở hoặc lớp được kế thừa (Monster) thành các thể hiện của lớp dẫn xuất (Dragon).

    Thông thường, khi thực hiện dòng:

    Monster obj = new Dragon();

    obj có thể gọi những phương thức đã được override của lớp Monster tại lớp Dragon. Tuy nhiên, vấn đề phát sinh khi muốn gọi mọi phương thức (bao gồm cả những phương thức không được override) của lớp Dragon thông qua việc ép kiểu đối tượng thuộc lớp Monster, khi đó cần sử dụng downcast.

    Hiện thực downcast trong hàm main của ví dụ trên như sau:

    public static void main(String []args) {
           Monster obj = new Dragon();
           Dragon obj1 = (Dragon)obj;
    
           obj1.fly();
    }

    fly là phương thức chỉ có ở lớp Dragon, thông qua downcast có thể gọi ra phương thức đó thông qua đối tượng obj1.

    0 Bình luận
    Java

    Java

    Tổng hợp các bài viết Java hữu ích từ STDIO Training - Đào Tạo Lập Trình

    Khi bạn nhấn vào sản phẩm do chúng tôi đề xuất và mua hàng, chúng tôi sẽ nhận được hoa hồng. Điều này hỗ trợ chúng tôi có thêm kinh phí tạo nhiều nội dung hữu ích. Tìm hiểu thêm.
    STDIO

    Trang chính

    Công ty TNHH STDIO

    • 30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
      +84 28.36205514 - +84 942.111912
      developer@stdio.vn
    • 383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
      Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012
    ©STDIO, 2013 - 2021