Search…

Chuyển Kiểu trong Java

04/08/20203 min read
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.

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.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024