STDIO
Tìm kiếm gần đây
    • 0

    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.

    Java

    Java

    Tổng hợp các bài viết Java hữu ích

    Sản phẩm

    Đề xuất

    String Trong Java

    String Trong Java

    Giới thiệu về kiểu chuỗi và kỹ thuật thao tác với chuỗi trong ngôn ngữ ...

    JavaCơ Bản

    06/05/2015

    Cơ Bản về Chuyển Kiểu trong C

    Cơ Bản về Chuyển Kiểu trong C

    Tìm hiểu về chuyển kiểu dữ liệu trong C.

    Modern C++C++98

    21/07/2015

    Khám phá thêm

    Biến và Kiểu Dữ Liệu Cơ Bản trong Java

    Biến và Kiểu Dữ Liệu Cơ Bản trong Java

    Giới thiệu khái niệm, phạm vi hoạt động của biến và các kiểu dữ liệu ...

    JavaCơ Bản

    11/05/2015

    Kiểu Dữ Liệu Mảng Trong PHP

    Kiểu Dữ Liệu Mảng Trong PHP

    Tìm hiểu về kiểu dữ liệu và các phương thức về mảng trong PHP.

    PHPCheat Sheet

    20/03/2017

    Tổng Quan về Ngôn Ngữ Lập Trình Java

    Tổng Quan về Ngôn Ngữ Lập Trình Java

    Java là 1 trong những ngôn ngữ lập trình mạnh mẽ, được sử dụng rộng rãi ...

    JavaKiến Thức

    20/05/2015

    Type-casting Trong C++

    Type-casting Trong C++

    Tìm hiểu về chuyển đổi kiểu dữ liệu (type-casting) trong C++.

    Modern C++C++98

    30/07/2015

    Overloading Method - Nạp Chồng Hàm Trong Java

    Overloading Method - Nạp Chồng Hàm Trong Java

    Cơ chế hoạt động nạp chồng phương thức - method overloading trong Java.

    JavaCơ Bản

    17/08/2015

    Ghi Đè Phương Thức - Overriding Method trong Java

    Ghi Đè Phương Thức - Overriding Method trong Java

    Trong Java, ghi đè phương thức - overriding method là phương pháp "viết ...

    JavaCơ Bản

    27/05/2015

    Chuyển Một Chuỗi Sang Số Nguyên với atoi trong C++

    Chuyển Một Chuỗi Sang Số Nguyên với atoi trong C++

    Hướng dẫn sử dụng hàm atoi, thư viện cstdlib chuyển một chuỗi thành một ...

    Modern C++C++98

    14/05/2018

    9 Tính Năng Quan Trọng Trong C++11

    9 Tính Năng Quan Trọng Trong C++11

    C++11 là một phiên bản cải tiến và nâng cấp từ C++98 (hay các bạn vẫn ...

    Modern C++C++0x

    13/08/2015

    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 - 2020