Toán tử instanceof trong java được sử dụng để kiểm tra một object có phải là thể hiện của một kiểu dữ liệu cụ thể không (class, subclass, interface).
class Parent { } class Child extends Parent { } class Test { public static void main(String[] args) { Child cobj = new Child(); // A simple case if (cobj instanceof Child) System.out.println("cobj is instance of Child"); else System.out.println("cobj is NOT instance of Child"); // instanceof returns true for Parent class also if (cobj instanceof Parent) System.out.println("cobj is instance of Parent"); else System.out.println("cobj is NOT instance of Parent"); // instanceof returns true for all ancestors (Note : Object // is ancestor of all classes in Java) if (cobj instanceof Object) System.out.println("cobj is instance of Object"); else System.out.println("cobj is NOT instance of Object"); } }
Output
cobj is instance of Child
cobj is instance of Parent
cobj is instance of Object
instanceof null
class Parent { } class Child extends Parent { } class Test { public static void main(String[] args) { Parent pobj = new Parent(); if (pobj instanceof Child) System.out.println("pobj is instance of Child"); else System.out.println("pobj is NOT instance of Child"); } }
Output: pobj is NOT instance of Child
Instanceof với Upcasting
Một biến kiểu dữ liệu supperclass có thể tham chiếu đến một subclass object, trong trường hợp này java sẽ upcasting từ kiểu dữ liệu subclass lên supperclass, chúng ta không cần ép kiểu tường minh cho chúng.
class Parent { } class Child extends Parent { } class Test { public static void main(String[] args) { // Reference is Parent type but object is // of child type. Parent cobj = new Child(); if (cobj instanceof Child) System.out.println("cobj is instance of Child"); else System.out.println("cobj is NOT instance of Child"); } }
Output: cobj is an instance of Child
Instanceof với Downcasting
Để tránh exception chúng ta cần sử dụng instanceof để kiểm tra trước thi downcasting.
Note: Sử dụng downcasting khi chúng ta cần sử dụng các tính chất riêng của subclass mà ở supperclass không có.
class Parent { } class Child extends Parent { public void childMethod() { System.out.println("From child"); } } class Child2 extends Parent {} class Test { public static void main(String[] args) { test(new Child()); test(new Child2()); } public static void test(Parent parent) { if (parent instanceof Child) { System.out.println("OK"); ((Child) parent).childMethod(); } else { System.out.println("NO"); } } }
Output:
OK
From child
NO
Tài liệu tham khảo
https://www.javatpoint.com/downcasting-with-instanceof-operator
https://www.geeksforgeeks.org/java-instanceof-and-its-applications/