Tìm hiểu về instanceof trong JAVA

Toán tử instanceof trong Java được sử dụng để kiểm tra xem đối tượng có phải là một thể hiện của loại được chỉ định (class hoặc subclass hoặc interface) hay không.

Toán tử instanceof trong JAVA
Toán tử instanceof trong JAVA

instanceof trong Java còn được gọi là toán tử so sánh kiểu (comparison operater) vì nó so sánh thể hiện với kiểu.

  • instanceof trả về true hoặc false.
  • Nếu chúng ta áp dụng toán tử instanceof với bất kỳ biến nào có giá trị null, nó sẽ trả về false.

Ví dụ đơn giản sử dụng instanceof trong Java

Chúng ta hãy xem ví dụ đơn giản về toán tử instanceof để kiểm tra xem đối tượng có phải là thể hiện của một class được chỉ định hay không.

class ViDuInstanceof{  
  public static void main(String args[]){  
    ViDuInstanceof a = new ViDuInstanceof();  
    System.out.println(a instanceof ViDuInstanceof);  
  }  
}

Khi chạy chương trình, kết quả nhận được là:

true

Điều này chứng tỏ là: a là một thể hiện của class ViDuInstanceof

Ngoài ra, một đối tượng của subclass cũng là một kiểu của super class.

Ví dụ: nếu class Cho là mở rộng của DongVat thì đối tượng được tạo ra từ class Cho có thể được gọi bằng class Cho hoặc DongVat.

// Tạo class DongVat
class DongVat{}

// Tạo class Cho kế thừa class DongVat
class Cho extends DongVat{ 
  
  public static void main(String args[]){  
    Cho cauVang = new Cho();  
    System.out.println(cauVang instanceof DongVat);  
  }  
}  

Khi chạy chương trình, kết quả nhận được là:

true

>. Đọc thêm: Class trong Java

Sử dụng instanceof với một biến có giá trị null trong Java

Nếu chúng ta áp dụng toán tử instanceof với một biến có giá trị null, nó sẽ trả về false.

Chúng ta hãy xem ví dụ được bên dưới đây:

class Cho{
  public static void main(String args[]){
    Cho cauVang = null;  
    System.out.println(cauVang instanceof Cho);
  }  
}

Khi chạy chương trình, kết quả nhận được là:

false

Thực hiện Downcasting với toán tử instanceof trong Java

Khi kiểu của class con (subclass) đề cập đến đối tượng của lớp cha (super class), nó được gọi là downcasting.

Nếu chúng ta thực hiện nó trực tiếp, trình biên dịch sẽ báo lỗi biên dịch.

Cho cauVang = new DongVat(); // Lỗi biên dịch

Nếu bạn thực hiện nó bằng cách typecasting, ClassCastException sẽ bị ném khi chạy tại thời điểm run-time.

// Biên dịch thành công
// ClassCastException được ném ra lại thời điểm runtime
Cho cauVang = (Cho)new DongVat();

Nhưng nếu chúng ta sử dụng toán tử instanceof, việc thực hiện downcasting là có thể.

Ví dụ downcasting với toán tử instanceof trong Java

Hãy xem ví dụ sau để thấy các thực hiện downcasting với toán tử instanceof.

class DongVat { }  
  
class Cho extends DongVat {  
  static void method(DongVat cauVang) {  
    if(cauVang instanceof Cho){
      
      // Downcasting
      Cho c = (Cho)cauVang;
      System.out.println("Thực hiện downcasting thành công!");  
    }  
  }  
   
  public static void main (String [] args) {  
    DongVat cauVang = new Cho();  
    Cho.method(cauVang);
  }
}

Kết quả khi cạy chương trình:

Thực hiện downcasting thành công!

Ví dụ downcasting không có toán tử instanceof trong Java

Downcasting cũng có thể được thực hiện mà không cần sử dụng toán tử instanceof như ví dụ sau:

class DongVat { }  
class Cho extends DongVat {  
  static void method(DongVat cauVang) {

    // Thực hiện downcasting không có instanceof
    Cho c = (Cho)cauVang;  
    System.out.println("Thực hiện downcasting thành công!");  
  }  
  public static void main (String [] args) {  
    DongVat cauVang = new Cho();
    Cho.method(cauVang);
  }  
}

