Trong bài viết này, bạn sẽ tìm hiểu về toán tử instanceof Java một cách chi tiết với sự trợ giúp của các ví dụ.

Trong Java, từ khóa instanceof là một toán tử nhị phân. Nó được sử dụng để kiểm tra xem một đối tượng có phải là một instance của một class cụ thể hay không.

Toán tử cũng kiểm tra xem một đối tượng có phải là một instance của một class thực hiện một giao diện(interface) hay không (sẽ được thảo luận sau trong bài hướng dẫn này).

Cú pháp của toán tử instanceof là:

result = objectName instanceof className;

Toán hạng bên trái của toán tử instanceof là tên đối tượng và toán hạng bên phải là tên class. Kết quả sẽ true nếu một đối tượng là một instance của một class và sẽ là false nếu nó không phải.

1. Ví dụ 1: Toán tử instanceof

/**
* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: cafedevn@gmail.com
* Fanpage: https://www.facebook.com/cafedevn
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

class Main {
    public static void main (String[] args) {
        String name = "Programiz";
        Integer age = 22;

        System.out.println("Is name an instance of String: "+ (name instanceof String));
        System.out.println("Is age an instance of Integer: "+ (age instanceof Integer));
    }
}

Khi chúng ta chạy chương trình, kết quả sẽ là:

Is name an instance of String: true
Is age an instance of Integer: true

Trong ví dụ trên, chúng ta đã tạo đối tượng name của kiểu String và một đối tượng khác là age của kiểu Integer. Sau đó, chúng ta đã sử dụng toán tử instanceof để kiểm tra xem liệu rằng đối tượng name có thuộc kiểu String và đối tượng age có thuộc kiểu Integer hay không.

Sử dụng toán tử instanceof trong tính kế thừa

Vơi tính thừa kế, toán tử instanceof được sử dụng để kiểm tra xem liệu rằng một đối tượng của subclass có phải cũng là một toán tử instanceof của siêu class hay là không.

2. Ví dụ 2: Instanceof trong kế thừa

/**
* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: cafedevn@gmail.com
* Fanpage: https://www.facebook.com/cafedevn
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

class Animal {
}

// Dog class is a subclass of Animal
class Dog extends Animal {
}

class Main {
    public static void main(String[] args){
        Dog d1 = new Dog();

        // checks if d1 is an object of Dog
        System.out.println("Is d1 an instance of Dog: "+ (d1 instanceof Dog));
       
        // checks if d1 is an object of Animal
        System.out.println("Is d1 an instance of Animal: "+ (d1 instanceof Animal));
    }
}

Khi chúng ta chạy chương trình, kết quả sẽ là:

Is d1 is an instance of Dog: true
Is d1 an instance of Animal: true

Trong ví dụ trên, d1 là một instance của cả class Dog và Animal. Do đó, cả d1 instanceof Dog và d1 instanceof Animal trả về kết quả là true .

3. Class object   

Trong Java, tất cả các class được kế thừa từ class Object. Từ khóa extends không được sử dụng trong quá trình kế thừa của class Object. Đây là một ngoại lệ trong Java.

4. Ví dụ 3: Class object

/**
* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: cafedevn@gmail.com
* Fanpage: https://www.facebook.com/cafedevn
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

class Animal {
}

class Dog {
}

class Cat {
}
class Main {
    public static void main(String[] args) {
        Dog d1 = new Dog();
        Animal a1 = new Animal();
        Cat c1 = new Cat();

        System.out.println("Is d1 an instance of the Object class: "+ (d1 instanceof Object));
        System.out.println("Is a1 an instance of the Object class: "+ (a1 instanceof Object));
   
        System.out.println("Is c1 an instance of the Object class: "+ (c1 instanceof Object));
    }
}

Khi chúng ta chạy chương trình, kết quả sẽ là:

Is d1 an instance of the Object class: true
Is a1 an instance of the Object class: true
Is c1 an instance of the Object class: true

Trong ví dụ trên, chúng ta đã tạo các đối tượng a1, d1, và c1 của các class Animal, Dog, và Cat tương ứng. Chúng ta đã sử dụng toán tử instanceof để kiểm tra xem liệu các đối tượng a1, d1, và c1 này có phải là các đối tượng của class Object hay không . Kết quả sẽ trả về true cho tất cả các trường hợp trên.

Điều này là do class Object là class gốc được định nghĩa trong gói java.lang. Tất cả các class khác là các subclass của class Object tạo thành một hệ thống phân cấp trong Java.

5. Cơ chế upcasting và downcasting đối tượng

Trong Java, một đối tượng của một subclass có thể được coi là một đối tượng của superclass. Điều này được gọi là upcasting.

Trình biên dịch Java sẽ tự động thực hiện upcasting.

6. Ví dụ 4: Cơ chế upcasting đối tượng

class Animal {
    public void displayInfo() {
        System.out.println("I am an animal.");
    }
}

class Dog extends Animal {
}

class Main {
    public static void main(String[] args) {
        Dog d1 = new Dog();
        Animal a1 = d1;
        a1.displayInfo();
    }
}

Khi bạn chạy chương trình, kết quả sẽ là:

I am an animal.

Trong ví dụ trên, chúng ta đã tạo một đối tượng d1 của class Dog. Chúng ta sử dụng đối tượng d1 đó để tạo một đối tượng a1 của class Animal bằng cơ chế upcasting.

Code sẽ thực thi mà không gặp bất kỳ vấn đề gì. Điều này là do các trình biên dịch Java tự động thực hiện upcasing.

7. Downcasting là một cơ chế đảo ngược lại của upcasting.

Với downcasting, một đối tượng của superclass được coi là một đối tượng của subclass. Chúng ta cần phải hướng dẫn rõ ràng trình biên dịch để thực hiện downcast trong Java.

8. Ví dụ 5: Vấn đề về downcasting đối tượng

class Animal {
}

class Dog extends Animal {
   public void displayInfo() {
       System.out.println("I am a dog.");
   }
}

class Main {
   public static void main(String[] args) {
       Animal a1 = new Animal();
       Dog d1 = (Dog)a1; // Downcasting
 
       d1.displayInfo();
   }
}

Khi chúng ta chạy chương trình, chúng ta sẽ có ngoại lệ ở ClassCastException. Hãy xem điều gì sẽ xảy ra ở đây.

Ở đây, chúng ta đã tạo ra một đối tượng a1 của superclass Animal. Sau đó chúng ta đã cố gắng truyền đối tượng a1 tới đối tượng d1 của subclass Dog.

Điều này gây ra vấn đề bởi vì đối tượng a1 của superclass Animal cũng có thể chỉ các subclass khác. Nếu chúng ta tạo ra một subclass khác như  Cat cùng với class Dog; class Animal có thể là Cat hoặc có thể là Dog, do đó sẽ gây ra sự lẫn lộn, không rõ ràng.

Để giải quyết vấn đề này, chúng ta có thể sử dụng toán tử instanceof. Và đây là cách thực hiện:

9. Ví dụ 6: Giải quyết Downcasting bằng việc sử dụng toán tử instanceof


/**
* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: cafedevn@gmail.com
* Fanpage: https://www.facebook.com/cafedevn
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

class Animal {
}

class Dog extends Animal {
  public void displayInfo() {
     System.out.println("I am a dog");
  }
}

class Main {
  public static void main(String[] args) {
    Dog d1 = new Dog();
    Animal a1 = d1;    // Upcasting

    if (a1 instanceof Dog){
       Dog d2 = (Dog)a1;    // Downcasting
       d2.displayInfo();
    }
  }
}

Khi chạy chương trình này, kết quả sẽ là:

I am a dog

Trong ví dụ trên, chúng ta sử dụng toán tử instanceof để kiểm tra xem đối tượng a1 có phải là một instance của class Dog hay không. Việc downcasting chỉ được thực hiện khi biểu thức a1 instanceof Dog là true.

10. Toán tử instanceof trong Interface

Toán tử instanceof cũng được sử dụng để kiểm tra xem một đối tượng của một class cũng là một instance của interface mà từ đó class thực hiện hay là không.

11. Ví dụ 7: Toán tử instanceof trong Interface

interface Animal {
}

class Dog implements Animal {
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      System.out.println("Is d1 an instance of Animal: "+(d1 instanceof Animal));
   }
}

Khi chúng ta chạy chương trình, kết quả sẽ là:

Is d1 an instance of Animal: true

Trong ví dụ trên, chúng ta đã tạo ra một class Dog thực hiện interface Animal.

Sau đó, đối tượng d1 của class Dog được tạo. Chúng ta đã sử dụng toán tử instanceof để kiểm tra xem đối tượng d1 cũng là một instance của interface Animal

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!