Kết quả khi cạy chương trình:

Thực hiện downcasting thành công!

Chúng ta hãy xem xét kỹ hơn về thực hiện downcasting mà không có instanof

  • Đối tượng thực tế được gọi là cauVang là một đối tượng của lớp Cho.
  • Vì vậy, nếu chúng ta downcast nó, OK

Nhưng điều gì sẽ xảy ra nếu chúng ta viết như thế này?

DongVat cauVang = new DongVat();  
Cho.method(cauVang);

ClassCastException sẽ bị ném ra tại thời điểm runtime. Nhưng nếu sử dụng instanceof thì không vấn đề gì.

Ví dụ sử dụng toán tử instanceof trong thực tế lập trình Java

Hãy xem việc sử dụng toán tử instanceof trong thực tế bằng ví dụ bên dưới đây:

interface InPhuongThuc{}  
class A implements InPhuongThuc{  
  public void phuongThucA(){
    System.out.println("Phương thức A");}  
} 
class B implements InPhuongThuc{  
  public void phuongThucB(){
    System.out.println("Phương thức B");}  
}  

class GoiPhuongThuc{  
  void goiPhuongThuc(InPhuongThuc inPhuongThuc){ // upcasting  
    if(inPhuongThuc instanceof A){
      A a = (A)inPhuongThuc; // Downcasting   
      a.phuongThucA();  
    }  
    if(inPhuongThuc instanceof B){  
      B b = (B)inPhuongThuc; // Downcasting
      b.phuongThucB();
    } 
  }
} // Kết thúc class GoiPhuongThuc
  
class Main{  
  public static void main(String args[]){  
    InPhuongThuc inPhuongThuc = new B();
    GoiPhuongThuc goi = new GoiPhuongThuc();
    goi.goiPhuongThuc(inPhuongThuc);
  }  
}  

Khi chạy chương trình, kết quả nhận được là:

Phương thức B

Như bạn thấy, để gọi được đúng phương thức, chúng ta phải có đúng đối tượng.

Do đó, khi thực hiện goi.goiPhuongThuc(ip). Chúng ta phải kiểm tra xem ip là kiểu của class nào.

Thực hiện upcasting để sử dụng làm tham chiếu kiểm tra.

Nếu kiểm tra thấy đúng là thể hiện của class nào thì thực hiện downcasting để gọi được phương thức tương ứng với class đó.

Bạn đã hiểu về instanceof trong Java chưa?

Trên đây là một vài ví dụ đơn giản để bạn hiểu hơn về toán tử instanceof trong Java. Cũng như cách sử dụng instanceof trong thực tế như thế nào.

Chúc bạn Tự học Java tốt.

JAVADEV

Bài viết gần đây

Tìm hiểu về instanceof trong JAVA

Một vài ví dụ đơn giản để bạn hiểu hơn về toán tử instanceof trong Java. Cũng như cách sử dụng instanceof trong thực tế như thế nào.

Static Binding và Dynamic Binding trong Java

Bạn đang tìm hiểu về Binding trong Java? Về cơ bản, việc kết nối một cuộc gọi phương thức...

Tìm hiểu về Đa hình trong JAVA

Đa hình (Polymorphism) trong Java là một khái niệm để chỉ những hành động có thể thực hiện theo nhiều cách khác nhau.

Từ khóa FINAL trong JAVA

Từ khóa final có thể được áp dụng với các biến, một biến final không có giá trị, nó được gọi là biến final trống hoặc biến cuối cùng chưa được khởi tạo.

Khối Khởi tạo thể hiện trong JAVA

Khối khởi tạo thể hiện được sử dụng để khởi tạo các biến thể hiện. Nó chạy mỗi lần khi đối tượng của lớp được tạo.

Ví dụ sử dụng từ khóa Super trong JAVA

Để hiểu cụ thể từ khóa super trong Java làm việc như thế nào, chúng ta cùng đi qua các ví dụ bên dưới đây:

Leave a reply

Please enter your comment!
Please enter your name here